需求:
使用Selvert和四层结构知识,完成用户信息的增删改查操作的信息管理系统,使其具有更好的软件结构,以及提升可读性和可扩展性。(jsp-servlet-service-dao)
![](https://img-blog.csdnimg.cn/img_convert/4b95749ac2bdc321f50568e185c66109.png)
目录结构:
![](https://img-blog.csdnimg.cn/img_convert/ef0f18bae027c89f653dd6fb79984fde.png)
![](https://img-blog.csdnimg.cn/img_convert/eddfbed5ec89f9c6c28784522e77917c.png)
登录
(1)LoginServlet的doPost方法
package com.huanxiao.servlet;
import com.huanxiao.bean.User;
import com.huanxiao.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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/dl")
public class Login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Login...Get");
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这三个都是获取请求的地址相关
// String uri=request.getRequestURI();
// String contextPath = request.getContextPath();
// String servletPath = request.getServletPath();
//
// System.out.println(uri);//包含项目名和资源名
// System.out.println(contextPath);//项目名称
// System.out.println(servletPath);//请求的资源路径
//1:从请求中获取用户提交写参数(数据)
request.setCharacterEncoding("utf-8");//设置请求的编码格式为中文
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
// System.out.println(username);
// System.out.println(password);
UserDao userDao=new UserDao();
User login = userDao.login(username, password);
if(login!=null){
request.getRequestDispatcher("selectAllGoods").forward(request,response);
}else{
request.setAttribute("error_msg","用户名或密码错误");
request.getRequestDispatcher("erroir.jsp").forward(request,response);
}
}
}
(2)Dao层用户登录校验
package com.huanxiao.dao;
import com.huanxiao.bean.User;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDao {
private static String jdbcDirver="com.mysql.cj.jdbc.Driver";
private static String jdbcUrl="jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
private static String jdbcUsername="root";
private static String jdbcPassword="123456";
Connection connection=null;
PreparedStatement pstm=null;
ResultSet rs=null;
User login=null;
int row=0;
public User login(String username, String password){
try {
Class.forName(jdbcDirver);
connection= DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword);
String sql="select * from t_user where username=? and password=?";
pstm=connection.prepareStatement(sql);
pstm.setObject(1,username);
pstm.setObject(2,password);
rs=pstm.executeQuery();
if(rs.next()){
login=new User();
login.setUsername(rs.getString("username"));
login.setPassword(rs.getString("password"));
login.setPhone(rs.getString("phone"));
login.setAddress(rs.getString("address"));
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(rs!=null){
rs.close();
}
if(pstm!=null){
pstm.close();
}
if(connection!=null){
connection.close();
}
}catch (Exception e){
e.printStackTrace();
}
return login;
}
注册
(1)registServlet的doPost方法
package com.huanxiao.servlet;
import com.huanxiao.bean.User;
import com.huanxiao.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("/zhuce")
public class Rsgister extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("type/html;charset=utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String phone = request.getParameter("phone");
String address = request.getParameter("address");
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setPhone(phone);
user.setAddress(address);
UserDao userDao = new UserDao();
int row = userDao.zhuce(user);
if (row >0) {
response.sendRedirect("login.jsp");
} else {
response.sendRedirect("erroir.jsp");
}
}
}
(2)注册功能的dao层代码
public int zhuce(User user){
try {
Class.forName(jdbcDirver);
connection= DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword);
String sql="insert into t_user(username,password,phone,address) values(?,?,?,?)";
pstm= connection.prepareStatement(sql);
pstm.setObject(1,user.getUsername());
pstm.setObject(2,user.getPassword());
pstm.setObject(3,user.getPhone());
pstm.setObject(4,user.getAddress());
row= pstm.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if(rs!=null){
rs.close();
}
if(pstm!=null){
pstm.close();
}
if(connection!=null){
connection.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
return row;
}
(3)进行删除时验证用户身份js方法
<%--
Created by IntelliJ IDEA.
User: 大大怪将军
Date: 2023/2/25
Time: 13:51
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title></title>
</head>
<body>
<h2>欢迎来自${user.address}的${user.username}访问项目主页</h2>
<a href="addgoods.jsp">添加商品</a>
<table>
<thead>
<tr>
<td>商品编号</td>
<td>商品名称</td>
<td>商品价格</td>
<td>商品说明</td>
</tr>
</thead>
<tbody id="list">
<%-- ${goods}--%>
<!--items: 要遍历的集合对象(写EL表达式) var:集合中对应临时对象---->
<c:forEach items="${goods}" var="goodslist">
<tr>
<td>${goodslist.gid}</td>
<td>${goodslist.gname}</td>
<td>${goodslist.price}</td>
<td>${goodslist.mark}</td>
<td>
<a href="update?gid=${goodslist.gid}">修改</a>
<a href="dell?gid=${goodslist.gid}">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
(4)删除用户的deleteServlet的doGet方法
public int delete(int gid) {
try {
Class.forName(jdbcDirver);
connection = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword);
String sql = "delete from t_goods where gid=?";
pstm = connection.prepareStatement(sql);
pstm.setObject(1, gid);
row = pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstm != null) {
pstm.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return row;
}
(5)更新用户信息updateServlet的doPost方法
package com.huanxiao.servlet;
import com.huanxiao.bean.Goods;
import com.huanxiao.dao.GoogsDao;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/updateGoods")
public class updateGoods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
Goods goods = new Goods();
goods.setGid(Integer.parseInt(request.getParameter("gid")));
goods.setGname(request.getParameter("gname"));
goods.setPrice(Double.parseDouble(request.getParameter("price")));
goods.setMark(request.getParameter("mark"));
System.out.println(goods);
GoogsDao googsDao1 = new GoogsDao();
int row = googsDao1.updates(goods);
if(row>0){
request.getRequestDispatcher("selectAllGoods").forward(request,response);
}else {
request.setAttribute("error_msg","修改商品信息失败");
request.getRequestDispatcher("erroir.jsp").forward(request,response);
}
}
}
(6)修改功能的dao层代码
public int updates(Goods goods){
try {
Class.forName(jdbcDirver);
connection = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword);
String sql = "update t_goods set gname=?,price=?,mark=? where gid=?";
pstm = connection.prepareStatement(sql);
pstm.setObject(1,goods.getGname());
pstm.setObject(2,goods.getPrice());
pstm.setObject(3,goods.getMark());
pstm.setObject(4,goods.getGid());
row = pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstm != null) {
pstm.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return row;
}
(7)添加功能的dao层代码
public int add(Goods goods) {
try {
Class.forName(jdbcDirver);
connection = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword);
String sql = "insert into t_goods(gname,price,mark) values(?,?,?)";
pstm = connection.prepareStatement(sql);
pstm.setObject(1, goods.getGname());
pstm.setObject(2, goods.getPrice());
pstm.setObject(3, goods.getMark());
row = pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (pstm != null) {
pstm.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return row;
}
(8)添加用户的deleteServlet的doGet方法
package com.huanxiao.servlet;
import com.huanxiao.bean.Goods;
import com.huanxiao.dao.GoogsDao;
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("/addGoods")
public class addGoods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("type/html;charset=utf-8");
Goods goods=new Goods();
goods.setGname(request.getParameter("gname"));
goods.setPrice(Double.parseDouble(request.getParameter("price")));
goods.setMark(request.getParameter("mark"));
GoogsDao googsDao=new GoogsDao();
int row=googsDao.add(goods);
if(row>0){
request.getRequestDispatcher("selectAllGoods").forward(request,response);
}else {
request.setAttribute("error_msg","添加商品信息失败");
request.getRequestDispatcher("erroir.jsp").forward(request,response);
}
}
}
(9)查询功能的dao层代码
public List<Goods> selectAll() {
List<Goods> goodsList = new ArrayList<>();
try {
Class.forName(jdbcDirver);
connection = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword);
String sql = "select * from t_goods";
pstm = connection.prepareStatement(sql);
rs = pstm.executeQuery();
while (rs.next()) {
Goods goods = new Goods();
goods.setGid(rs.getInt("gid"));
goods.setGname(rs.getString("gname"));
goods.setPrice(rs.getDouble("price"));
goods.setMark(rs.getString("mark"));
goodsList.add(goods);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (pstm != null) {
pstm.close();
}
if (connection != null) {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return goodsList;
}
(10)查询用户的deleteServlet的doGet方法
package com.huanxiao.servlet;
import com.huanxiao.bean.Goods;
import com.huanxiao.dao.GoogsDao;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
@WebServlet("/selectAllGoods")
public class SelectAllGoods extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse respone) throws ServletException, IOException {
doPost(request,respone);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse respone) throws ServletException, IOException {
//查询所有商品表的信息
GoogsDao googsDao=new GoogsDao();
List<Goods> goods = googsDao.selectAll();
System.out.println(goods);
HttpSession session = request.getSession();
session.setAttribute("goods",goods);
respone.sendRedirect("zhuye.jsp");
}
}
总结
分层编写代码。使用Dao进行与数据库的增删改查操作;Service层进行业务操作;Servlet进行处理请求。在jsp表单提交的时候调用Servlet处理请求。采用分层管理代码,将方法的定义和实现抽离。使用工具类读取配置文件的时候,要保证路径正确,不然会读取不到报错。在表单中使用post请求,则应该编写servlet中的doPost方法。采用分层方法管理代码,代码的管理起来更加方便了,可读性更高,修改更加简便