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 >
<%@ 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 >
<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。