IT评测·应用市场-qidao123.com
标题:
JSP+Servlet实现对数据库增编削查之进阶mvc架构
[打印本页]
作者:
盛世宏图
时间:
17 小时前
标题:
JSP+Servlet实现对数据库增编削查之进阶mvc架构
1.Bean层
(Model层)
脚色
:就像餐厅里的“菜品”。
功能
:是纯数据对象(如Person类),封装属性和 getter/setter(比方用户名、密码)。
示例
:
Person类
package com.bean;
public class Person {
private int id;
private String name;
private String pwd;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
复制代码
2.Dao层
(Data Access Object)
脚色
:后厨的“厨师”,专注做菜(操纵数据)。
功能
:直接和数据库对话,实行增编削查(CRUD)。
示例
:UserDAO 类中的 saveUser(User user) 方法,负责把用户数据存入数据库。
接口
package com.dao;
import com.bean.Person;
import java.sql.SQLException;
import java.util.List;
public interface PersonDao {
public List<Person> queryAll() throws SQLException;
public Boolean selectOne(Person person) throws SQLException;
public int save(Person person) throws SQLException;
}
复制代码
实现接口
package com.dao.impl;
import com.bean.Person;
import com.dao.PersonDao;
import com.db.DB;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class PersonDaoImpl implements PersonDao {
// ------------------------- 方法1:查询所有用户 -------------------------
@Override
public List<Person> queryAll() throws SQLException {
Connection connection=new DB().getConnection(); //获取数据库连接
Statement statement= connection.createStatement(); //创建SQL执行器
ResultSet resultSet= statement.executeQuery("select * from person"); //执行查询SQL语句
List list=new ArrayList(); //准备空集合装数据
while (resultSet.next()){ //遍历查询结果(一行一行读)
Person p=new Person(); //新建数据盒子
p.setId(resultSet.getInt(1)); //取第一列(id)放入盒子
p.setName(resultSet.getString(2)); //取第二列(name)放入
p.setPwd(resultSet.getString(3)); //取第三列(pwd)放入
list.add(p); //把盒子加入集合
}
resultSet.close();
statement.close();
connection.close();
return list;
}
// ------------------------- 方法2:检查用户名是否存在 -------------------------
@Override
public Boolean selectOne(Person person) throws SQLException {
//Connection connection=new DB().getConnection(); getConnection()为静态方法就可以之间如下:
Connection connection= DB.getConnection(); //获取一个数据库连接
PreparedStatement statement= connection.prepareStatement("select * from person where name=?");
statement.setString(1,person.getName()); //设置参数(替换第一个问号)
ResultSet resultSet= statement.executeQuery(); //执行查询
if (resultSet.next()){
return false;
}else {
return true;
}
}
// ------------------------- 方法3:保存用户 -------------------------
@Override
public int save(Person person) throws SQLException {
Connection connection= DB.getConnection();
// 预编译SQL(提高性能,防止注入)
PreparedStatement statement= connection.prepareStatement("insert into person(name,pwd) values(?,?)");
statement.setString(1,person.getName()); //设置第一个参数(name)
statement.setString(2,person.getPwd()); //设置第二个参数(pwd)
int i= statement.executeUpdate(); //执行插入操作
statement.close();
connection.close();
return i; //返回影响的行数(1=成功,0=失败)
}
}
复制代码
3.DB(驱动连接数据库)
脚色
:餐厅的“仓库”,存储所有食材。
功能
:持久化生存数据(如 MySQL、PostgreSQL)
package com.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DB {
public static Connection getConnection(){
Connection connection=null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
复制代码
4.Service层
脚色
:餐厅的“经理”,和谐复杂流程。
功能
:处理业务逻辑(比方注册时检查用户名是否重复 + 加密密码)。
示例
:UserService 的 registerUser() 方法会调用 DAO 的多个操纵,并处理事件。
接口
package com.service;
import com.bean.Person;
import java.sql.SQLException;
import java.util.List;
public interface PersonSercie {
public List<Person> AllPerson() throws SQLException;
public boolean register(Person person) throws SQLException;
}
复制代码
实现接口
package com.service.impl;
import com.bean.Person;
import com.dao.PersonDao;
import com.dao.impl.PersonDaoImpl;
import com.service.PersonSercie;
import java.sql.SQLException;
import java.util.List;
public class PersonServiceImpl implements PersonSercie {
@Override
public List<Person> AllPerson() throws SQLException {
PersonDao dao=new PersonDaoImpl(); // 1. 创建DAO对象,准备访问数据库
return dao.queryAll(); // 2. 调用DAO查询所有用户
}
@Override
public boolean register(Person person) throws SQLException {
PersonDao dao=new PersonDaoImpl();
//检查用户名是否已存在
if(dao.selectOne(person)){ //调用DAO查询是否存在同名用户
dao.save(person); //无重复 → 保存用户
return true; //返回注册成功
}else {
return false; //返回注册失败
}
}
}
复制代码
5.Servlet
(Controller层)
脚色
:餐厅的“服务员”,欢迎客人并传递需求。
功能
:接收 HTTP 请求(如 POST /login),调用 Service 处理,返反响应(跳转页面或 JSON)。
示例
:LoginServlet 获取表单参数,交给 UserService 验证登录。
删除
package com.servlet;
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.sql.*;
@WebServlet(name = "DeleteServlet",urlPatterns = "/del")
public class DeleteServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id=request.getParameter("id");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");
//Statement statement= connection.createStatement();
PreparedStatement statement= connection.prepareStatement("delete from person where id=?");
statement.setInt(1,Integer.parseInt(id));
int i=statement.executeUpdate();
if(i>0){
response.sendRedirect("listall");
}else {
response.getWriter().println("Error");
}
statement.close();
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
复制代码
查看
package com.servlet;
import com.bean.Person;
import com.service.PersonSercie;
import com.service.impl.PersonServiceImpl;
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.sql.*;
import java.util.List;
@WebServlet(name = "ListAllServlet",urlPatterns = "/listall")
public class ListAllServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PersonSercie personSercie=new PersonServiceImpl();
try {
List<Person> list=personSercie.AllPerson();
request.setAttribute("persons",list);
request.getRequestDispatcher("listall.jsp").forward(request,response);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
复制代码
增加
package com.servlet;
import com.bean.Person;
import com.service.PersonSercie;
import com.service.impl.PersonServiceImpl;
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.sql.SQLException;
@WebServlet(name = "RegServlet",urlPatterns = "/reg")
public class RegServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("uname");
String pwd=request.getParameter("upwd");
Person person=new Person();
person.setName(name);
person.setPwd(pwd);
//调用模型中注册业务逻辑实现
PersonSercie personSercie = new PersonServiceImpl(); // 创建服务层对象(业务逻辑处理者)
try {
if(personSercie.register(person)){ // 调用服务层的注册方法
response.sendRedirect("login.jsp"); // 注册成功:跳转到登录页
}else {
response.sendRedirect("reg.jsp");// 注册失败:返回注册页
};
} catch (SQLException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
复制代码
改1
package com.servlet;
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.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@WebServlet(name = "UpdateDoServlet",urlPatterns = "/updateDo")
public class UpdateDoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id=request.getParameter("id");
String name=request.getParameter("username");
String pwd=request.getParameter("userpwd");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");
//Statement statement= connection.createStatement();
PreparedStatement statement= connection.prepareStatement("update person set name=?,pwd=? where id=?");
statement.setString(1,name);
statement.setString(2,pwd);
statement.setInt(3,Integer.parseInt(id));
int i=statement.executeUpdate();
if(i>0){
response.sendRedirect("listall");
}else {
response.getWriter().println("Error");
}
statement.close();
connection.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
复制代码
改2
package com.servlet;
import com.bean.Person;
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.sql.*;
@WebServlet(name = "UpdateServlet",urlPatterns = "/update")
public class UpdateServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id=request.getParameter("id");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/users?serverTimezone=GMT%2B8","root","123456");
PreparedStatement statement= connection.prepareStatement("select * from person where id=?");
statement.setInt(1,Integer.parseInt(id));
ResultSet resultSet=statement.executeQuery();
Person p=new Person();
if (resultSet.next()){
p.setId(resultSet.getInt(1));
p.setName(resultSet.getString(2));
p.setPwd(resultSet.getString(3));
}
request.setAttribute("user",p);
resultSet.close();
statement.close();
connection.close();
request.getRequestDispatcher("update.jsp").forward(request,response);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
复制代码
总结
大概流程:就像网购流程:JSP→ 你下单(Servlet收件)→ 调度中心检查(Service处理)→ 仓库存取(DAO操纵→仓库DB)→ 终极收到包裹(响应结果)
用户填写表单
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4