之前的用户管理案例的版本
servlet案例–用户管理
相比于之前的版本,这次的优化主要体现在请求路径,验证登录,controller层方面。
1、请求路径:之前发送请求基本上都是以相对路径的方式传递的请求,这次以绝对路径的方式来发送,可以更方便的从代码中看到请求的变化
2、验证登录:之前的验证登录只能在点击进入用户管理界面前进行验证,当遇到特殊情况,比如登陆状态已过时的时候,我们在点击用户的增删改查功能时,是不能进行操作的,需跳转到登陆界面,重新登陆。这次优化我们通过过滤器的方式来实现这一业务。
3、controller层:之前的版本是一个功能对应一个controller类,这次我们把所有功能都放在一个类里,这样更符合controller层–service层–dao层的规范
-
项目结构:
-
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1><a href="${path}/user/getUsers">用户管理</a></h1>
</body>
</html>
- login.jsp
<%@ 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="${path}/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>
- addUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${path}/user/addUser" method="get">
姓名:<input type="text" name="name"><br>
密码:<input type="text" name="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
- updateUser.jsp
<%@ page import="bean.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${path}/user/updateUser" method="get">
要修改用户的id:<input type="text" name="id" readonly value="${user.id}"><br>
新姓名 :<input type="text" name="name" value="${user.name}"><br>
新密码 :<input type="text" name="password" value="${user.password}"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
- users.jsp
<%@ 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="${path}/views/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="${path}/user/getUser?id=${user.id}">修改</a>|<a href="${path}/user/deleteUser?id=${user.id}">删除</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
- web.xml
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>controller.LoginController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>filter.LoginFilter</filter-class>
<!--设置初始化参数-->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!--拦截所有请求-->
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/user/*</url-pattern>
</filter-mapping>
- bean层
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 + '\'' +
'}';
}
}
- controller层
UserController:
package controller;
import bean.User;
import service.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
@WebServlet(value = {"/user/*"})
public class UserController extends HttpServlet {
private UserService userService=new UserService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url=request.getRequestURI();
String index=url.substring(url.lastIndexOf("/")+1,url.length());
String path=request.getContextPath();
if("addUser".equals(index)){
String name=request.getParameter("name");
String password=request.getParameter("password");
User user=new User();
user.setName(name);
user.setPassword(password);
userService.addNewUser(user);
response.sendRedirect(path+"/user/getUsers");
}
if("deleteUser".equals(index)){
String id=request.getParameter("id");
userService.deleteUserById(Integer.parseInt(id));
response.sendRedirect(path+"/user/getUsers");
}
if("getUsers".equals(index)){
List<User> list=userService.getAllUsers();
if(list!=null){
request.setAttribute("users",list);
request.getRequestDispatcher("/views/users.jsp").forward(request,response);
}else {
System.out.println("查询用户失败");
}
}
if("getUser".equals(index)){
String id=request.getParameter("id");
User user=userService.getUserById(Integer.parseInt(id));
request.setAttribute("user",user);
request.getRequestDispatcher("/views/updateUser.jsp").forward(request,response);
}
if("updateUser".equals(index)){
String id=request.getParameter("id");
String name=request.getParameter("name");
String password=request.getParameter("password");
User user=new User(Integer.parseInt(id),name,password);
userService.updateUserById(user);
response.sendRedirect(path+"/user/getUsers");
}
}
}
LoginController:
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 LoginController 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 {
session.setAttribute("user",user);
request.getRequestDispatcher("/index.jsp").forward(request,response);
}
}
}
- filter层
LoginFilter:
package filter;
import bean.User;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class LoginFilter implements Filter {
private String encoding;
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request= (HttpServletRequest) req;
HttpServletResponse response= (HttpServletResponse) resp;
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
HttpSession session=request.getSession();
User user= (User) session.getAttribute("user");
if(user==null){
request.setAttribute("message","请登录");
request.getRequestDispatcher("/login.jsp").forward(request,response);
}else {
chain.doFilter(request, response);
}
}
public void init(FilterConfig config) throws ServletException {
encoding=config.getInitParameter("encoding");
ServletContext context=config.getServletContext();
context.setAttribute("path",context.getContextPath());
System.out.println(encoding);
}
}
- service层
UserService:
package service;
import bean.User;
import dao.UserDao;
import java.util.List;
public class UserService {
private UserDao userDao=new UserDao();
public List<User> getAllUsers() {
return userDao.getAllUsers();
}
public void addNewUser(User user) {
userDao.addNewUser(user);
}
public void deleteUserById(int id) {
userDao.deleteUserById(id);
}
public User getUserById(int id) {
return userDao.getUserById(id);
}
public void updateUserById(User user) {
userDao.updateUserById(user);
}
public User findUserByNameAndPassword(String name, String password) {
return userDao.findUserByNameAndPassword(name,password);
}
}
- dao层
UserDao:
package dao;
import bean.User;
import util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
public List<User> getAllUsers() {
Connection connection=DBUtil.getConnection();
List<User> list=new ArrayList();
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;
}
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);
}
}
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);
}
}
public User getUserById(int id) {
Connection connection=DBUtil.getConnection();
User user=new User();
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;
}
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);
}
}
public User findUserByNameAndPassword(String name, String password) {
Connection connection=DBUtil.getConnection();
User user=new User();
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;
}
}
- util层
DBUtil:
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();
}
}
}
}
- db.properties
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/
db.username=数据库用户名
db.password=数据库密码
db.initNum=3
db.maxNum=5