struts2.1.6 interceptor 09

Java/Struts2 专栏收录该内容
11 篇文章 0 订阅

Struts拦截器以及源码解析

1. Struts架构图

a) 见文档

2. Struts执行过程分析

3. Interceptor拦截器过程模拟

4. 定义自己的拦截器

a) acegi – spring security

5. 使用token拦截器控制重复提交(很少用)

6. 类型转换

a) 默认转换

i. 日期处理

b) 写自己的转换器:

public class MyPointConverter extends DefaultTypeConverter{

@Override

public Object convertValue(Object value, Class toType) {

if(toType == Point.class) {

Point p = new Point();

String[] strs = (String[])value;

String[] xy = strs[0].split(",");

p.x = Integer.parseInt(xy[0]);

p.y = Integer.parseInt(xy[1]);

return p;

}

if(toType == String.class) {

return value.toString();

}

return super.convertValue(value, toType);

}

}

public class MyPointConverter extends StrutsTypeConverter{

@Override

public Object convertFromString(Map context, String[] values, Class toClass) {

Point p = new Point();

String[] strs = (String[])values;

String[] xy = strs[0].split(",");

p.x = Integer.parseInt(xy[0]);

p.y = Integer.parseInt(xy[1]);

return p;

}

@Override

public String convertToString(Map context, Object o) {

// TODO Auto-generated method stub

return o.toString();

}

}

c) 三种注册方式:

i. 局部:XXXAction-conversion.properties

1. p(属性名称) = converter

ii. 全局:xwork-conversion.properties

1. com.xxx.XXX(类名)= converter

iii. Annotation

d) 如果遇到非常麻烦的映射转换

i. request.setAttribute();

ii. session

_________________________________________________________________________

interceptor 流程图






  1. package com.demo;  
  2.   
  3. public interface Interceptor {  
  4.     public void intercept(ActionInvocation invocation) ;  
  5.           
  6. }  

  1. package com.demo;  
  2.   
  3. public class FirstInterceptor implements Interceptor {  
  4.   
  5.     public void intercept(ActionInvocation invocation) {  
  6.         System.out.println(1);  
  7.         invocation.invoke();  
  8.         System.out.println(-1);  
  9.     }  
  10.   
  11. }  

  1. package com.demo;  
  2.   
  3. public class SecondtInterceptor implements Interceptor {  
  4.   
  5.     public void intercept(ActionInvocation invocation) {  
  6.         System.out.println(1);  
  7.         invocation.invoke();  
  8.         System.out.println(-2);  
  9.     }  
  10.   
  11. }  

  1. package com.demo;  
  2.   
  3. import freemarker.template.utility.Execute;  
  4.   
  5. public class Action {  
  6.     public void execute() {  
  7.         System.out.println("execute");  
  8.     }  
  9. }  

  1. package com.demo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. public class ActionInvocation {  
  6.     List<Interceptor> interceptors = new ArrayList<Interceptor>();  
  7.     int index = -1;  
  8.     Action a = new Action();  
  9.     public ActionInvocation() {  
  10.         this.interceptors.add(new FirstInterceptor());  
  11.         this.interceptors.add(new SecondtInterceptor());  
  12.     }  
  13.       
  14.     public void invoke() {  
  15.         index ++ ;  
  16.         if(index >= this.interceptors.size()) {  
  17.             a.execute();  
  18.         } else {  
  19.   
  20.             this.interceptors.get(index).intercept(this);  
  21.         }  
  22.     }  
  23.  }  

  1. package com.demo;  
  2.   
  3. public class Main {  
  4.     public static void main(String[] args) {  
  5.         new ActionInvocation().invoke();  
  6.     }  
  7. }  

  1. 防止用户刷新在数据库留下的user 的机制  
  2.   
  3. 提交方式设置post 会进行提示,要确认才重新发送  
  4.   
  5.  <form action="user"  method="post">  
  6.   
  7.     <s:token></s:token>  生成一个随机数   
  1. value="6ZLIK012XOVVYKHFM21BR6CAW3R78TDN"   
  2.   
  3. <input type="hidden" name="struts.token.name" value="struts.token" />  
  4. <input type="hidden" name="struts.token" value="6ZLIK012XOVVYKHFM21BR6CAW3R78TDN" />  
  5.   
  6. No result defined for action com.demo.action.UserAction and result invalid.token  
  7.   
  8.  经过如下设置可以杜绝重复提交  
  9.   
  10. <interceptor-ref name="defaultStack"/>  
  11.             <interceptor-ref name="token"/>  // 检查session里面记录的用户是否存在  
  12.             <result name="invalid.token">/error.jsp</result>  
  13.   
  14. 整个例子代码如下:  
  15.   
  16. package com.demo.action;  
  17.   
  18. import com.opensymphony.xwork2.ActionSupport;  
  19.   
  20. public class UserAction extends ActionSupport {  
  21.     private String name;  
  22.     private int age;  
  23.       
  24.     public String getName() {  
  25.         return name;  
  26.     }  
  27.   
  28.     public void setName(String name) {  
  29.         this.name = name;  
  30.     }  
  31.   
  32.     public int getAge() {  
  33.         return age;  
  34.     }  
  35.   
  36.     public void setAge(int age) {  
  37.         this.age = age;  
  38.     }  
  39.   
  40.     @Override  
  41.     public String execute() throws Exception {  
  42.         System.out.println("a user added");  
  43.         return super.execute();  
  44.     }  
  45.       
  46. }  
  47.   
  48. package com.demo.action;  
  49.   
  50. import com.opensymphony.xwork2.ActionSupport;  
  51.   
  52. public class InputAction extends ActionSupport {  
  53.     @Override  
  54.     public String execute() throws Exception {  
  55.         return super.execute();  
  56.     }  
  57. }  
  58.       
  59.   
  60. <!-- struts.xml  -->  
  61. <struts>  
  62.     <constant name="struts.devMode" value="true"/>       
  63.     <package name="resultType" extends="struts-default" namespace="/">  
  64.         <action name="input" class="com.demo.action.InputAction">  
  65.             <result>/input.jsp</result>  
  66.         </action>  
  67.           
  68.         <action name="user" class="com.demo.action.UserAction">  
  69.             <result>/addOK.jsp</result>  
  70.             <interceptor-ref name="defaultStack"/>  
  71.             <interceptor-ref name="token"/>  
  72.             <result name="invalid.token">/error.jsp</result>  
  73.         </action>  
  74.     </package>  
  75. </struts>  


  1. <!-- input.jsp  -->  
  2. <body>  
  3.  <form action="user"  method="post">  
  4.      name: <input name="name">  
  5.      age: <input name="age">  
  6.      <input type="submit" value="add">  
  7.     <s:token></s:token>  
  8.   </body>  
  1. <!-- addOK.jsp  -->  
  2.   <body>  
  3.     addOK  
  4.   
  5.   </body>  
  1. <!-- error.jsp  -->  
  2.   <body>  
  3. 严谨重复的事! <br/>  
  4.   </body>  


