LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: lijiangt

自己做了个支持DispatchAction的struts拦截器

[复制链接]
 楼主| 发表于 2005-4-6 13:21:26 | 显示全部楼层
针对“每次执行一个action都会导致重新创建interceptor对象”作了下改进


  1. /*
  2. * 创建日期 2005-3-31
  3. *
  4. */
  5. package com.bupticet.strutsinterceptor;

  6. import java.io.InputStream;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.Iterator;
  10. import java.util.List;
  11. import java.util.Map;

  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.xml.parsers.DocumentBuilder;
  14. import javax.xml.parsers.DocumentBuilderFactory;

  15. import org.apache.struts.config.ActionConfig;
  16. import org.w3c.dom.Document;
  17. import org.w3c.dom.Element;
  18. import org.w3c.dom.NodeList;
  19. import org.xml.sax.SAXException;

  20. /**
  21. * <p>Title: InterceptorConfig</p>
  22. *
  23. * <p>Description: 配置文件读取类</p>
  24. *
  25. * <p>Copyright: Copyright (c)北京邮电大学网络教育技术研究所[www.buticet.com] 2005</p>
  26. *
  27. * <p>Company: 北京邮电大学网络教育技术研究所[www.buticet.com] </p>
  28. *
  29. * @author LJ-silver E-mail:LJ-silver@163.com
  30. * @version 1.0
  31. */
  32. public class InterceptorConfig {
  33.         private static HashMap config;
  34.         private static HashMap interceptor;
  35.        
  36.         private final static String filePathName = "/struts-interceptor.xml";  
  37.        
  38.         static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(InterceptorConfig.class);
  39.        
  40.         public static void init(){
  41.                 if(config==null){
  42.                         initResource();
  43.                 }
  44.         }
  45.                
  46.         private static void initResource(){
  47.                 Document document = null;
  48.                 try{
  49.                         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  50.                         DocumentBuilder db = dbf.newDocumentBuilder();
  51.                         InputStream is = InterceptorConfig.class.getResourceAsStream(filePathName);
  52.                         document = db.parse(is);
  53.                         Element root = document.getDocumentElement();
  54.                         NodeList interceptors = root.getElementsByTagName("interceptor-definition");
  55.                         Map map = new HashMap();
  56.                         for(int i = 0;i<interceptors.getLength();i++){
  57.                                 Element interceptor = (Element) interceptors.item(i);
  58.                                 if(map.containsKey(interceptor.getAttribute("name"))){
  59.                                         logger.error("In initResource(), Exception Occured !Info :不能重复配置interceptor-definition元素:"+interceptor.getAttribute("name"));
  60.                                 }else{
  61.                                         map.put(interceptor.getAttribute("name"),interceptor.getAttribute("type"));
  62.                                 }
  63.                         }
  64.                         NodeList actions = document.getElementsByTagName("action");
  65.                         config = new HashMap();
  66.                         for(int i = 0;i<actions.getLength();i++){
  67.                                 Element action = (Element) actions.item(i);
  68.                                 String path = action.getAttribute("path");
  69.                                 NodeList methods = action.getElementsByTagName("method");
  70.                                 Map temp = new HashMap();
  71.                                 for(int j = 0;j<methods.getLength();j++){
  72.                                         Element method = (Element) methods.item(j);
  73.                                         String name = method.getAttribute("name");
  74.                                         List actionInterceptorList = new ArrayList();
  75.                                         NodeList actionInterceptors = method.getElementsByTagName("interceptor");
  76.                                         for(int k = 0;k<actionInterceptors.getLength();k++){
  77.                                                 Element actionInterceptor = (Element) actionInterceptors.item(k);
  78.                                                 String interceptorName = actionInterceptor.getAttribute("name");
  79.                                                 if(map.containsKey(interceptorName)){
  80.                                                         actionInterceptorList.add(map.get(interceptorName));
  81.                                                 }else{
  82.                                                         logger.error("In initResource(), Exception Occured !Info :没有"+interceptorName+"对应的interceptor-definition元素!" );
  83.                                                 }

  84.                                         }
  85.                                         String[] allMethods = name.split(",");
  86.                                         for(int m = 0;m<allMethods.length;m++){
  87.                                                 if(temp.containsKey(allMethods[m])){
  88.                                                         logger.error("In initResource(), Exception Occured !Info :不能重复配置method元素:"+allMethods[m] );
  89.                                                 }else{
  90.                                                         temp.put(allMethods[m],actionInterceptorList);
  91.                                                 }
  92.                                         }
  93.                                 }
  94.                                 if(config.containsKey(path)){
  95.                                         logger.error("In initResource(), Exception Occured !Info :不能重复配置path元素:"+path );
  96.                                 }else{
  97.                                         config.put(path,temp);
  98.                                 }
  99.                         }               
  100.                 }catch(IllegalArgumentException  e){
  101.                         logger.error("In initResource(), Exception Occured ! 找不到文件/WEB-INF/classes/struts-interceptor.xml!,Info :" + e.getLocalizedMessage());
  102.                         e.printStackTrace();
  103.                 }catch(SAXException e){
  104.                         logger.error("In initResource(), Exception Occured ! XML文件/WEB-INF/classes/struts-interceptor.xml语法错误!,Info :" + e.getLocalizedMessage());
  105.                         e.printStackTrace();
  106.                 }catch(Exception e){
  107.                         logger.error("In initResource(), Exception Occured !Info :" + e.getLocalizedMessage());
  108.                         e.printStackTrace();
  109.                 }
  110.         }
  111.        
  112.        
  113.         public static synchronized List getInterceptorList(String path,String method){
  114.                 init();
  115.                 List list = new ArrayList();
  116.                 if(config.containsKey(path)){
  117.                         HashMap map = (HashMap)config.get(path);
  118.                         if(map.containsKey(method)){
  119.                                 list = (ArrayList)map.get(method);
  120.                         }
  121.                 }
  122.                 return list;
  123.         }
  124.        
  125.         public static synchronized List getInterceptorList(HttpServletRequest request){
  126.                 ActionConfig actionConfig = (ActionConfig)request.getAttribute("org.apache.struts.action.mapping.instance");
  127.                 String path = actionConfig.getPath();
  128.                 String method = null;
  129.                 String parameter = actionConfig.getParameter();
  130.                 if(parameter!=null&&!"".equals(actionConfig.getParameter())){
  131.                         method = request.getParameter(parameter);
  132.                 }
  133.                 if(method==null||"".equals(method)){
  134.                         method = "execute";
  135.                 }
  136.                 return getInterceptorList(path,method);
  137.         }
  138.        
  139.         public static synchronized ActionInterceptor getInterceptor(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
  140.                 if(interceptor == null){
  141.                         interceptor = new HashMap();
  142.                 }
  143.                 if(interceptor.containsKey(name)){
  144.                         return (ActionInterceptor)interceptor.get(name);
  145.                 }else{
  146.                         ActionInterceptor actionInterceptor = (ActionInterceptor)Class.forName(name).newInstance();
  147.                         interceptor.put(name,actionInterceptor);
  148.                         return actionInterceptor;
  149.                 }
  150.         }
  151.        
  152.         public static synchronized ActionInterceptor[] getInterceptor(List name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
  153.                 ActionInterceptor[] actionInterceptor = new ActionInterceptor[name.size()];
  154.                 for(int i = 0;i<name.size();i++){
  155.                         actionInterceptor[i] = getInterceptor((String)name.get(i));
  156.                 }
  157.                 return actionInterceptor;
  158.         }       
  159.        
  160.         public static void test(){
  161.                 init();
  162.                 for(Iterator it = config.keySet().iterator();it.hasNext();){
  163.                         String key = (String)it.next();
  164.                         System.out.println(key);
  165.                         Map map = (HashMap)config.get(key);
  166.                         for(Iterator ite = map.keySet().iterator();ite.hasNext();){
  167.                                 String key2 = (String)ite.next();
  168.                                 System.out.println("------------------------"+key2);
  169.                                 List list = (ArrayList)map.get(key2);
  170.                                 for(Iterator iter = list.iterator();iter.hasNext();){
  171.                                         System.out.println("------------------------"+"     "+"------------------------"+(String)iter.next());
  172.                                 }
  173.                         }
  174.                 }
  175.                
  176.        
  177.         }
  178. }


