二、Servlet 过滤器
1. 引入
有时候我们只希望管理员才能登录特定的 jsp 页面,最好就是在访问该页面之前对所有请求进行过滤,只有具有权限的用户才能访问,Servlet 过滤器就可以实现该功能(鉴权)。
2. Servlet 过滤器
过滤器能够对到达 Servlet 容器的请求和响应进行检查和修改,提供过滤的功能
3. 过滤器优点
(1)可以检查和修改 ServletRequest 和 ServletResponse
(2)可以指定和某个 URL 关联,只有客户端访问该 URL 时,才会触发过滤器
(3)过滤器可以被串联,形成管道,协同工作来修改请求和响应对象。
4. 过滤器工作原理图
5. 过滤器还可以串联起来
6. 自定义过滤器:需要实现 javax.servlet.Filter 接口
6.1 注解方式
UserFilter.java:
package com.edu.ctrl;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
//定义 UserFilter 要拦截的 URL 地址,这里的"/*"表示拦截所有的请求和响应,并设置了初始化参数
@WebFilter(value = "/*", initParams = {@WebInitParam(name="param", value = "UserFilter 的初始化参数")})
public class UserFilter implements Filter{
//过滤器的默认构造函数
public UserFilter() {
// TODO Auto-generated constructor stub
System.out.println("UserFilter 的默认构造函数");
}
/**
* 初始化方法,完成初始化工作,在过滤器实例创建时调用一次,config 参数和 Servlet 一样,可以读取初始化参数
*/
@Override
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("UserFilter 的 init() 方法");
String initParameter = config.getInitParameter("param");
System.out.println("初始化参数:" + initParameter);
}
/**
* 核心拦截方法,每次客户端发送请求到服务器的时候,服务器都会调用一次该方法来对原生的请求和响应对象进行检查,
* 其中参数:request:原生请求对象,response:原生的响应对象,第三个参数 FilterChain,包含一个 doFilter(),调用
* 该参数的 doFilter() 可以放行请求和响应,否则就是拦截
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("UserFilter 的 doFilter() 方法");
chain.doFilter(request, response);//放行请求和响应
}
//UserFilter 被销毁的时候调用的方法
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("UserFilter 的 destroy() 方法");
}
}
测试:
先不要请求任何资源,启动服务器即可:
服务器在启动的时候,过滤器就被实例化和初始化了。
然后我们随便访问任何一个资源:
从上面结果可知,过滤器默认情况下在服务器启动的时候就被实例化和初始化了,然后客户端每次请求的时候,过滤器的doFilter()方法都会被调用一次,通过 FilterChain 参数是否调用了 doFilter() 方法来决定是放行还拦截。
6.2 配置方式
UserFilter 删除注解配置:
package com.edu.ctrl;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
public class UserFilter implements Filter{
//过滤器的默认构造函数
public UserFilter() {
// TODO Auto-generated constructor stub
System.out.println("UserFilter 的默认构造函数");
}
/**
* 初始化方法,完成初始化工作,在过滤器实例创建时调用一次,config 参数和 Servlet 一样,可以读取初始化参数
*/
@Override
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("UserFilter 的 init() 方法");
String initParameter = config.getInitParameter("param");
System.out.println("初始化参数:" + initParameter);
}
/**
* 核心拦截方法,每次客户端发送请求到服务器的时候,服务器都会调用一次该方法来对原生的请求和响应对象进行检查,
* 其中参数:request:原生请求对象,response:原生的响应对象,第三个参数 FilterChain,包含一个 doFilter(),调用
* 该参数的 doFilter() 可以放行请求和响应,否则就是拦截
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
System.out.println("UserFilter 的 doFilter() 方法");
chain.doFilter(request, response);//放行请求和响应
}
//UserFilter 被销毁的时候调用的方法
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("UserFilter 的 destroy() 方法");
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>javaweb2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!– 配置自定义过滤器 –>
<filter>
<!– 过滤器的名称,名称随意 –>
<filter-name>UserFilter</filter-name>
<!– 过滤器的全类名 –>
<filter-class>com.edu.ctrl.UserFilter</filter-class>
<!– 初始化参数 –>
<init-param>
<param-name>param</param-name>
<param-value>通过在 web.xml 中配置的过滤器的初始化参数</param-value>
</init-param>
</filter>
<!– 过滤器映射 –>
<filter-mapping>
<!– 过滤器的名称,要和上面保持一致 –>
<filter-name>UserFilter</filter-name>
<!– 过滤器拦截的地址,其中"/*"表示拦截所有的请求和响应 –>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
测试:
示例:字符编码过滤器,设置所有的请求和响应的字符编码为 UTF-8,这样我们不用每次都去设置字符编码
CharacterEncodingFilter.java:
package com.edu.utils;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CharacterEncodingFilter implements Filter{
private String encoding = "";//从 web.xml 中读取配置的字符编码名称的参数
@Override
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
//读取初始化参数中配置的字符编码名称
encoding = config.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
/**
* 对所有的请求和响应都设置字符编码后再放行,那么所有的请求和响应就支持中文
*/
//将原生的请求和响应转换为 HTTP 的请求和响应
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//设置请求和响应的编码
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset=" + encoding);
//设置好编码后,放行请求响应
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>javaweb2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!– 配置自定义过滤器 –>
<filter>
<!– 过滤器的名称,名称随意 –>
<filter-name>CharacterEncodingFilter</filter-name>
<!– 过滤器的全类名 –>
<filter-class>com.edu.utils.CharacterEncodingFilter</filter-class>
<!– 初始化参数 –>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<!– 过滤器映射 –>
<filter-mapping>
<!– 过滤器的名称,要和上面保持一致 –>
<filter-name>CharacterEncodingFilter</filter-name>
<!– 过滤器拦截的地址,其中"/*"表示拦截所有的请求和响应 –>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
注意:如果 web.xml 中还有其他过滤器配置,字符编码过滤器应该配置成第一个,这样所有的请求和响应会在第一时间被过滤。
测试:
没有中文乱码的问题,字符编码过滤器正常工作。
三、Servlet 监听器
1. Servlet 规范中定义了6 个监听器
1.1 监听域对象
监听ServletContext(application)、HttpSession(session)、ServletRequest(request)域对象的创建和销毁
1.2 监听域对象属性
监听ServletContext、HttpSession、ServletRequest 域对象的属性的变化(添加、更新、删除)
2. 创建 Servlet 监听器
创建 Servlet 监听器只需要实现相应的接口并重写接口中方法,然后在 web.xml 中配置或使用 @WebListener 注解注册即可。
2.1 监听域对象的创建和销毁
(1)ServletConextListener:监听 ServletContext 对象(application对象)
1. void contextInitialized(ServletContextEvent sce):服务器启动创建ServletContext域对象的时候触发
2. void contextDestroyed(ServletContextEvent sce):服务器关闭或应用移除销毁ServletContext域对象时触发
(2)HttpSessionListener:监听 session 对象
1. void sessionCreated(HttpSessionEvent se):第一次请求创建session对象时触发
2. void sessionDestroyed(HttpSessionEvent se):销毁 session 时触发
(3)ServletRequestListener:监听 request 对象
1. void requestInitialized(ServletRequestEvent sre):每次请求创建 request 对象时触发
2. void requestDestroyed(ServletRequestEvent sre):服务器返回响应给客户端时销毁 request 对象的时候触发
示例1:监听 application 对象的创建和销毁
package com.edu.utils;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
//@WebListener
public class MyServletContextListner implements ServletContextListener {
public MyServletContextListner() {
// TODO Auto-generated constructor stub
}
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("application 对象创建成功");
}
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("application 对象销毁");
}
}
web.xml:
<!– 配置监听器 –>
<listener>
<!– 监听器的全类名 –>
<listener-class>com.edu.utils.MyServletContextListner</listener-class>
</listener>
测试:启动服务器:
然后我们修改一下监听器代码,保存,让服务器重新加载应用:
2.2 监听域对象的属性
(1)ServletContextAttributeListener:监听application域对象的属性变化
1. public void attributeAdded(ServletContextAttributeEvent scae):添加application域属性时触发
2. public void attributeReplaced(ServletContextAttributeEvent scae):修改application域属性时触发
3. public void attributeRemoved(ServletContextAttributeEvent scae):删除application域属性时触发
(2)HttpSessionAttributeListener:监听session域对象属性变化
1. public void attributeAdded(HttpSessionBindingEvent hsbe):添加session域属性时触发
2. public void attributeReplaced(HttpSessionBindingEvent hsbe):修改session域属性时触发
3. public void attributeRemoved(HttpSessionBindingEvent hsbe):删除session域属性时触发
(3)ServletRequestAttributeListener:监听request域属性变化
1. public void attributeAdded(ServletRequestAttributeEvent srae):添加request域属性时触发
2. public void attributeReplaced(ServletRequestAttributeEvent srae):修改request域属性时触发
3. public void attributeRemoved(ServletRequestAttributeEvent srae):删除request域属性时触发
示例:监听 session 域属性的变化
MyHttpSessionAttributeLisenter.java:
package com.edu.utils;
import java.text.MessageFormat;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
@WebListener //使用注解方式来配置
public class MyHttpSessionAttributeLisenter implements HttpSessionAttributeListener {
/**
* Default constructor.
*/
public MyHttpSessionAttributeLisenter() {
// TODO Auto-generated constructor stub
}
//添加 session 域属性时触发
public void attributeAdded(HttpSessionBindingEvent hbe) {
// TODO Auto-generated method stub
//{0},{1}是占位符,后面的值会填充它,类似于 C 语言的 printf("%d", a);
String str = MessageFormat.format("session 域属性值增加了属性:{0},属性值:{1}", hbe.getName(), hbe.getValue());
System.out.println(str);
}
//修改 session 域属性时触发
public void attributeReplaced(HttpSessionBindingEvent hbe) {
// TODO Auto-generated method stub
//{0},{1}是占位符,后面的值会填充它,类似于 C 语言的 printf("%d", a);
String str = MessageFormat.format("session 域属性值修改了属性:{0},属性值:{1}", hbe.getName(), hbe.getValue());
System.out.println(str);
}
//删除 session 域属性时触发
public void attributeRemoved(HttpSessionBindingEvent hbe) {
// TODO Auto-generated method stub
//{0},{1}是占位符,后面的值会填充它,类似于 C 语言的 printf("%d", a);
String str = MessageFormat.format("session 域属性值删除了属性:{0},属性值:{1}", hbe.getName(), hbe.getValue());
System.out.println(str);
}
}
test.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
<%
session.setAttribute("name", "张三");//增加域属性
session.setAttribute("name", "李四");//修改域属性
session.removeAttribute("name");//移除域属性
%>
</body>
</html>
测试:请求 test.jsp:
四、 MVC 设计模式
MVC 设计模式的基本原理就是把应用程序的业务逻辑,数据外观呈现以及数据的操作划分到不同的实体中,这些实体分别称为:“模型(Model)”、“视图(View)”和”控制器(Controller)“。
1. MVC 设计模式的结构图:
视图(View):代表用户交互的界面,对于Web应用来说,可以是HTML页面、JSP页面等等。
模型(Model):实现业务逻辑的处理,可以简单认为就是跟数据库交互的模块,一般由JavaBean来充当。
控制器(Controller):控制器可以理解为从用户接收请求,将模型和视图匹配在一起共同完成用户的请求,控制器的作用相当于就是一个中央调度器,选择模型和视图并完成用户的请求处理。一般由 Servlet 来充当。
2. MVC 设计模式的优点
(1) 有多个视图对应一个模型的能力。
(2) 由于模型返回的数据不带任何显示格式,因此这些模型也可以直接应用于接口的使用。
(3) 由于一个应用被分离成了 3 层,因此有时只需改变其中一层就能满足应用的要求。
(4) 控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起完成不同的请求,因此控制层可以说包含了用户请求权限的概念。
3. MVC 设计模式的缺点
(1) MVC 设计模式实现不容易,理解起来比较困难,对开发人员要求比较高。
(2) 模型和视图的分离可能使调试比较困难,但是更容易发现错误。
(3) MVC 由于将应用分为了 3 层,这意味着文件将增多,因此文件管理困难。
4. JSP 和 Servlet 实现 MVC 设计模式
JSP 和 Servlet 实现 MVC 设计模式可以使用 JSP 充当视图层、Servlet 充当控制器、JavaBean 充当模型,其结构如下:
5. 实现 MVC 设计模式
(1) 创建数据库表
(2) 创建 Web 工程,导入 mysql 驱动
(3) 创建 JavaBean:要求 JavaBean 的属性名需要和表的字段同名
package com.edu.beans;
public class User {
private int id;
private String name;
private String pwd;
private int age;
private String sex;
public User() {
// TODO Auto-generated constructor stub
}
public User(String name, String pwd, int age, String sex) {
super();
this.name = name;
this.pwd = pwd;
this.age = age;
this.sex = sex;
}
public User(int id, String name, String pwd, int age, String sex) {
super();
this.id = id;
this.name = name;
this.pwd = pwd;
this.age = age;
this.sex = sex;
}
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;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + ", age=" + age + ", sex=" + sex + "]";
}
}
(4) 拷贝之前写的数据库工具类 ConnectionFactory 和 DbHelper 到当前工程:
(5) 创建 Dao 层
接口:IUserDao.java:
package com.edu.dao;
import java.util.List;
import com.edu.beans.User;
//模型(Model)
public interface IUserDao {
void save(User user);//增
void delete(int id);//删
void update(User user);//改
List<User> getUsers();//查
}
实现类:UserDaoImpl.java
package com.edu.dao.impl;
import java.util.List;
import com.edu.beans.User;
import com.edu.dao.IUserDao;
import com.edu.utils.DbHelper;
public class UserDaoImpl implements IUserDao{
@Override
public void save(User user) {
// TODO Auto-generated method stub
String sql = "insert into users(name,pwd,age,sex) values(?,?,?,?)";
DbHelper.update(sql, user.getName(),user.getPwd(),user.getAge(),user.getSex());
}
@Override
public void delete(int id) {
// TODO Auto-generated method stub
String sql = "delete from users where id=?";
DbHelper.update(sql, id);
}
@Override
public void update(User user) {
// TODO Auto-generated method stub
String sql = "update users set name=?,pwd=?,age=?,sex=? where id=?";
DbHelper.update(sql, user.getName(),user.getPwd(),user.getAge(),user.getSex(),user.getId());
}
@Override
public List<User> getUsers() {
// TODO Auto-generated method stub
String sql = "select * from users";
return DbHelper.getList(User.class, sql, null);
}
}
(6) 创建 Service 层
接口:IUserService.java:
package com.edu.service;
import java.util.List;
import com.edu.beans.User;
public interface IUserService {
void save(User user);//增
void delete(int id);//删
void update(User user);//改
List<User> getUsers();//查
}
实现类:UserServiceImpl.java:
package com.edu.service.impl;
import java.util.List;
import com.edu.beans.User;
import com.edu.dao.IUserDao;
import com.edu.dao.impl.UserDaoImpl;
import com.edu.service.IUserService;
public class UserServiceImpl implements IUserService{
private IUserDao userDao = new UserDaoImpl();//向上转型
@Override
public void save(User user) {
// TODO Auto-generated method stub
userDao.save(user);
}
@Override
public void delete(int id) {
// TODO Auto-generated method stub
userDao.delete(id);
}
@Override
public void update(User user) {
// TODO Auto-generated method stub
userDao.update(user);
}
@Override
public List<User> getUsers() {
// TODO Auto-generated method stub
return userDao.getUsers();
}
}
(7) 创建主页 index.jsp,放在 webapp 目录下,让它请求 UserServlet(Controller),附加一个请求参数 action=getusers 作为请求的类型
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<a href="userController?action=getusers">查看用户信息</a>
</body>
</html>
(8) 创建 UserServlet,作为控制器 Controller
package com.edu.ctrl;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletConfig;
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 com.edu.beans.User;
import com.edu.service.IUserService;
import com.edu.service.impl.UserServiceImpl;
@WebServlet("/userController")
public class UserServlet extends HttpServlet{
public UserServlet() {
// TODO Auto-generated constructor stub
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//设置字符编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取请求类型
String action = request.getParameter("action");
//产生业务对象(Model)
IUserService userService = new UserServiceImpl();
switch (action) {
case "getusers":{
List<User> users = userService.getUsers();
request.setAttribute("users", users);
//请求转发
request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request, response);
}
break;
case "deleteuser":{
}
break;
case "insertuser":{
}
break;
case "updateuser":{
}
break;
default:
break;
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);//如果是 POST 请求,直接调用 doGet() 方法
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
(9) 在 WEB-INF 目录下创建 show.jsp 页面,显示用户信息
<%@page import="com.edu.beans.User"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h3>所有用户信息:</h3>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
<%
List<User> users = (List<User>)request.getAttribute("users");
for(User user : users){
%>
<tr>
<td><%=user.getId() %></td>
<td><%=user.getName() %></td>
<td><%=user.getPwd() %></td>
<td><%=user.getAge() %></td>
<td><%=user.getSex() %></td>
<td>
<a href="">删除</a>
<a href="">更新</a>
</td>
</tr>
<%
}
%>
</table>
</body>
</html>
(10) 实现删除功能
修改 WEB-INF/show.jsp 页面:
<%@page import="com.edu.beans.User"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h3>所有用户信息:</h3>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
<%
List<User> users = (List<User>)request.getAttribute("users");
for(User user : users){
%>
<tr>
<td><%=user.getId() %></td>
<td><%=user.getName() %></td>
<td><%=user.getPwd() %></td>
<td><%=user.getAge() %></td>
<td><%=user.getSex() %></td>
<td>
<a href="userController?action=deleteuser&id=<%=user.getId()%>">删除</a>
<a href="">更新</a>
</td>
</tr>
<%
}
%>
</table>
</body>
</html>
修改 UserServlet:
package com.edu.ctrl;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletConfig;
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 com.edu.beans.User;
import com.edu.service.IUserService;
import com.edu.service.impl.UserServiceImpl;
@WebServlet("/userController")
public class UserServlet extends HttpServlet{
public UserServlet() {
// TODO Auto-generated constructor stub
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//设置字符编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取请求类型
String action = request.getParameter("action");
//产生业务对象(Model)
IUserService userService = new UserServiceImpl();
switch (action) {
case "getusers":{
List<User> users = userService.getUsers();
request.setAttribute("users", users);
//请求转发
request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request, response);
}
break;
case "deleteuser":{
//从前端取出待删除用户的id
String tid = request.getParameter("id");
int id = Integer.parseInt(tid);
userService.delete(id);
//删除之后应该重新去加载最新的数据来显示
//请求转发
request.getRequestDispatcher("/userController?action=getusers").forward(request, response);
}
break;
case "insertuser":{
}
break;
case "updateuser":{
}
break;
default:
break;
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);//如果是 POST 请求,直接调用 doGet() 方法
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
(11) 增加用户功能
<%@page import="com.edu.beans.User"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h3>所有用户信息:</h3>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
<%
List<User> users = (List<User>)request.getAttribute("users");
for(User user : users){
%>
<tr>
<td><%=user.getId() %></td>
<td><%=user.getName() %></td>
<td><%=user.getPwd() %></td>
<td><%=user.getAge() %></td>
<td><%=user.getSex() %></td>
<td>
<a href="userController?action=deleteuser&id=<%=user.getId()%>">删除</a>
<a href="">更新</a>
</td>
</tr>
<%
}
%>
</table>
<hr>
<h3>增加用户信息</h3>
<!– 如果form 的action 附加了请求参数,那么请求方式 method 必须是 post –>
<form action="userController?action=insertuser" method="post">
姓名:<input type="text" name="name"> <br>
密码:<input type="password" name="pwd"> <br>
年龄:<input type="text" name="age"> <br>
性别:<input type="text" name="sex"> <br>
<input type="submit" value="增加">
</form>
</body>
</html>
UserServlet:
package com.edu.ctrl;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletConfig;
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 com.edu.beans.User;
import com.edu.service.IUserService;
import com.edu.service.impl.UserServiceImpl;
@WebServlet("/userController")
public class UserServlet extends HttpServlet{
public UserServlet() {
// TODO Auto-generated constructor stub
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//设置字符编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取请求类型
String action = request.getParameter("action");
//产生业务对象(Model)
IUserService userService = new UserServiceImpl();
switch (action) {
case "getusers":{
List<User> users = userService.getUsers();
request.setAttribute("users", users);
//请求转发
request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request, response);
}
break;
case "deleteuser":{
//从前端取出待删除用户的id
String tid = request.getParameter("id");
int id = Integer.parseInt(tid);
userService.delete(id);
//删除之后应该重新去加载最新的数据来显示
//请求转发
request.getRequestDispatcher("/userController?action=getusers").forward(request, response);
}
break;
case "insertuser":{
//获取表单参数
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String tage = request.getParameter("age");
int age = Integer.parseInt(tage);
String sex = request.getParameter("sex");
User user = new User(name, pwd, age, sex);
userService.save(user);
//删除之后应该重新去加载最新的数据来显示
//请求转发
request.getRequestDispatcher("/userController?action=getusers").forward(request, response);
}
break;
case "updateuser":{
}
break;
default:
break;
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);//如果是 POST 请求,直接调用 doGet() 方法
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
(12) 更新用户信息
修改 WEB-INF/show.jsp 页面:
<%@page import="com.edu.beans.User"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h3>所有用户信息:</h3>
<table border="1" cellpadding="0" cellspacing="0">
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>性别</th>
<th>操作</th>
</tr>
<%
List<User> users = (List<User>)request.getAttribute("users");
for(User user : users){
%>
<tr>
<td><%=user.getId() %></td>
<td><%=user.getName() %></td>
<td><%=user.getPwd() %></td>
<td><%=user.getAge() %></td>
<td><%=user.getSex() %></td>
<td>
<a href="userController?action=deleteuser&id=<%=user.getId()%>">删除</a>
<a href="update.jsp?id=<%=user.getId()%>&name=<%=user.getName()%>&pwd=<%=user.getPwd()%>
&age=<%=user.getAge()%>&sex=<%=user.getSex()%>">更新</a>
</td>
</tr>
<%
}
%>
</table>
<hr>
<h3>增加用户信息</h3>
<!– 如果form 的action 附加了请求参数,那么请求方式 method 必须是 post –>
<form action="userController?action=insertuser" method="post">
姓名:<input type="text" name="name"> <br>
密码:<input type="password" name="pwd"> <br>
年龄:<input type="text" name="age"> <br>
性别:<input type="text" name="sex"> <br>
<input type="submit" value="增加">
</form>
</body>
</html>
在 webapp 目录下创建 update.jsp 页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>更新</title>
</head>
<body>
<h3>更新用户信息</h3>
<!– 如果form 的action 附加了请求参数,那么请求方式 method 必须是 post –>
<form action="userController?action=updateuser" method="post">
<%–隐藏域中保存了待修改的用户的 id 值 –%>
<input type="hidden" name="id" value="<%=request.getParameter("id")%>"> <br>
姓名:<input type="text" name="name" value="<%=request.getParameter("name")%>"> <br>
密码:<input type="password" name="pwd" value="<%=request.getParameter("pwd")%>"> <br>
年龄:<input type="text" name="age" value="<%=request.getParameter("age")%>"> <br>
性别:<input type="text" name="sex" value="<%=request.getParameter("sex")%>"> <br>
<input type="submit" value="更新">
</form>
</body>
</html>
UserServlet:
package com.edu.ctrl;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletConfig;
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 com.edu.beans.User;
import com.edu.service.IUserService;
import com.edu.service.impl.UserServiceImpl;
@WebServlet("/userController")
public class UserServlet extends HttpServlet{
public UserServlet() {
// TODO Auto-generated constructor stub
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//设置字符编码
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取请求类型
String action = request.getParameter("action");
//产生业务对象(Model)
IUserService userService = new UserServiceImpl();
switch (action) {
case "getusers":{
List<User> users = userService.getUsers();
request.setAttribute("users", users);
//请求转发
request.getRequestDispatcher("/WEB-INF/show.jsp").forward(request, response);
}
break;
case "deleteuser":{
//从前端取出待删除用户的id
String tid = request.getParameter("id");
int id = Integer.parseInt(tid);
userService.delete(id);
//删除之后应该重新去加载最新的数据来显示
//请求转发
request.getRequestDispatcher("/userController?action=getusers").forward(request, response);
}
break;
case "insertuser":{
//获取表单参数
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String tage = request.getParameter("age");
int age = Integer.parseInt(tage);
String sex = request.getParameter("sex");
User user = new User(name, pwd, age, sex);
userService.save(user);
//增加之后应该重新去加载最新的数据来显示
//请求转发
request.getRequestDispatcher("/userController?action=getusers").forward(request, response);
}
break;
case "updateuser":{
//获取表单参数
String tid = request.getParameter("id");
int id = Integer.parseInt(tid);
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String tage = request.getParameter("age");
int age = Integer.parseInt(tage);
String sex = request.getParameter("sex");
User user = new User(id, name, pwd, age, sex);
userService.update(user);
//更新之后应该重新去加载最新的数据来显示
//请求转发
request.getRequestDispatcher("/userController?action=getusers").forward(request, response);
}
break;
default:
break;
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);//如果是 POST 请求,直接调用 doGet() 方法
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
测试:
评论前必须登录!
注册