容器接收参数一定要用泛型,要不会出现很多问题

HTTP 里面进行传参数永远是string 类型

  1. http://localhost:8080/Struts2_37_type_conversion/test?name=dd&age=9&date=2011-11-18%2005:26:55&set=English  
  2.   
  3. name: dd  
  4. age: 9  
  5. date: 11-11-18  
  6. 2011/11/18 05:26:55  
  7. [English]  
  8.   
  9. http://localhost:8080/Struts2_37_type_conversion/test?userMap[%27a%27]=userA&userMap[%27b%27]=userB    
  10.   
  11. {b=userBa=userA}  
  12.   
  13. http://localhost:8080/Struts2_37_type_conversion/test?p=3,3  
  14.   
  15. java.awt.Point[x=3,y=3]  
  16.   
  17. http://localhost:8080/Struts2_37_type_conversion/test?pointMap[%27a%27]=7,3&%20pointMap[%27b%27]=3,5  
  18.   
  19. pointMap: {b=java.awt.Point[x=3,y=5], a=java.awt.Point[x=7,y=3]}  
  20.   
  21. http://localhost:8080/Struts2_37_type_conversion/test?pointList[0].x=8&pointList[0].y=9  
  22.   
  23. [java.awt.Point[x=8,y=9]]  


  1. package com.demo.action;  
  2.   
  3. import java.awt.Point;  
  4. import java.util.Date;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7. import java.util.Set;  
  8.   
  9. import com.opensymphony.xwork2.ActionSupport;  
  10.   
  11. public class TestAction extends ActionSupport {  
  12.     private String name;  
  13.     private int age;  
  14.     private Date date;  
  15.     Set<String> set;  
  16.     Map<String, String> userMap;  
  17.     Point p;  
  18.     List<Point> pointList;  
  19.     Map<String, Point> pointMap;  
  20.       
  21.     @Override  
  22.     public String execute() throws Exception {  
  23.         return super.execute();  
  24.     }  
  25.       
  26.     public String getName() {  
  27.         return name;  
  28.     }  
  29.     public void setName(String name) {  
  30.         this.name = name;  
  31.     }  
  32.     public int getAge() {  
  33.         return age;  
  34.     }  
  35.     public void setAge(int age) {  
  36.         this.age = age;  
  37.     }  
  38.     public Date getDate() {  
  39.         return date;  
  40.     }  
  41.     public void setDate(Date date) {  
  42.         this.date = date;  
  43.     }  
  44.     public Set<String> getSet() {  
  45.         return set;  
  46.     }  
  47.     public void setSet(Set<String> set) {  
  48.         this.set = set;  
  49.     }  
  50.     public Map<String, String> getUserMap() {  
  51.         return userMap;  
  52.     }  
  53.     public void setUserMap(Map<String, String> userMap) {  
  54.         this.userMap = userMap;  
  55.     }  
  56.     public List<Point> getPointList() {  
  57.         return pointList;  
  58.     }  
  59.     public void setPointList(List<Point> pointList) {  
  60.         this.pointList = pointList;  
  61.     }  
  62.   
  63.     public Map<String, Point> getPointMap() {  
  64.         return pointMap;  
  65.     }  
  66.   
  67.     public void setPointMap(Map<String, Point> pointMap) {  
  68.         this.pointMap = pointMap;  
  69.     }  
  70.   
  71.     public Point getP() {  
  72.         return p;  
  73.     }  
  74.   
  75.     public void setP(Point p) {  
  76.         this.p = p;  
  77.     }  
  78.   
  79.       
  80. }  

  1. package com.demo.converter;  
  2.   
  3. import java.awt.Point;  
  4. import java.util.Map;  
  5. import org.apache.struts2.util.StrutsTypeConverter;  
  6. import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;  
  7.   
  8. //StrutsTypeConverter extends DefaultTypeConverter   
  9. /* 
  10. public class MyPointConverter extends StrutsTypeConverter{ 
  11.     @Override 
  12.     public Object convertFromString(Map context, String[] values, Class toClass) { 
  13.     //convertFromString  从字符串转成Point类型 
  14.         Point p = new Point(); 
  15.         String[] strs = (String [])values; 
  16.         String[] xy = strs[0].split(","); 
  17.         p.x = Integer.parseInt(xy[0]); 
  18.         p.y = Integer.parseInt(xy[1]); 
  19.         return p; 
  20.     } 
  21.     @Override 
  22.     public String convertToString(Map context, Object o) { 
  23.         //convertToString 从Point类型转成字符串 
  24.         return o.toString(); 
  25.     } 
  26. } 
  27. */  
  28. public class MyPointConverter extends DefaultTypeConverter {  
  29.     @Override  
  30.     public Object convertValue(Object value, Class toType) {  
  31.         if(toType == Point.class) {  
  32.             Point p = new Point();  
  33.             String[] strs = (String[])value;  
  34.             String[] xy = strs[0].split(",");  
  35.             p.x = Integer.parseInt(xy[0]);  
  36.             p.y = Integer.parseInt(xy[1]);  
  37.             return p;  
  38.         }  
  39.         if(toType == String.class) {  
  40.             return value.toString();  
  41.         }  
  42.         return super.convertValue(value, toType);  
  43.     }  
  44. }   

  1. <!-- struts.xml -->  
  2. <struts>  
  3.     <constant name="struts.devMode" value="true"/>       
  4.     <package name="test" extends="struts-default" namespace="/">  
  5.         <action name="test" class="com.demo.action.TestAction">  
  6.             <result>/test.jsp</result>  
  7.         </action>  
  8.     </package>  
  9. </struts>  

  1. <!-- test.jsp -->  
  2. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>  
  3. <%@taglib uri="/struts-tags" prefix="s"%>  
  4. <html>  
  5.   <head>  
  6.   </head>  
  7.   <body>  
  8.     name: <s:property value="name"/><br/>  
  9.     age: <s:property value="age"/><br/>  
  10.     date: <s:property value="date"/><br/>  
  11.     <s:date name="date" format="yyyy/MM/dd HH:mm:ss"/><br/>  
  12.     <s:property value="set"/><br/>  
  13.     <s:property value="userMap"/><br/>  
  14.     <s:property value="p"/><br/>  
  15.     <s:property value="pointList"/><br/>  
  16. pointMap:   <s:property value="pointMap"/><br/>   
  17.   </body>  
  18. </html>  

  1. TestAction-conversion.properties               p=com.demo.converter.MyPointConverter    action包下的  
  2.   
  3. xwork-conversion.properties                        java.awt.Point=com.demo.converter.MyPointConverter                       src目录下的 全局的  

还要补充的内容

1. Lambda表达式

2. 验证框架

3. UI标签

4. 类型转换中的异常处理

5. 上传与下载文件

6. Struts2注解

Struts2总结

1. Action

a) namespace(掌握)

b) path(掌握)

c) DMI(掌握)

d) wildcard(掌握)

e) 接收参数(掌握前两种)

f) 访问request等(掌握Map IOC方式)

g) 简单数据验证(掌握addFieldError和<s:fieldError)

2. Result

a) 结果类型(掌握四种,重点两种)

b) 全局结果(掌握)

c) 动态结果(了解)

3. OGNL表达式(精通)

a) # % $

4. Struts标签

a) 掌握常用的

5. 声明式异常处理(了解)

6. I18N(了解)

7. CRUD的过程(最重要是设计与规划)(精通)

8. Interceptor的原理(掌握)

9. 类型转换(掌握默认,了解自定义)


  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值