`
sqe_james
  • 浏览: 264874 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

扩展Struts1.x核心类

阅读更多

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

 

1. 扩展RequestProcessor

RequestProcessorStruts的核心类,而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来定义自己的控制器处理请求意义已经不大,通常的目的是重新定义ActionServletinit()方法,增加自己的初始化动作。

 

如果需要在开始处理请求,或者处理结束之后加入自己的处理时,可对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常用的开发包,需要学习struts1.x朋友可以下载

    下面我们将详细探讨Struts1.x的一些核心知识点。 1. **MVC模式**:MVC是软件设计中的一个经典模式,Struts1.x实现了这一模式,将业务逻辑(Model)、用户界面(View)和控制流程(Controller)分离,提高了代码的可...

    struts1.x和struts2.x区别

    在Struts1.x中,Action是核心组件之一,它必须继承自org.apache.struts.action.Action类,并且需要覆盖execute方法。Action对象由框架创建和管理,每一个HTTP请求都对应一个Action实例。然而,在Struts2.x中,Action...

    struts1.x技术课程讲解.pdf

    2. **ActionServlet**:Struts1.x 的核心组件,负责初始化框架、接收 HTTP 请求并将请求分发给相应的 Action 类处理。 3. **ActionMapping**:配置文件 struts-config.xml 中定义的一个节点,用于描述一个 Action ...

    Struts1.x系列教程(网摘-全)

    2. **Action类**:每个HTTP请求都对应一个Action类,这是Struts1.x的核心组件。Action类处理用户请求,执行相应的业务逻辑,并通过ActionForward决定响应的视图。 3. **配置文件**:主要包括struts-config.xml,这...

    struts1.x apps 所有最新的Struts1.x项目应用

    5. **Tiles**:Struts1.x的一个扩展,允许创建可重用和可组合的页面布局。 6. **JSP标签库**:提供了多种预定义的JSP标签,简化了视图层的开发,如logic、bean、html等标签。 7. ** strutss.properties** 和 **...

    Struts1.x_Project.zip

    Struts1.x是一个经典的Java Web开发框架,它遵循Model-View-Controller(MVC)设计模式,用于构建可维护性和可扩展性高的企业级应用程序。在这个"Struts1.x_Project.zip"压缩包中,我们可以看到一个使用Struts1.x...

    struts1.x 最简洁国际化 源代码

    以下是关于Struts1.x国际化的一些核心知识点: 1. **资源包(Resource Bundle)**: - 在Java中,资源包是包含本地化字符串和其他可配置资源的文件。对于Struts1,这些通常以`.properties`格式存储,例如`messages...

    struts1.x多文件上传

    在Struts1.x中实现多文件上传,主要涉及以下几个核心概念和步骤: 1. **表单设计**:首先,你需要创建一个HTML表单,包含`&lt;input type="file"&gt;`字段,允许用户选择多个文件。每个文件输入字段应设置不同的name属性...

    Struts1.x入门与提高系列教程.pdf

    通过本系列教程的学习,读者将能够掌握Struts 1.x框架的基本使用方法,了解其核心组件和配置,并能够通过实践来加深对Struts 1.x开发过程的理解。同时,通过与Struts 2.x的比较,读者可以更深入地理解Web应用框架的...

    Struts1.x-Jdbc,学习Struts1.的曾删改查

    - **Action类**:这是Struts1的核心组件,负责处理HTTP请求,通常一个Action类对应一个业务逻辑。 - **配置文件**:`struts-config.xml`是Struts1的配置文件,定义了Action类和ActionForm对象,以及URL到Action的...

    struts1.x 和 struts2.x向Action里填充jsp参数原理

    本篇文章将深入探讨Struts1.x和Struts2.x在向Action中填充JSP参数的原理。 Struts1.x的工作原理: Struts1的核心是ActionServlet,它是一个实现了Servlet接口的控制器。当用户发起HTTP请求时,请求会被Dispatcher...

    Struts1.x.rar

    1. **Struts1.x框架介绍**:Struts1.x是MVC(Model-View-Controller)设计模式的一个实现,它将业务逻辑、数据模型和用户界面分离开来,使得代码更易于维护和扩展。框架提供了控制器Servlet(ActionServlet)来处理...

    Struts1.x_action

    在Struts1.x中,Action类是核心组件之一,它负责处理HTTP请求,并将这些请求映射到相应的业务逻辑。Action类通常继承自`org.apache.struts.action.Action`基类,并覆盖其execute方法。执行execute方法时,Action会...

    struts1.x 常用知识详解

    3. **配置文件**:`struts-config.xml`是Struts1.x的核心配置文件,用于定义Action、ActionForm、ActionForward等元素,以及数据源和国际化资源等。 二、ActionForm与数据绑定 1. **ActionForm**:ActionForm对象...

    Struts1.x-Hibernate,曾删改查

    在Struts1.x中,Action类是核心,它接收请求并处理业务逻辑,然后通过ActionForm对象传递数据到模型层。配置文件struts-config.xml定义了Action的映射和数据流的方向。此外,Struts1.x还引入了Tiles框架,用于页面...

    Struts2与Struts1.x的深度比较

    总结来说,Struts2在保留Struts1.x核心优势的基础上,通过引入拦截器、类型转换、AJAX支持等新特性,提升了开发效率,降低了维护成本,从而成为了更好的Web开发框架选择。虽然Struts1.x仍有一定的用户基础,但Struts...

    Struts1.x其它文本编辑器使用SQL2005.rar

    1. **Struts1.x框架核心概念**: - Action:处理用户请求的业务逻辑组件。 - Form Bean:用于在视图和控制器之间传递数据的对象。 - DispatchAction:Struts1.x中的一种扩展Action,可以处理多个请求方法,每个...

    Struts1.x API参考手册+中文帮助

    1. **Action类**:这是Struts1.x的核心,每个Action类代表一个业务逻辑单元。当用户发起请求时,Struts框架会根据配置文件找到对应的Action实例来处理请求。 2. **ActionForm**:用于封装HTTP请求参数,将表单数据...

    Struts1.x 的核心源码(研究下框架怎样构成)

    在Struts1.x框架中,有几个核心概念和组件值得深入理解: 1. **ActionServlet**:这是Struts1的核心控制器,它是Servlet的一个子类。ActionServlet接收HTTP请求,解析请求参数,然后根据配置文件(struts-config....

    struts1.x实现的网上书店示例

    Struts1.x是一个经典的Java Web开发框架,它遵循Model-View-Controller(MVC)设计模式,用于构建可维护性和可扩展性高的企业级应用程序。在这个"网上书店示例"中,开发者运用Struts1.x框架来简化了JSP文件的管理和...

Global site tag (gtag.js) - Google Analytics