天天看点

Struts控制器

ActionServlet组件

RequestProcessor组件

Action组件

ActionForward组件

内置的Action组件

利用ToKen解决重复提交

Struts控制器概述

Struts控制器组件负责接收用户请求、更新模型,以及选择合适的视图组件返回给用户。控制器组件有助于将视图层和模型层分离,有了这种分离,就可以在同一个模型的基础上得心应手地开发多种类型的视图。Struts控制器组件主要包括:

ActionServlet组件

Struts框架的中央控制器。

RequestProcessor组件

每个子应用模块的请求处理器。

Action组件

负责处理一项具体的业务。

Struts框架采用ActionServlet和RequestProcessor组件进行集中控制,并采用Action组件来处理单项业务。

ActionServlet组件

org.apache.struts.action.ActionServlet类是Struts框架的核心控制器组件,所有的用户请求都先由ActionServlet来处理,然后再由ActionServlet把请求转发给其他组件。Struts框架只允许在一个应用中配置一个ActionServlet类,在应用的生命周期中,仅创建ActionServlet类的一个实例,这个ActionServlet实例可以同时响应多个用户请求。

具体完成的功能:

1.ActionServlet将一个来自客户端的URI映射到一个相应的Action类,如果这个Action类是第一次被调用,那么实例化一个Action类并将其放入至缓存中。

2.如果在配置文件(struts-config.xml)中指定了相应的ActionForm,那么从Request中抓取数据填充FormBean。

3.调用Action类的execute ()方法,传入ActionMapping的一个引用、对应的ActionForm、以及由容器传给ActionServlet的HttpServletRequest、HttpServletResponse对象。

4.execute()方法返回一个ActionForword对象,通过此对象即可连接到相应的JSP页面。

RequestProcessor组件

对于多应用模块的Struts应用,每个子应用模块都有各自的RequestProcessor实例。在ActionServlet的process()方法中,一旦选择了正确的子应用模块,就会调用子应用模块的RequestProcessor实例的process()方法来处理请求。在ActionServlet调用这个方法时,会把当前的request和response对象传给它。

Struts框架只允许应用中存在一个ActionServlet类,但是可以存在多个客户化的RequestProcessor类,每个子应用模块都可以拥有单独的RequestProcessor类。如果想修改RequestProcessor类的一些默认功能,可以覆盖RequestProcessor基类中的相关方法。

Action组件

Action类是用户请求和业务逻辑之间的桥梁。在实际项目发开中,我们会根据需求扩展不同的Action组件。也就是创建一个继承自Action的子类,然后重写它的execute()方法。

常用方法    说明

execute()    Action接收到正确的请求时,则自动调用

getLocale()    获得请求相关联的区域

setLocale()    设置请求相关联的区域

getResources()    获得消息资源

isCancelled()    检查用户是否点击了表单上的”取消”键

addMessages()    存储提示信息

addErrors()    存储错误信息

ActionForward组件

Action类的execute()方法返回一个ActionForward对象。ActionForward对象代表了Web资源的逻辑抽象,这里的Web资源可以是JSP、Servlet或Action。

从execute()方法中返回ActionForward对象有两种方法:

1.return new ActionForward(“yes”,”yes.jsp”,false);

2.return mapping.findForward(“yes”);

内置的Action组件

ForwardAction

IncludeAction

DispatchAction

LookupDispatchAction

SwitchAction

ForwardAction

对于用户自定义的Action类,既可以负责请求转发,还可以充当客户端的业务代理。如果仅仅需要Action类提供请求转发功能,则可以使用ForwardAction类。ForwardAction类专门用于转发请求,不执行任何其他业务操作。

IncludeAction

在JSP网页中,尽管可以直接通过<include>指令包含另一个Web组件,但是Struts框架提倡先把请求转发给控制器,再由控制器来负责包含其他Web组件。IncludeAction类提供了包含其他Web组件的功能。与ForwardAction一样,Web组件通过IncludeAction类来包含另一个Web组件,可以充分利用Struts控制器的预处理功能。

DispatchAction

通常,在一个Action类中只能完成一种业务操作,如果希望在同一个Action类中完成一组相关的业务操作,可以使用DispatchAction类。

LookupDispatchAction

LookupDispatchAction类是DispatchAction类的子类,在LookupDispatchAction类中也可以定义多个业务方法。通常LookupDispactchAction主要应用于在一个表单中有多个提交按钮,而这些按钮又有一个共同的名字的场合,这些按钮的名字和具体的ActionMapping的parameter属性值相对应。

SwitchAction

SwitchAction类用于子应用模块之间的切换。

对于请求访问SwitchAction的URL,需要提供两个参数:

prefix:指定子应用模块的前缀,以“/”开头,默认子应用模块的前缀为空字符串“”

page:指定被请求Web组件的URI,只需指定相对于被切换后的子应用模块的相对路径

利用Token解决重复提交

在某些情况下,如果用户对同一个HTML表单多次提交,Web应用必须能够判断用户的重复提交行为,以做出相应的处理。

我们可以利用同步令牌[Token]机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。在Action类中提供了一系列和Token相关的方法:

1.protected void saveToken(HttpServletRequest request)创建一个新的令牌,并把它保存在当前session范围内

2.protected boolean isTokenValid(HttpServletRequest request)判断存储在当前用户session中的令牌值和请求参数中的令牌值是否匹配

3.protected void resetToken(HttpServletRequest request)从当前session范围内删除令牌属性