创建你自己的RequestProcessor
通过上面,我们了解到了RequestProcessor的默认实现是如何工作的。现在我们要演示一个例子来说明如何定制你自己的RequestProcessor。为了展示创建用户定制的RequestProcessor,我们将会让我们的示例实现下面两个业务需求:
·我们想创建一个ContactImageAction类,它将生成图片而不是平常的HTML页面。
·在每个请求处理之前,我们都想通过检查session中的userName属性来确定用户是否已经登陆。如果那个属性没有找到,我们会把用户重定向到登陆页面。
我们将分两步实现这些业务需求。
1、创建你的CustomRequestProcessor类,它将继承自RequestProcessor类,如下:
public class CustomRequestProcessor
extends RequestProcessor {
protected boolean processPreprocess (
HttpServletRequest request,HttpServletResponse response) {
HttpSession session = request.getSession(false);
//If user is trying to access login page
// then don't check
if( request.getServletPath().equals("/loginInput.do")
|| request.getServletPath().equals("/login.do") )
return true;
//Check if userName attribute is there is session.
//If so, it means user has allready logged in
if( session != null && session.getAttribute("userName") != null)
return true;
else{
try{
//If no redirect user to login Page
request.getRequestDispatcher("/Login.jsp").forward(request,response);
}catch(Exception ex){
}
}
return false;
}
protected void processContent(HttpServletRequest request,
HttpServletResponse response) {
//Check if user is requesting ContactImageAction
// if yes then set image/gif as content type
if( request.getServletPath().equals("/contactimage.do")){
response.setContentType("image/gif");
return;
}
super.processContent(request, response);
}
}
在CustomRequestProcessor类的processPreprocess方法中,我们检查session的userName属性,如果没有找到,就将用户重定向到登陆页面。
对于生成图片作为输出的需求,我们必须覆盖processContent方法,首先检查请求是否是/contactimage路径。如果是的话,我们就会将contentType设置为image/gif;否则设置为text/html。
2、在你的struts-config.xml文件的<action-mappint>元素之后加入下面的文字,告诉Struts CustomRequestProcessor应当被用作RequestProcessor类:
<controller>
<set-property property="processorClass"value="com.sample.util.CustomRequestProcessor"/>
</controller>
请注意,当你只有很少的action类需要生成非text/html类型的输出时,你覆写processContent()方法是OK的。如果不是这样子的话,你应该创建一个Struts的子应用来处理请求生成图片的Action,并为它们将contentType设置为image/gif。
Struts的Tiles框架就是使用它自己的RequestProcessor来装饰Struts的输出。
ActionServlet
如果你查看你的Struts web应用的web.xml,你会看到这样的文字:
<web-app >
<servlet>
<servlet-name>action=</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<!-- All your init-params go here-->
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app >
这意味着ActionServlet负责处理你所有Struts的请求。你可以创建一个ActionServlet的子类,当应用启动,关闭,每个请求的时候做一些特定的事情。但是在继承ActionServlet类之前,你应该尽量创建一个PlugIn或RequestProcessor去解决你的问题。在Servlet1.1之前,Tiles框架是基于ActionServlet来修饰生成的响应。但是从1.1之后,它开始使用TilesRequestProcessor类。
总结
决定开发你自己的MVC框架是一个非常大的决定,你必须要考虑开发和维护框架代码所花费的时间和资源。Struts是一个非常强大和稳定的框架,你可以修改它来满足你绝大多数的业务需求。
但另一方面,也不要草率地做出扩展Struts的决定。如果你在RequestProcessor中写了一些性能比较低的代码,它将会在每次请求时执行,因而降低你整个应用的效率。而且还是有一些情况,开发自己的MVC框架要比扩展Struts好。
http://hi.baidu.com/ng520tx/blog/item/05d9783ee317b93e70cf6c94.html
分享到:
相关推荐
众所周知,struts2宣称freemarker模板中不再支持自定义标签,但如果工程UI仅用freemarker模板可以通过扩展struts标签简单实现,不是采用官方不推荐的配置JspSupportServlet实现的!内付详细说明及范例,此方法仅为团队...
本话题将深入探讨如何使用FreeMarker扩展Struts2的标签库,以增强视图层的表现力和灵活性。 首先,FreeMarker是一个基于模板的语言,它允许开发者用简单的语法来处理数据模型并生成HTML或其他文本。在Struts2中,...
3. **插件**:Struts2社区提供了许多插件,如Tiles插件用于布局管理,FreeMarker插件支持使用FreeMarker模板语言,以及Dojo插件用于与Dojo JavaScript库集成。这些插件扩展了Struts2的功能,使得开发者可以快速集成...
标题提到的"扩展Struts1.x标签"指的是开发者根据项目需求自定义了Struts1.x的标签库,增加了新的功能,例如Select和Table标签。 1. **Select标签**: Select标签是用于在HTML表单中创建下拉选择框的。原生的Struts...
使用一个Struts应用的示例来示范如何使用这三种方式来扩展Struts。两个扩展Struts成功的范例是Struts自身的Validation和Tiles框架 用到了Hibernate, Spring, Struts的结构 此源代码教程: ...
本篇文章将详细介绍如何在Struts2中去除.action后缀,以及Struts1中隐藏.do扩展名,使URL更加简洁。 首先,让我们来看看Struts2的情况。在Struts2中,默认情况下,所有的请求都会映射到.action结尾的URL上。为了...
本文旨在介绍如何利用Turbine的事件映射扩展Struts的功能,使得Struts的Action类可以更加灵活和高效。 【详细知识点】: 1. **Turbine与Struts的比较**: - Turbine是一个全面的Web应用框架,而Struts更专注于MVC...
7. **插件架构**:Struts 2的插件体系使得扩展和定制变得简单,如 strut2-dojo-plugin 提供了与Dojo JavaScript库的集成。 整合Struts 1和Struts 2涉及到的主要工作包括: 1. **Action映射**:将Struts 1的Action...
- 在 Struts1 中,Action 类需要继承自一个抽象基类,这限制了其可扩展性和定制性。而 Struts2 改进了这一点,Action 类可以实现 Action 接口,也可以实现其他接口,提供了更多的灵活性。ActionSupport 类则提供了...
2. 可扩展性:Struts2 框架提供了一个可扩展的架构,可以轻松地添加新的功能。 3. 高效性:Struts2 框架提供了一个高效的架构,可以快速地处理用户的请求。 Struts2 框架的应用场景 Struts2 框架的应用场景包括: ...
由于Struts2提供了更现代的特性和更好的可扩展性,通常被认为比Struts1有更高的开发效率和维护性。 总的来说,Struts2是对Struts1的一次重大升级,它在许多方面进行了优化和增强,包括更强大的控制层、更灵活的视图...
- **Struts2**:继承了Struts1的Front Controller模式,并引入了拦截器(Interceptor)机制,使得扩展性和灵活性更强。拦截器链允许在请求到达Action之前和之后执行自定义逻辑。 2. 表达式语言(EL)支持: - **...
这些插件通过扩展Struts2的能力,使得开发者能够构建更复杂、更灵活的应用。 总的来说,Struts2接口文档是学习和使用Struts2框架不可或缺的工具,它能帮助开发者高效地理解和使用框架提供的各种组件和接口,提升...
Struts1和Struts2是两个非常著名的Java Web框架,...总的来说,Struts2在设计上更加灵活、可测试和可扩展,而Struts1则相对更注重基础功能和简单的实现。在实际项目中,开发者会根据具体需求和项目规模选择适合的框架。
如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,struts是一个不错的选择。 1 Struts框架应用模式 1)建立在MVC这种公认的好的模式上的,struts在M,V,C上都有涉及,但它主要是提供一个好的控制器和...
1. **灵活性**:Spring MVC允许更多的自定义,如自定义拦截器、视图解析器,而Struts2的扩展性相对弱些。 2. **依赖注入**:Spring MVC是Spring框架的一部分,天然支持DI,而Struts2需要额外集成Spring才能实现DI。 ...
最后,在验证功能上,Struts1支持在ActionForm的validate方法中进行手动验证,或者使用Commons Validator扩展。Struts2提供了更高级的验证机制,可以通过注解或配置文件定义验证规则,甚至可以对子对象进行验证。 ...