复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-6 13:22:38 | 显示全部楼层

  1. /*
  2. * 创建日期 2005-3-31
  3. *
  4. */
  5. package com.bupticet.strutsinterceptor;

  6. import java.util.List;

  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;

  9. import org.apache.struts.action.Action;
  10. import org.apache.struts.action.ActionForm;
  11. import org.apache.struts.action.ActionForward;
  12. import org.apache.struts.action.ActionMapping;
  13. import org.springframework.web.struts.DelegatingActionProxy;

  14. /**
  15. * <p>Title: InterceptorActionProxy</p>
  16. *
  17. * <p>Description: 拦截器代理Action类</p>
  18. *
  19. * <p>Copyright: Copyright (c)北京邮电大学网络教育技术研究所[[url]www.buticet.com][/url] 2005</p>
  20. *
  21. * <p>Company: 北京邮电大学网络教育技术研究所[[url]www.buticet.com][/url] </p>
  22. *
  23. * @author LJ-silver  E-mail:LJ-silver@163.com
  24. * @version 1.0
  25. */
  26. public class InterceptorActionProxy extends DelegatingActionProxy {
  27.        
  28.         static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(InterceptorActionProxy.class);
  29.         /**
  30.          * Pass the execute call on to the Spring-managed delegate Action.
  31.          * @see #getDelegateAction
  32.          */
  33.         public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
  34.                                                                                                                          HttpServletResponse response) throws Exception {
  35.                 Action delegateAction = getDelegateAction(mapping);
  36.                 ActionForward forward = null;
  37.                 List interceptorList = InterceptorConfig.getInterceptorList(request);
  38.                 int size = interceptorList.size();
  39.                 if(size > 0){
  40.                         ActionInterceptor[] interceptorArray = InterceptorConfig.getInterceptor(interceptorList);
  41.                         try{
  42.                                 for(int i = 0;i<size;i++){
  43.                                         forward = interceptorArray[i].beforeAction(mapping, form, request, response);
  44.                                         if(forward!=null){
  45.                                                 return forward;                                       
  46.                                         }
  47.                                 }                                               
  48.                                 forward = delegateAction.execute(mapping, form, request, response);
  49.                                 for(int i = 0;i<size;i++){
  50.                                         interceptorArray[i].afterAction(mapping, form, request, response);
  51.                                 }
  52.                        
  53.                         }catch(Exception e){
  54.                                 e.printStackTrace();
  55.                                 logger.error("In execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response), Exception Occured ! Info :" + e.getLocalizedMessage());
  56.                                 for(int i = 0;i<size;i++){
  57.                                         forward = interceptorArray[i].throwsAction(mapping, form, request, response,e);
  58.                                         if(forward!=null){
  59.                                                 return forward;
  60.                                         }
  61.                                 }
  62.                         }
  63.                 }else{
  64.                         forward = delegateAction.execute(mapping, form, request, response);
  65.                 }
  66.                 return forward;
  67.         }       

  68. }

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-6 13:23:23 | 显示全部楼层

  1. /*
  2. * 创建日期 2005-4-6
  3. *
  4. */
  5. package com.bupticet.strutsinterceptor;

  6. import java.io.IOException;
  7. import java.util.Enumeration;

  8. import javax.servlet.ServletException;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;

  11. import org.apache.struts.action.ActionForm;
  12. import org.apache.struts.action.ActionForward;
  13. import org.apache.struts.action.ActionMapping;
  14. import org.apache.struts.config.ActionConfig;

  15. /**
  16. * <p>Title:PrintInfoInterceptor </p>
  17. *
  18. * <p>Description: 执行Action的前后以及异常抛出时均打印提示信息,用于调试</p>
  19. *
  20. * <p>Copyright: Copyright (c)北京邮电大学网络教育技术研究所[[url]www.buticet.com][/url] 2005</p>
  21. *
  22. * <p>Company: 北京邮电大学网络教育技术研究所[[url]www.buticet.com][/url] </p>
  23. *
  24. * @author LJ-silver E-mail:LJ-silver@163.com
  25. * @version 1.0
  26. */
  27. public class PrintInfoInterceptor implements ActionInterceptor{

  28.         static org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(PrintInfoInterceptor.class);
  29.         /*
  30.          * @see com.bupticet.strutsinterceptor.ActionInterceptor#beforeAction(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
  31.          */
  32.         public ActionForward beforeAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  33.                 logger.info("====================before run======================");
  34.                 logger.info("=====================================================================");
  35.                 for(Enumeration e = request.getAttributeNames();e.hasMoreElements();){
  36.                         Object o = e.nextElement();
  37.                         logger.info((String)o+":"+request.getAttribute((String)o));
  38.                 }
  39.                 logger.info("=====================================================================");
  40.                 ActionConfig actionConfig = (ActionConfig)request.getAttribute("org.apache.struts.action.mapping.instance");
  41.                 String parameter = actionConfig.getParameter();
  42.                 if(null!=request.getParameter(parameter)){
  43.                         logger.info((String)request.getParameter(parameter));
  44.                 }
  45.                 logger.info("=====================================================================");
  46.                 return null;
  47.         }

  48.         /*
  49.          * @see com.bupticet.strutsinterceptor.ActionInterceptor#afterAction(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
  50.          */
  51.         public void afterAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
  52.                 logger.info("====================after run======================");
  53.         }

  54.         /*
  55.          * @see com.bupticet.strutsinterceptor.ActionInterceptor#throwsAction(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Exception)
  56.          */
  57.         public ActionForward throwsAction(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {
  58.                 logger.info("====================throw run======================");
  59.                 return null;
  60.         }


  61. }

复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表