先來看看MVC設計模式
實現MVC(Model,View,Controller)模式的應用程序由三大部分構成:
--模型:封裝應用程序的數據和業務邏輯:POJO(Plain Old Java Object),一個普通的java類
--視圖:實現應用程序的信息顯示功能 :jsp
--控制器:接收來自用戶的輸入,調用模型層,響應對應的視圖組建: servlet 和 filter
Struts2的控制器是用Filter實現的
下面是用Filter來做controller的一個小實例
Product.java
package com.wul.strust2.helloworld;
public class Product {
private Integer productId;
private String productName;
private String productDesc;
private double productPrice;
public Product() {
}
public Product(Integer productId, String productName, String productDesc,
double productPrice) {
this.productId = productId;
this.productName = productName;
this.productDesc = productDesc;
this.productPrice = productPrice;
}
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public String getProductDesc() {
return productDesc;
}
public void setProductDesc(String productDesc) {
this.productDesc = productDesc;
}
public double getProductPrice() {
return productPrice;
}
public void setProductPrice(double productPrice) {
this.productPrice = productPrice;
}
@Override
public String toString() {
return "Product [productId=" + productId + ", productName="
+ productName + ", productDesc=" + productDesc
+ ", productPrice=" + productPrice + "]";
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Hello</title>
</head>
<body>
<a href="product-input.action">Product Input</a>
</body>
</html>
input.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Hello</title>
</head>
<body>
<form action="product-save.action" method="post">
ProductName:<input type="text" name="productName"/>
<br><br>
ProductDesc:<input type="text" name="productDesc"/>
<br><br>
ProductPrice:<input type="text" name="productPrice"/>
<br><br>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
details.jsp<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Hello</title>
</head>
<body>
ProductId: ${requestScope.product.productId }
<br><br>
ProductName: ${requestScope.product.productName }
<br><br>
ProductDesc: ${requestScope.product.productDesc }
<br><br>
ProductPrice: ${requestScope.product.productPrice }
<br><br>
</body>
</html>
FilterDispatcher.java
package com.wul.strust2.helloworld;
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.http.HttpServletRequest;
@WebFilter({ "/FilterDispatcher", "*.action" })
public class FilterDispatcher implements Filter {
public void destroy() {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//1.獲取servletPath
HttpServletRequest req = (HttpServletRequest) request;//注意ServletRequest接口裏是沒有getServletPath方法的,其是HttpServletRequest子接口裏的方法
String servletPath = req.getServletPath();
String path = null;
//2.判斷servletPath,若等於"/product-save.action",則轉發到
//WEB-INF/pages/input.jsp
if("/product-input.action".equals(servletPath)){
path = "/WEB-INF/pages/input.jsp";
}
//3.若其等於"/product-save.action",則
//1).獲取請求參數
if("/product-save.action".equals(servletPath)){
String productName = request.getParameter("productName");
String productDesc = request.getParameter("productDesc");
String productPrice = request.getParameter("productPrice");
//2).把請求信息封裝成一個Product對象
Product product = new Product(null, productName, productDesc, Double.parseDouble(productPrice));
//3).執行保存操作
System.out.println("save product"+product.toString());
product.setProductId(1001);// 在這裏就不進行保存操作了
//4).把Product對象保存到request中,${param.productName} -> ${requestScope.product.productName}
request.setAttribute("product", product);
path = "/WEB-INF/pages/details.jsp";
}
if(path != null){
request.getRequestDispatcher(path).forward(request, response);
return ;
}
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
由上面的實例可以明確Filter確實可以用來做controller
使用Filter作爲控制器的好處
----使用一個過濾器作爲控制器,可以方便的在應用程序裏對所有資源(包括靜態資源)進行控制訪問。
<url-pattern>*.action</url-pattern>
Servlet vs Filter
1.Servlet能做的Filter是否都可以實現?嗯
2.Filter能做的Servlet都可以完成嗎?攔截器資源卻不是Servlet所擅長的。
Filter中有一個FilterChain,這個API在Servlet中沒有
Filter的功能比servlet要強
文章參考:http://edu.51cto.com/course/course_id-960.html