扩展Struts1.x核心类

系统 1544 0

在Struts 1.1后新增RequestProcessor类别,有关于使用者请求的处理分配等动作已经大部份交由RequestProcessor来处理,下图是ActionServlet接收到请求之后的一些主要动作,藉由这张图可以了解struts-config.xml的组件设定意义,以及Struts运作的方式。下面将分两点来介绍如何扩展Struts核心类。

 

1. 扩展 RequestProcessor

RequestProcessor Struts 的核心类,而 Struts 的核心控制器是 ActionServlet 。但 ActionServlet 并未完成真正的处理,只是调用 RequestProcessor,它 才是 Struts 的核心处理类。可以继承 RequestProcessor ,并改写其中的 processXXXXX ()方法来自定义请求的处理方式, 扩展 RequestProcessor 的实例在 Spring 中有个示范, 提供的 Delegating RequestProcessor 是一个很好的示例。 RequestProcessor 包含了如下主要方法。

  • ActionForm processActionForm(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping):  填充 ActionForm 时执行该方法。
  • Action processActionCreate(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws IOException:  调用 Action 时调用该方法。
  • boolean processPreprocess(HttpServletRequest request,HttpServletResponse response):  预处理用户请求时执行该方法。
  • boolean processValidate(HttpServletRequest request,HttpServletResponse response, ActionForm form, ActionMapping mapping)throws IOException, ServletException, InvalidCancelException: 处理输入校验时调用该方法。

扩展 RequestProcessor 只需两步即可。

1>. 继承 RequestProcessor 实现自定义的 processXXXXX() 处理方法。下面是一个权限处理实例:

    /**
   * 用户认证方法
  */
@Override
protected boolean processRoles(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping)
    throws IOException, ServletException {
   // 得到映射的路径
  String path = mapping.getPath();
  // 得到用户所要调用的Action方法的名字
  String method = request.getParameter(mapping.getParameter());
  if (SqeStringUtils.isEmpty(method)) {
      method = StrutsConstants.DEFAULT_METHOD;
      }

  // 取得不需要校验权限的Action方法
  String[] roles = mapping.getRoleNames();
   if (roles != null && roles.length > 0) {
      // 进行方法的判断
     for (String role : roles) {
            if (method.equals(role)) {
                 request.setAttribute(StrutsConstants.REQUEST_CHECK_FLAG,true);
                    return true;
                   }
              }
         }

   // 得到Session对象和用户对象
  HttpSession session = request.getSession();
   User u = (User) session.getAttribute(StrutsConstants.SESSION_USER);

   // 如果用于对象不存在,那么说明用户没有登录
   if (u == null) {
      // 用户没有执行的权限,跳转到错误页面
     processLocale(request, response);
       RequestDispatcher rd = request.getRequestDispatcher("/vote/errors/noauthority.jsp");
       rd.forward(request, response);
       return false;
      }

    // 判断用户是否为超级用户
   String superusers = SqeConfigUtil.getSysConfigValue(ConfigConstants.SUPER_USER);
    String[] users = SqeStringUtils.splitString(superusers,ConfigConstants.USER_DELIM);
    if (SqeStringUtils.contains(users, u.getName())) {request.setAttribute(StrutsConstants.REQUEST_CHECK_FLAG, true);
       return true;
       }

   // 得到用户的角色信息
   Cache cache = CacheFactory.getCache();
     Role role = (Role) cache.get(u.getUserType());
     if (role == null) {
          throw new SqeSystemException("Couldn't find the role!");
       }

   // 进行用户执行功能的判断
    Set<Function> functions = role.getFunctions();
      for (Function function : functions) {
         Set<Action> actions = function.getActions();
         for (Action action : actions) {
             if (path.equals(action.getPath())&& method.equals(action.getParameter())) {
                 request.setAttribute(StrutsConstants.REQUEST_CHECK_FLAG,true);
                 return true;
                 }
             }
          }

   // 用户没有执行的权限,跳转到错误页面
   processLocale(request, response);
     RequestDispatcher rd = request.getRequestDispatcher("/vote/errors/noauthority.jsp");
     rd.forward(request, response);
     return false;
 }

 @Override
 protected void processLocale(HttpServletRequest request, HttpServletResponse response) {
     super.processLocale(request, response);
     try {
           request.setCharacterEncoding("utf-8");
         } catch (Exception ex) {}
   } 
  

 

2>. 在 struts-config.xml 文件中配置 SqeRequestProcessor 。用户重写了 RequestProcessor ,但 Struts 并不知道,必须配置才可以。下面是配置本示例:

      <controller>  
 <set-property property="processorClass" value="sqe.janier.struts.SqeRequestProcessor" />  
 <set-property property="contentType" value="text/html; charset=utf-8" />  
 <set-property property="nocache" value="true"/>  
</controller>
    
Struts 1.1 后,新增了 <controller> 标签,它可以用于指定 ActionServlet 的一些参数,在 Struts 1.1 之前,这些参数是在 <init-params> 中加以指定,使用 <controller> 标签,应用程式中不同的模组也可以指定各自的参数给 ActionServlet

 

注意: 重写 RequestProcessor 的方法时,别忘了使用 super 来调用父类的动作。

 

2. 扩展 ActionServlet

通常是将 ActionServlet 当作黑盒子,只要使用它,然而也可以继承 ActionServlet 来定义自己的控制器,但由于在 Struts 1.1 后大部份的请求已经委托 RequestProcessor 来处理,继承 ActionServlet 来定义自己的控制器处理请求意义已经不大,通常的目的是重新定义 ActionServlet init() 方法,增加自己的初始化动作。

 

如果需要在开始处理请求,或者处理结束之后加入自己的处理时,可对 ActionServlet 进行扩展。例如解决中文的编码问题。

 

ActionServlet 接收处理请求参数时,并不是按 UTF-8 的解码方式处理请求,因此容易形成乱码。为了解决该问题,可以强制指定 ActionServlet 使用 GBK 的解码方式。实现该功能只需两步骤。

 

1>. 继承 ActionServlet ,实现自定义处理方法:

      public class MyActionServlet extends ActionServlet {
 protected void process(HttpServletRequest request, HttpServletResponse response)
         throws IOException,ServletException {
      request.setCharacterEncoding("UTF-8"); 
      super.process(request,response);
    }
}
    
 

在本示例中,重写了 process 方法,该方法是 ActionServlet 处理用户请求的方法。当然,该方法会调用 RequestProcossor 处理,首先在重写该方法的第一行设计解码方式,然后调用父类的方法。

 

2>. 在 struts-config 中配置扩展

web.xml 文件中配置 MyActionServlet 。由于系统改变了 ActionServlet ,因此必须使用 MyActionServlet 来拦截所有的用户请求。

 

下面是 MyActionServlet 的配置代码:

        <servlet>  
    <!-- 配置核心处理器 -->  
    <servlet-name>action</servlet-name>  
    <!-- 使用自己的核心处理器 -->  
    <servlet-class>MyActionServlet</servlet-class>  
    <!-- 配置自动加载 -->  
     <load-on-startup>1<load-on-startup>  
</servlet>
      
 
经过上面的配置, Struts 可以正确处理请求中的中文参数。


扩展Struts1.x核心类


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论