Servlet案例--用户管理

7 篇文章 0 订阅
2 篇文章 0 订阅

本案例包含用户登录,用户的增删改查功能。
使用到的技术栈:Servlet,JDBC,Servlet JSP,Servlet MVC,EL表达式,JSTL,状态保持Session、Cookie

一、前期准备

1、使用MySQL新建一个数据库,建一个user表,我们对这个user表进行增删改查操作
在这里插入图片描述

2、建立maven工程,配置Servlet,在pom.xml中导入相关依赖与jar包,配置tomcat

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.44</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <artifactId>jstl</artifactId>
        <groupId>jstl</groupId>
        <version>1.2</version>
    </dependency>

3、配置JDBC连接变量的外部文件
在这里插入图片描述
4、JDBC的工具类,来实现Java数据库连接

package util;

import org.apache.commons.dbcp.BasicDataSource;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtil {
    private static BasicDataSource bds;
    static{
        bds=new BasicDataSource();
        Properties p=new Properties();
        InputStream is=DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
        try {
            p.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        bds.setDriverClassName(p.getProperty("db.driver"));
        bds.setUrl(p.getProperty("db.url"));
        bds.setUsername(p.getProperty("db.username"));
        bds.setPassword(p.getProperty("db.password"));
        bds.setInitialSize(Integer.parseInt(p.getProperty("db.initNum")));
        bds.setMaxActive(Integer.parseInt(p.getProperty("db.maxNum")));
    }
    public static Connection getConnection(){
        Connection c=null;
        try {
            c=bds.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return c;
    }
    public static void close(Connection c){
        if(c!=null){
            try {
                c.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

5、项目实施MVC分层
在这里插入图片描述
bean包下存放用户类User
controller包负责与前端界面进行联系
service包提供功能接口
dao包负责操作数据库

分层搭建的好处:

  • 逻辑清晰,项目运行的可读性变强
  • 便于寻找代码中的bug,通过报错信息可以很快定位到有问题的代码段
  • 便于替换代码,比如controller层可以很容易的被新的controller层替换掉,且不用更改其他层的代码

6、封装类User,封装用户的基本属性

package bean;

public class User {
    private int id;
    private String name;
    private String password;
    public User(){
        
    }
    public User(int id,String name,String password){
        this.id=id;
        this.name=name;
        this.password=password;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

7、index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <h1><a href="user/getUsers">用户管理</a></h1>
  </body>
</html>

二、用户增删改查的实现

1、查询用户

controller层

package controller;

import bean.User;
import service.UserService;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class GetAllUser extends HttpServlet {
    private UserService userService;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<User> list=userService.getAllUsers();
        if(list!=null){
            request.setAttribute("users",list);
            request.getRequestDispatcher("/user/users.jsp").forward(request,response);
        }else {
            System.out.println("查询用户失败");
        }
    }
}

service层

    public List<User> getAllUsers() {
        return userDao.getAllUsers();
    }

dao层

    public List<User> getAllUsers() {
        List<User> list=new ArrayList();
        Connection connection=DBUtil.getConnection();
        String sql="select * from user";
        try {
            PreparedStatement ps=connection.prepareStatement(sql);
            ResultSet rs=ps.executeQuery();
            while(rs.next()){
                String id=rs.getString("id");
                String name=rs.getString("name");
                String password=rs.getString("password");
                User user=new User(Integer.parseInt(id),name,password);
                list.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection);
        }
        return list;
    }

users.xml

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<h2><a href="addUser.jsp">新建用户</a></h2>
<br>
<table border="1">
    <tr>
        <td>id</td>
        <td>name</td>
        <td>password</td>
        <td>操作</td>
    </tr>
    <c:forEach items="${users}" var="user">
        <tr>
            <td>${user.id}</td>
            <td>${user.name}</td>
            <td>${user.password}</td>
            <td><a href="getUser?id=${user.id}">修改</a>|<a href="deleteUser?id=${user.id}">删除</a></td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

web.xml

    <servlet>
        <servlet-name>getUsers</servlet-name>
        <servlet-class>controller.GetAllUser</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getUsers</servlet-name>
        <url-pattern>/user/getUsers</url-pattern>
    </servlet-mapping>

2、用户添加

controller层

package controller;

import bean.User;
import service.UserService;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class AddUser extends HttpServlet {
    private UserService userService=new UserService();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name=request.getParameter("name");
        String password=request.getParameter("password");
        String path=request.getContextPath();
        User user=new User();
        user.setName(name);
        user.setPassword(password);
        userService.addNewUser(user);
        response.sendRedirect(path+"/user/getUsers");
    }
}

service层

    public void addNewUser(User user) {
        userDao.addNewUser(user);
    }

dao层

    public void addNewUser(User user) {
        Connection connection=DBUtil.getConnection();
        String sql="insert into user(name,password) values(?,?)";
        PreparedStatement ps=null;
        try {
            ps=connection.prepareStatement(sql);
            ps.setString(1,user.getName());
            ps.setString(2,user.getPassword());
            ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection);
        }
    }

在users.jsp页面添加新建功能

< h2>< a href=“addUser.jsp”>新建用户< /a>< /h2>

addUser.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="addUser" method="get">
    姓名:<input type="text" name="name"><br>
    密码:<input type="text" name="password"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

web.xml

    <servlet>
        <servlet-name>addUser</servlet-name>
        <servlet-class>controller.AddUser</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>addUser</servlet-name>
        <url-pattern>/user/addUser</url-pattern>
    </servlet-mapping>

3、删除用户

controller层

package controller;

import service.UserService;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class DeleteUser extends HttpServlet {
    private UserService userService=new UserService();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id=request.getParameter("id");
        String path=request.getContextPath();
        userService.deleteUserById(Integer.parseInt(id));
        response.sendRedirect(path+"/user/getUsers");
    }
}

service层

    public void deleteUserById(int id) {
        userDao.deleteUserById(id);
    }

dao层

    public void deleteUserById(int id) {
        Connection connection=DBUtil.getConnection();
        String sql="delete from user where id=?";
        PreparedStatement ps=null;
        try {
            ps=connection.prepareStatement(sql);
            ps.setInt(1,id);
            ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection);
        }
    }

更改users.jsp页面代码,在删除按钮位置加上请求

< a href=“deleteUser?id=${user.id}”>删除< /a>

web.xml

    <servlet>
        <servlet-name>deleteUser</servlet-name>
        <servlet-class>controller.DeleteUser</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>deleteUser</servlet-name>
        <url-pattern>/user/deleteUser</url-pattern>
    </servlet-mapping>

4、修改用户

业务简述:当我们点击修改按钮后,需跳转到一个修改页面,页面上显示着我们要修改的客户的信息,在对信息进行更改后,点击提交会重新跳转的我们的用户管理界面

  • 修改用户管理界面的修改请求

< a href=“getUser?id=${user.id}”>修改< /a>

  • 获取用户信息

    controller层

package controller;

import bean.User;
import service.UserService;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class GetOneUser extends HttpServlet {
    private UserService userService=new UserService();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id=request.getParameter("id");
        User user=userService.getUserById(Integer.parseInt(id));
        request.setAttribute("user",user);
        request.getRequestDispatcher("/user/updateUser.jsp").forward(request,response);
    }
}

service层
    public User getUserById(int id) {
        return userDao.getUserById(id);
    }
dao层
    public User getUserById(int id) {
        User user=new User();
        Connection connection=DBUtil.getConnection();
        String sql="select * from user where id=?";
        PreparedStatement ps=null;
        try {
            ps=connection.prepareStatement(sql);
            ps.setInt(1,id);
            ResultSet rs=ps.executeQuery();
            while(rs.next()){
                user.setId(id);
                user.setName(rs.getString("name"));
                user.setPassword(rs.getString("password"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection);
        }
        return user;
    }
web.xml
    <servlet>
        <servlet-name>getUser</servlet-name>
        <servlet-class>controller.GetOneUser</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getUser</servlet-name>
        <url-pattern>/user/getUser</url-pattern>
    </servlet-mapping>
  • 修改用户信息界面
<%@ page import="bean.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <%User user= (User) request.getAttribute("user");%>
</head>
<body>
<form action="updateUser" method="get">
    要修改用户的id:<input type="text" name="id" readonly value="<%=user.getId()%>"><br>
    新姓名  :<input type="text" name="name" value="<%=user.getName()%>"><br>
    新密码  :<input type="text" name="password" value="<%=user.getPassword()%>"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

  • 修改用户信息
    controller层
package controller;

import bean.User;
import service.UserService;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class updateUser extends HttpServlet {
    private UserService userService=new UserService();
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id=request.getParameter("id");
        String name=request.getParameter("name");
        String password=request.getParameter("password");
        String path=request.getContextPath();
        User user=new User(Integer.parseInt(id),name,password);
        userService.updateUserById(user);
        response.sendRedirect(path+"/user/getUsers");
    }
}

service层
    public void updateUserById(User user) {
        userDao.updateUserById(user);
    }
dao层
	public void updateUserById(User user) {
        Connection connection=DBUtil.getConnection();
        String sql="update user set name=?,password=? where id=?";
        PreparedStatement ps=null;
        try {
            ps=connection.prepareStatement(sql);
            ps.setString(1,user.getName());
            ps.setString(2,user.getPassword());
            ps.setInt(3,user.getId());
            ps.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection);
        }
    }
web.xml
    <servlet>
        <servlet-name>updateUser</servlet-name>
        <servlet-class>controller.updateUser</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>updateUser</servlet-name>
        <url-pattern>/user/updateUser</url-pattern>
    </servlet-mapping>

三、用户登录

业务逻辑:只有数据库中的用户才能有增删改查用户的权限,在进入用户管理界面前需要进行登录状态的验证,当处于已登录状态时,可以正常进入用户管理界面;未处于已登录状态时,需要跳转到登录窗口进行登录,在相应位置填好用户信息后点击登录按钮,将用户信息发送到后台,与数据库中用户信息进行比较,若能匹配上,设置Session,跳转回第一个界面,点击用户管理再次进行登录状态的验证;若匹配不上,返回登陆界面,提示用户名或密码错误。
在这里插入图片描述

验证登录

  • 请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <h1><a href="user/ifLogin">用户管理</a></h1>
  </body>
</html>
  • web.xml
    <servlet>
        <servlet-name>ifLogin</servlet-name>
        <servlet-class>controller.IfLogin</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ifLogin</servlet-name>
        <url-pattern>/user/ifLogin</url-pattern>
    </servlet-mapping>
  • controller层
package controller;

import bean.User;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class IfLogin extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session=request.getSession();
        User user= (User) session.getAttribute("user");
        String path=request.getContextPath();
        if(user==null){
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }else {
            response.sendRedirect(path+"/user/getUsers");
        }
    }
}

