1. JDBC数据库连接的实现逻辑与步骤以及JDBC连接配置(单列模式)
public class JDBCUtil {
// 这些换成自己的数据库
private static final String DB_URL = "jdbc:mysql://localhost:3306/你的数据库名称";
private static final String USER = "username";
private static final String PASS = "password";
// 创建单例示例 :connection
private static Connection connection = null;
// 私有构造函数防止类被实例化 就是new 一个JDBCUtil 的对象
private JDBCUtil() {}
// 提供一个静态方法 可以通过这个方法获取一个connection
public static Connection getConnection() throws SQLException {
if (connection == null) {
synchronized (JDBCUtil.class) { //这里的synchronized同步块 就是保证同一时间只有一个线程进去获得一个连接
if (connection == null) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(DB_URL, USER, PASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new SQLException("错啦 加载不了驱动"); //抛出一个错 提示一哈 包严谨的
}
}
}
}
return connection;
}
// 关闭connection 的方法
public static void closeConnection() {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
connection = null;Serializable
}
}
}
}
2.JavaBean规范以及创建
2.1 ------ JavaBean 规范
-
公共无参构造方法:JavaBean 必须有一个公共的无参数构造方法。
-
私有属性:所有属性(字段)应该是私有的,以保持封装性。
-
公有的 getter 和 setter 方法:每个属性都有对应的公共访问器(getter)和设置器(setter)方法,以便外界访问和修改。
-
可序列化:通常,JavaBean 实现了
java.io.Serializable
接口,允许它们被序列化(这不是强制要求,但在许多情况下是推荐的)。
2.2 ----- 直接上代码
-
Serializable
这个序列化可以不加 期末不用
public class Person {
// 私有属性
private String name;
private int age;
// 公共的无参构造方法
public Person() {
}
// 公共的有参构造方法(非必须,但常见)
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 方法
public String getName() {
return name;
}
// Setter 方法
public void setName(String name) {
this.name = name;
}
// Getter 方法
public int getAge() {
return age;
}
// Setter 方法
public void setAge(int age) {
this.age = age;
}
// 可以选择性地覆盖 toString 方法
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
3.根据Model层原理,完成对User表的增删改查方法实现-UserService(userDao)
-
下面就是 UserDao 的代码
public class UserDao {
//根据用户名和密码查询数据
public boolean queryByUsernameAndPassword(String username,String password){
//1、获取数据库连接
Connection conn = null;
//2、查询数据库
String sql = "select * from bookdb.usertb where username=? and password=?";
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCConnector.getInstance().getOneCon();
ps = conn.prepareStatement(sql);
ps.setString(1,username);
ps.setString(2,password);
rs = ps.executeQuery();
if (rs.next()){
return true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBHandle.closeDB(conn,ps,rs);
}
return false;
}
/**
* 根据 username 进行更新操作
* @param newUserName 新用户名
* @param newPassword 新密码
* @param oldUserName 待修改的用户
* @return
*/
public boolean queryById(String newUserName,String newPassword ,String oldUserName){
//1、获取数据库连接
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//2、获取单例
conn = JDBCConnector.getInstance().getOneCon();
//3、sql语句
String sql = "update bookdb.usertb set username=? ,password=? where username=?"; //写之前最好去数据库试一试不容易错
ps = conn.prepareStatement(sql);
ps.setString(1,newUserName);
ps.setString(2,newPassword);
ps.setString(3,oldUserName);
int res = ps.executeUpdate();
if (res > 0){
return true; //有记录则表明被更新了
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
//4、老样子 关闭练级
DBHandle.closeDB(conn,ps,rs);
}
return false;
}
/**
* 新增 user
* @param user 待插的对象
* @return true 新增成功 否则反之
*/
public boolean insertUser(User user){
//1、获取数据库连接
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//2、获取单例
conn = JDBCConnector.getInstance().getOneCon();
//3、sql语句
String sql = "insert into bookdb.usertb (username, password) values (?,?)"; //写之前最好去数据库试一试不容易错
ps = conn.prepareStatement(sql);
ps.setString(1,user.getUsername()); //这里获取传过来的用户名和密码
ps.setString(2,user.getPassword());
int res = ps.executeUpdate();
if (res > 0){
return true;
}
//是不是修改几乎一模一样
} catch (SQLException e) {
e.printStackTrace();
}finally {
//4、老样子 关闭练级
DBHandle.closeDB(conn,ps,rs);
}
return false; //最后别忘了返回错误的情况哦
}
/**
* 删除操作
* @param username 待删除的用户名
* @return
*/
public boolean deleteUser(String username){
//1、获取数据库连接
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//2、获取单例
conn = JDBCConnector.getInstance().getOneCon();
//3、sql语句
String sql = "delete from usertb where username=?;"; //写之前最好去数据库试一试不容易错
ps = conn.prepareStatement(sql);
ps.setString(1,username); //这里获取传过来的用户名和密码
int res = ps.executeUpdate();
if (res > 0){
return true;
}
//是不是和上面几乎一模一样
} catch (SQLException e) {
e.printStackTrace();
}finally {
//4、老样子 关闭练级
DBHandle.closeDB(conn,ps,rs);
}
return false; //最后别忘了返回错误的情况哦
}
}
-
差不多就是上面的增删改查 可以根据需要自行修改
4.Json数据格式
{
"username":"wdc",
"password":"123"
}
5 . JSP知识应用以及文件上传功能实现
-
然后在contorller 层创建一个UploadController
package com.controller;
import com.util.UploadUtil;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/uploadServlet")
@MultipartConfig(maxFileSize = 10 * 1024 * 1024)
public class UploadController extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应的内容类型
resp.setContentType("text/html;charset=utf-8");
//取得输出对象
PrintWriter out = resp.getWriter();
req.setCharacterEncoding("utf-8");
//获得part 对象
Part part = req.getPart("resPath");
//指定上传的文件保存到服务器的 uploadFiles 目录中
File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
if (!uploadFileDir.exists()) {
uploadFileDir.mkdirs();
}
//获取原始文件名
String oldName = UploadUtil.getFileName(part);
out.println("上传的原始文件名:" + oldName + "<br>");
out.println("上传文件的大小 :" + part.getSize() + "<br>");
if (oldName != null) {
//上传到服务器的 uploadFiles 目录中
part.write(uploadFileDir + File.separator + oldName);
}
out.println("上传文件到:"+uploadFileDir + File.separator + oldName + "<br>");
}
}
-
然后运行项目 注意jsp 的访问路径
- 选择你要上传的文件 点击提交后 就上传到了
这里
- 欧克 完美 下一个
- 多文件上传也要掌握,书上208 一样的实现。**干**就完了
# 6.前后端分离技术,根据前端代码StuClient的接口请求,补充完成服务器接口:查看前端网络请求接口,配置正确的映射地址;实现用户注册接口编写,实现真正的数据入库操作-servlet编写。
- 这部分只需要根据前端的在controller 层写接口
- 就直接给代码了
- BookByPageController 接口
package com.controller;
import com.dao.BookDao;
import com.entity.Book;
import org.json.JSONStringer;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/books/showBooksByPage")
public class BookByPageController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BookDao bookDao = new BookDao();
int currentPage = Integer.parseInt(req.getParameter("currentPage"));
int pageSize = Integer.parseInt(req.getParameter("pageSize"));
List<Book> books = bookDao.queryBookByPage(currentPage, pageSize);
resp.getWriter().println(JSONStringer.valueToString(books));
}
}
-
UserLoginController 接口
package com.controller;
import com.dao.BookDao;
import com.dao.UserDao;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/user/login")
public class UserLoginController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
UserDao dao = new UserDao();
if (dao.queryByUsernameAndPassword(username, password)) {
resp.getWriter().println(true);
} else resp.getWriter().println(false);
}
}
-
ok 了家人们,可莫 干就完了