专栏首页行者常至(01)Struts2_使用 Filter 作为控制器的 MVC 应用

(01)Struts2_使用 Filter 作为控制器的 MVC 应用

MVC 设计模式概览

实现 MVC(Model、View、Controller) 模式的应用程序由 3 大部分构成:

  • 模型:封装应用程序的数据和业务逻辑
  • 视图:实现应用程序的信息显示功能
  • 控制器:接收来自用户的输入,调用模型层,响应对应的视图组件(Servlet 、Filter)

需求:

编码:

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
    <a href="czy_input.action">进入Input.jsp页面</a>
</body>
</html>

Input.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
  <form action="czy_save.action" method="post">
       编号:<input type="text" name="dlh"/><br>
       姓名:<input type="text" name="name"/><br>
       部门:<input type="text" name="bmmc"/><br>
       <input type="submit" value="保存"/>
   </form>
  </body>
</html>

Show.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
       ID:${requestScope.czy.id}<br>
       编号:${ requestScope.czy.dlh}<br>
       姓名:${ requestScope.czy.name}<br>
       部门:${ requestScope.czy.bmmc}<br>
  </body>
</html>

FilterDispatcher.java

package com.qbz.struts2_01;

import java.io.IOException;
import java.util.UUID;

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 FilterDispatcher implements Filter {

    @Override
    public void destroy() {

    }

    @SuppressWarnings("unused")
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) arg0;
        HttpServletResponse response = (HttpServletResponse) arg1;

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        String servletPath = request.getServletPath();
        String path = null;

        if("/czy_input.action".equals(servletPath)){
            path="/WEB-INF/page/Input.jsp";
        }else if("/czy_save.action".equals(servletPath)){
            String dlh = request.getParameter("dlh");
            String name = request.getParameter("name");
            String bmmc = request.getParameter("bmmc");

            String id = UUID.randomUUID().toString().replace("-", "");
            GG_CZY czy = new GG_CZY(id,dlh, name, bmmc);

            request.setAttribute("czy", czy);

            path = "/WEB-INF/page/Show.jsp";
        }

        if(path!=null){
            request.getRequestDispatcher(path).forward(request, response);
            return;
        }
        arg2.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}

GG_CZY.java

package com.qbz.struts2_01;

public class GG_CZY {
    private String id;
    private String dlh;
    private String name;
    private String bmmc;

    public String getId() {
        return id;
    }

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

    public String getDlh() {
        return dlh;
    }

    public void setDlh(String dlh) {
        this.dlh = dlh;
    }

    public String getName() {
        return name;
    }

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

    public String getBmmc() {
        return bmmc;
    }

    public void setBmmc(String bmmc) {
        this.bmmc = bmmc;
    }

    public GG_CZY(String id, String dlh, String name, String bmmc) {
        super();
        this.id = id;
        this.dlh = dlh;
        this.name = name;
        this.bmmc = bmmc;
    }

    public GG_CZY() {
        super();
    }

    @Override
    public String toString() {
        return "GG_CZY [id=" + id + ", dlh=" + dlh + ", name=" + name
                + ", bmmc=" + bmmc + "]";
    }

}

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"
    id="WebApp_ID" version="3.1">
    <display-name>struts2-01</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <!-- 拦截所有后缀为.action的请求 -->
    <filter>
        <filter-name>filterDispatcher</filter-name>
        <filter-class>com.qbz.struts2_01.FilterDispatcher</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filterDispatcher</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>
</web-app>

使用 Filter 作为控制器的好处

使用一个过滤器来作为控制器, 可以方便地在应用程序里对所有资源(包括静态资源)进行控制访问.

Servlet VS Filter

  • Servlet可以做到的,Filter都可以完成。
  • 拦截资源却不是Servlet所擅长的。
  • Filter 中有一个FilterChain,Servlet中没有这个API。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 020.Java的反射机制

    JAVA反射机制是在运行状态中, 对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意方法和属性; 这种动态获取信息以...

    qubianzhong
  • 021.使用反射,编写SpringIOC

    就是把每一个bean(实体类)与bean(实体类)之间的关系交给第三方容器进行管理。 而不是传统的在你的对象内部直接控制。

    qubianzhong
  • (04)Struts2_helloWorld

    qubianzhong
  • 面试中常问的List去重问题,你都答对了吗?

    面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固。

    java思维导图
  • 面试中常问的List去重问题,你都答对了吗?

    面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固。

    JAVA葵花宝典
  • 面试中常问的 List 去重问题,你都答对了吗?

    面试中经常被问到的list如何去重,用来考察你对list数据结构,以及相关方法的掌握,体现你的java基础学的是否牢固。

    芋道源码
  • 面试中常问的List去重问题,你都答对了吗?

    原文:https://mp.weixin.qq.com/s/AAeaY1-0xclmMKBXp7XVUA

    Spark学习技巧
  • java 代码转kotlin

    今天看见IDEA 有一个快捷键 Ctrl+Alt+shift+K。 选中一段代码直接就能将java 代码转化为kotlin 代码。

    地球流浪猫
  • HIbernate 中的 继承映射

    数据库中Delivery表:id,recipient,phone,address,postcode,delivery_type,parcel_number,ex...

    Hongten
  • springboot之参数校验---------validation引入jar实体类controller

    用户5899361

扫码关注云+社区

领取腾讯云代金券