实现登录

  • 登录界面
<%@ page import="java.net.URLDecoder" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <%
        Cookie[] cookies=request.getCookies();
        for(Cookie cookie:cookies){
            if("name".equals(cookie.getName())){
                request.setAttribute("name", URLDecoder.decode(cookie.getValue(),"utf-8"));
            }
        }
    %>
</head>
<body>
${message}
<form action="login" method="get">
    用户名:<input type="text" name="name" value="${name}"><br>&nbsp;&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"><br>
    记住用户名<input type="checkbox" name="memory" value="1"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

  • web.xml
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>controller.Login</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/user/login</url-pattern>
    </servlet-mapping>
  • controller层
package controller;

import bean.User;
import service.UserService;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.net.URLEncoder;

public class Login extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name=request.getParameter("name");
        String password=request.getParameter("password");
        int memory=Integer.parseInt(request.getParameter("memory"));
        HttpSession session=request.getSession();
        UserService userService=new UserService();
        User user=userService.findUserByNameAndPassword(name,password);
        if(memory==1){
            Cookie cookie=new Cookie("name", URLEncoder.encode(name,"utf-8"));
            cookie.setMaxAge(60*60);
            response.addCookie(cookie);//很容易忘!!!
        }
        if(user==null){
            request.setAttribute("message","用户名或密码错误");
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }else {
            System.out.println(user.toString());
            String path=request.getContextPath();
            session.setAttribute("user",user);
            response.sendRedirect(path+"/index.jsp");
        }
    }
}

  • service层
    public User findUserByNameAndPassword(String name, String password) {
        return userDao.findUserByNameAndPassword(name,password);
    }
  • dao层
    public User findUserByNameAndPassword(String name, String password) {
        User user=new User();
        Connection connection=DBUtil.getConnection();
        String sql="select * from user where name=? and password=?";
        PreparedStatement ps=null;
        try {
            ps=connection.prepareStatement(sql);
            ps.setString(1,name);
            ps.setString(2,password);
            ResultSet rs=ps.executeQuery();
            while(rs.next()){
                user.setName(rs.getString("name"));
                user.setPassword(rs.getString("password"));
                return user;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection);
        }
        return null;
    }

{萌新出道,如有错误,还请指正!!!}

对此案例进行的一点优化

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值