本案例包含用户登录,用户的增删改查功能。
使用到的技术栈: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>
密 码:<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;
}
{萌新出道,如有错误,还请指正!!!}