| 
 步骤 2 : 模仿和排错 步骤 3 : 效果 步骤 4 : ProductAction.java 步骤 5 : list.jsp 步骤 6 : 创建拦截器 步骤 7 : 配置struts.xml 步骤 8 : 测试 
					老规矩,先下载右上角的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。
					 
					在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。 
 模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。 采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。 推荐使用diffmerge软件,进行文件夹比较。把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。 这个软件很牛逼的,可以知道文件夹里哪两个文件不对,并且很明显地标记出来 这里提供了绿色安装和使用教程:diffmerge 下载和使用教程 
					在本例中,通过拦截器 ProductAction 被注入了Date,所以可以在页面上看到当前时间. 访问如下测试地址: http://127.0.0.1:8080/struts/listProduct 
					准备一个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;
    }
}
 
					用于显示时间
 当然现在是显示不出来的,因为还没有拦截器对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();
    }
}
 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();
    }
}
					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 即可看到被注入的当前时间 
				HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。
			   
		
		
		 	问答区域     
		 	
				
		  
	 
	  		
	  
	  	2020-03-30
	  		
	  				
	  					 
	  
					
						invocation.invoke() 
					
					
						
							
						
											
							
					
					
					
	   
	  		
	  
	  	2019-05-07
	  		
	  				
	  					 
	  
					
						通配符的问题 
					
					
						
							
						
											
							
					
					
					
	   
 
		回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢	
	 
	  		
	  
	  	2018-09-21
	  		
	  				
	  					 
	  
					
						取出来的date值为null 
					
					
						
							
						
											
							
					
					
					
	   
	  		
	  
	  	2018-08-18
	  		
	  				
	  					 
	  
					
						取出来的Date的值为null 
					
					
						
							
						
											
							
					
					
					
	   
	  		
	  
	  	2017-09-11
	  		
	  				
	  					 
	  
					
						您好!请问拦截器不适用客户端跳转吗 
					
					
						
							
						
											
							
					
					
					
	   提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 1 条以前的提问,请 点击查看 
			
			提问之前请登陆
			
		 
		提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢	
	 | |||||||||||