云计算百科
云计算领域专业知识百科平台

JavaWeb从入门到精通!第三天!(MVC设计模式和Servlet过滤器和监听器)

二、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
        
    }
}

测试:

赞(0)
未经允许不得转载:网硕互联帮助中心 » JavaWeb从入门到精通!第三天!(MVC设计模式和Servlet过滤器和监听器)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!