拦截器可以简单地看成是Struts中的"filter"
拦截器可以拦截指定的Action,并且对Action进行相应的操作
在本例里,拦截了ProductAction,并且注入了当前时间
拦截器可以拦截指定的Action,并且对Action进行相应的操作
在本例里,拦截了ProductAction,并且注入了当前时间
- ProductAction.java
准备一个Date属性,用于被拦截器注入时间
package com.how2java.action; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.how2java.bean.Category; import com.how2java.bean.Product; public class ProductAction { private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } private Product product; private List<Category> categories =new ArrayList(); public List<Category> getCategories() { return categories; } public void setCategories(List<Category> categories) { this.categories = categories; } public String show() { product = new Product(); product.setName("iphone7"); return "show"; } public String add() { return "show"; } public String list() { Category category1 =new Category(); category1.setId(1); category1.setName("category1"); Category category2 =new Category(); category2.setId(2); category2.setName("category2"); categories.add(category1); categories.add(category2); List<Product> products1=new ArrayList(); Product p1 = new Product(); p1.setId(1); p1.setName("product1"); Product p2 = new Product(); p2.setId(2); p2.setName("product2"); Product p3 = new Product(); p3.setId(3); p3.setName("product3"); products1.add(p1); products1.add(p2); products1.add(p3); List<Product> products2=new ArrayList(); Product p4 = new Product(); p4.setId(4); p4.setName("product4"); Product p5 = new Product(); p5.setId(5); p5.setName("product5"); Product p6 = new Product(); p6.setId(6); p6.setName("product6"); products2.add(p4); products2.add(p5); products2.add(p6); category1.setProducts(products1); category2.setProducts(products2); return "list"; } public Product getProduct() { return product; } public void setProduct(Product product) { this.product = product; } }
- list.jsp
用于显示时间
当然现在是显示不出来的,因为还没有拦截器对ProductAction进行时间注入
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <%@ taglib prefix="s" uri="/struts-tags" %> <%@page isELIgnored="false"%> ${date} <table border="1" cellspacing="0"> <tr> <td>id</td> <td>name</td> <td>products</td> </tr> <s:iterator value="categories" var="c"> <tr> <td>${c.id}</td> <td>${c.name}</td> <td> <s:iterator value="#c.products" var="p"> ${p.name}<br/> </s:iterator> </td> </tr> </s:iterator> </table> <s:debug/>
- 创建拦截器
把拦截到的Action强制转换成 ProductAction,并设置当前时间(注入)
package com.how2java.interceptor; import java.util.Date; import com.how2java.action.ProductAction; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class DateInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation invocation) throws Exception { ProductAction action = (ProductAction)invocation.getAction(); action.setDate(new Date()); return invocation.invoke(); } }
- 配置struts.xml
10-12 声明dateInterceptor
16 对ProductAction使用拦截器dateInterceptor
17 一旦使用了自定义的拦截器,本来配置在action上的默认的拦截器就失效了。 所以需要再加上defaultStack
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <package name="basicstruts" extends="struts-default"> <interceptors> <interceptor name="dateInterceptor" class="com.how2java.interceptor.DateInterceptor" /> </interceptors> <action name="*Product*" class="com.how2java.action.ProductAction" method="{1}"> <interceptor-ref name="dateInterceptor" /> <interceptor-ref name="defaultStack" /> <result name="show">show.jsp</result> <result name="list">list.jsp</result> </action> </package> </struts>
- 测试
重启tomcat,访问页面
http://127.0.0.1:8080/struts/listProduct
即可看到被注入的当前时间