RequestProcessor及其在struts-config.xml中的配置
<controller processorClass="cn.ourbooks.common.MyRequestProcessor" />
通常来讲,好象不常用到。
但如果想从源头抓头对Web层的控制,就非得做一个RequestProcessor的过滤器。
在这里说一个最明显示的例子:
在使用Struts的过程中,对Session Timeout或者客户是否登录的判断往往是放到一个Action基类(继承于Struts的Action)中处理(反正以前我们的系统就是这样的),放到Action基类里的意图很明显是不需要在jsp或每个小处理的Action中处理这种共性的事务。
但是在测试过程中发现,Struts中Form的validate在验证出错后,不会走Action而是直接mapping到错误页面了。这样,我们的Session Timeout的判断机制就不管用了。
这种情况下有时会给客户一个很不友好的感觉。客户输入了很多数据,提示有错(这时有可能已经Session Timeout,但系统没有觉查),改完了,再提交,如果验证通过,此时有可能会告诉客户,您没有登录或是Session Timeout。对于客户来讲大有捶胸顿足的气愤,要提示Session Timeout早提示,偏偏三番五次改正确了,却又提示Session Timeout。
此时怎么办呢?
Struts在诸类框架中的老大地位,决定了其非常强的扩展功能。
我们可以配置自己的RequestProcessor,比如MyRequestProcessor。
重置其中的processValidate方法,在调用父类的processValidate方法之前进行Session Timeout的验证,如果验证不过,就可以转移到公共Session Timeout的页面了,否则,就可以调用父类的processValidate方法。
写完MyRequestProcessor类后,还需要在struts-config.xml中配置一下,格式如下:
<controller processorClass="cn.ourbooks.common.MyRequestProcessor" />
这样,在调用ActionForm的validate方法之前就进行了Session Timeout的验证,使系统对Session Timeout作到有效的把握。
以上只是例一,再谈个例二,例二是个补救的例子。
Struts的RequestProcessor中会维护一个action Map,里面放着用过的Action,在一个请求来了之后,先判断这个请求的action在action Map中是否存在,如果不存在就创建一个,并加到action Map中,如果已经存在,就不创建新的了,取出来用就是了。
默认情况下,Tomcat(AP Searver)中也只是维护着一个Action Servlet,这一连串下来,有一个很关键的问题,我们需要注意,就是在Action中不能声明属性,如果声明了,这个属性是所有请求共享的。举例说明就是,假如在Action中声明了属性,并定义其默认值为123,第一个访问者(请求)将这个属性的值改为了abc,那么第二个访问者(请求)取得这个属性的值时,将得到abc,而不是123。
哈哈,如果有个很糟糕的情况,你的系统已经做的很大了,而且在Action中也定了好多属性,怎么办呢?难道改造所有的Action,那代价太大了。
好了,还是RequestProcessor,我们可以在其子类MyRequestProcessor(也就是上例我们自己做的那个)中,重置processActionCreate方法,大家可以查一下Struts关于RequestProcessor类的源码,找到processActionCreate方法,原封不动拷到MyRequestProcessor中,注释下面几行:
instance = (Action) actions.get(className);
if (instance != null) {
if (log.isTraceEnabled()) {
log.trace(" Returning existing Action instance");
}
return (instance);
}
就实现了每个请求,都创建一个新的Action实例。这样,即使在Action中声明了属性,在多请求的情况下,也互不影响(虽然效率上可能低点,但是总比项目快结束了,再返工的好)。
分享到:
相关推荐
- Struts Controller组件的配置主要涉及ActionServlet的初始化参数,这些参数通常在Web应用的web.xml文件中设置,而不是struts-config.xml。不过,`<controller>`元素可以用来配置与控制器相关的属性,如拦截器...
Struts框架的核心配置文件`struts-config.xml`是整个应用的关键组成部分之一,它定义了应用程序中各个组件(如Action、FormBean等)的行为与交互方式。本文将详细介绍`struits-config.xml`中的关键配置项,并解释其...
4. **ActionMapping**:在struts-config.xml中定义,它将URL映射到特定的Action,同时可以包含关于Action的其他信息,如表单Bean、-forward等。 5. **RequestProcessor**:负责初始化ActionServlet,处理请求并调用...
学习和掌握Struts 1.2.7,开发者需要了解MVC模式、Action、Form Beans、配置文件(struts-config.xml)、国际化、异常处理、以及如何使用JSP标签库和Tiles进行视图设计。同时,理解其与Spring、Hibernate等其他框架...
在struts-config.xml中配置。 5. **Tiles框架集成**:Struts 1.2.9 支持Tiles框架,允许开发者创建可重用的页面布局(Tiles),提高了视图的复用性和可维护性。 6. **国际化与本地化**:Struts支持多语言环境,...
3. **配置文件**:Struts框架的核心配置文件是struts-config.xml,它定义了Action、ActionForm、ActionForward等元素,用于配置URL映射和业务逻辑流程。 4. **ActionForm**:ActionForm对象用来封装请求参数,它是...
2. **Struts配置文件**: 在Struts应用中,`struts-config.xml`是主要的配置文件,定义了Action映射、数据源、以及其他的配置信息。理解这个配置文件对于正确地配置和路由请求至关重要。 3. **RequestProcessor**: ...
- `struts-config.xml`:这是Struts的核心配置文件,定义了数据源、表单bean、全局异常处理、全局转发、动作映射和消息资源。例如,`form-bean`定义了表单bean的名称和对应的Java类,`action`元素定义了处理特定...
2. **使用DelegatingRequestProcessor替换RequestProcessor**:在`struts-config.xml`中,将Struts的RequestProcessor替换为Spring的`DelegatingRequestProcessor`,并在Spring配置文件中定义与Struts `<action-...
- **Struts1**:异常处理不够灵活,需要在struts-config.xml中配置全局异常处理。 - **Struts2**:利用拦截器处理异常,可以创建自定义的异常拦截器,使得异常处理更加模块化和可重用。 6. **页面导航** - **...
5. **配置相关文件**:在struts-config.xml中添加Struts-Spring插件,用于集成Spring。并定义Action,使用Spring的RequestProcessor。 6. **创建包**:按照MVC架构,创建model(实体类)、service(业务逻辑)、dao...
在Struts框架中,struts-config.xml是关键配置文件,它定义了Action、ActionForm、ActionMapping和其他相关组件的配置信息。例如: ```xml <action path="/login" type="com.example.LoginAction"> ...
配置ContextLoaderPlugin非常简单,只需在struts-config.xml文件的插件部分添加以下XML代码: ```xml <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/> ``` 为了自定义配置文件的位置...
开发者需要在项目中引入这三个JAR文件,然后根据需求配置struts-config.xml和tiles-defs.xml文件。在JSP页面上使用Struts标签库,编写Action类来处理业务逻辑,ActionForm用于接收和验证用户输入。在服务器端,...
同时,还需要根据项目需求配置struts-config.xml或struts.xml(在Struts2中),定义动作映射、结果转发和拦截器等。 此外,Struts框架也强调了插件化和模块化,使得开发者可以通过添加额外的插件来扩展其功能,如...
4. **ActionMapping**:描述了Action与请求URL之间的映射关系,它在struts-config.xml配置文件中定义。 5. **RequestProcessor**:处理请求的处理器,每个请求都会经过RequestProcessor的过滤和处理。 6. **Tiles*...
在`struts-config.xml`中,控制器部分(`<controller>`标签)用来配置RequestProcessor类。例如: ```xml <controller processorClass="strutsregprj.MyRequestProcessor"/> ``` 这段配置告诉Struts框架使用`...
当ActionServlet接收到请求后,会根据配置文件(struts-config.xml)中的映射信息调用相应的Action。 3. **ActionForm**:用于收集用户在表单中输入的数据,它继承自org.apache.struts.action.ActionForm。当用户...
在学习和使用Struts API时,开发者需要掌握如何配置Struts-config.xml,创建Action和ActionForm,以及如何利用ActionServlet和ActionMapping进行请求处理。此外,对于高级功能,如Tiles的使用、拦截器的编写,也需要...
2. **Struts1配置**:接着,需要在Struts的配置文件(struts-config.xml)中,将默认的RequestProcessor替换为我们定义的Spring代理RequestProcessor。这样,当Struts接收到HTTP请求时,就会调用我们自定义的代理...