您的位置:首页 > 其它

今天学习得心得

2010-01-15 17:56 344 查看

Action访问servlet API

Struts2 的action 并未直接与任何servlet API 耦合,这是struts 2 改良之处,因为Action类不在与servlet API 耦合,从而能更轻松测试该action。
但对于web 的控制器而言,不访问servlet API 是不可能的,例如跟踪HttpSession的状态等。Struts2框架提供了一种更轻松的方式来访问Servelt API 。web 应用中通常要访问的Servelt API 就是HttpServletRequest 、HttpSession和ServletContext ,着三个类分别代表JSP内置对象中的Request 、Session 、application。
Struts2提供了一个ActionContext类,Struts2的Action可以通过该类访问Servlet API。下面是ActionContext类中包含的几个常用方法。
l Object get(Object key):
获取当前ActionContext里的key 对以的value。该方法可以获取HttpServletRequest的属性。
l Put(String key ,Object value):
将key-value对存入当前ActionContext中。该方法可用于向HttpServletRequest里存入属性。
l Map getApplication(Map application):
返回一个map对象,该对象模拟了该应用的ServletContext实例。
l Void setApplication(Map application):
直接传入一个map实例,该map实例里的key-value对转换成application的属性名、属性值。
l Static ActionContext getContext():
静态方法,获取系统的ActionContext实例。
l Map getParameters() :
获取所有的请求参数。类似于调用了HttpServeltRequest对象的getParameterMap方法。
l Map getSession():
返回一个Map对象,该Map对象模拟了HttpSession实例。
l Void setSession(Map Session):
直接传入一个map实例,将该map实例里的key-value对转换成session 的属性名、属性值。
显然,相比struts1直接访问Servlet API ,struts2 通过ActionContext 访问Servlet API 更加优雅。让Action彻底从Servlet API中分离出来,从而可以脱离web容器运行。最大的好处就是:可以脱离web容器测试Action。

Action 直接访问servlet API

虽然,struts2提供了ActionContext来访问servlet API ,但这种访问毕竟不可能直接访问到Servlet API 实例,为了在Action 中直接访问servlet API ,struts2还提供了如下系列接口。
l ServletContextAware:实现该接口的action可以直接访问web应用的ServletContext实例。
l ServletRequestAware:实现了该接口的Action 可以直接访问用户请求的HttpServletRequest实例。
l ServletResponseAware:实现了改接口的action可以直接访问服务器应用的HttpServletResponse实例。
实现了这些接口时,必须要实现下列方法才行。
Public void setServletRequest(HttpServletRequest request) 方法。其他都是与之对应得,就不啰嗦了。
哦对了,在实现该方法是你是必须要在该action中声明web元素的,不有提供getter 和setter方法。Struts2会帮你去实现。

为了直接实现访问Servlet API ,struts2提供了一个ServletActionContext,这个类包含了如下几个静态方法。
l PageContext getPageContext():获取web应用的PageContext对象。
l HttpServletRequest getRequest():获取web应用的HttpServletRequest对象。
l HttpServletResponse getResponse():获取web应用的HttpServletResponse对象。
l ServletContext getServletContext():获取web应用的ServletContext。
借助于ServletActionContext类的帮助,开发者也可以在Action中直接访问Servlet API,避免Action类需要的实现XxxAware 接口——虽然如此,但该Action依然与Servlet API直接耦合,一样不利于程序解耦。


Struts2 支持的处理结果类型

Struts2默认提供了一系列的结果类型,有必要的话就去看一下struts-default.xml 配置文件。
<result…/> 默认的情况下,result的type属性默认为dispatcher ,这可以在struts-default.xml配置文件中找得到。
下面就归纳一下type属性有几种,个代表着什么意思:
1. chain 结果类型:Action的链式处理的结果类型。
2. chart 结果类型: 用于整合JfeeChart 的结果类型。
3. dispatcher 结果类型:用于jsp 整合的结果类型。
4. httpheader 结果类型:用于控制特殊的Http行为的结果类型。
5. jasper 结果类型:用于jasperReports整合的结果类型。
6. jsf 结果类型:用于与JSF 整合的结果类型。
7. redirect 结果类型:用于直接跳转到其他url的结果集。
8. redirectAction 结果类型:用于直接跳转到其他Action的结果类型。
9. stream 结果类型:用于向浏览器返回一个inputStream (一般用于文件下载)。
10. tiles 结果类型:用于与tiles整合的结果类型。
11. velocity 结果类型:用于与Velocity 整合的结果类型。
12. xslt 结果类型:用于与velocity整合的结果类型。
13. plainText 结果类型:用于显示某个页面的原始代码的结果类型。


使用模型驱动模式时,Action必须实现ModelDriven 接口,实现该接口则必须实现getModel()方法,该方法用于Action和与之对应的Model实例关联起来。
在配置模型驱动action与配置属性驱动的action没什么区别,struts2不要求配置模型对象,既不需要配置一各实体的实例。


Struts2 的异常机制

Struts2的异常处理机制是通过在Struts.xml 文件中配置<exception-mapping…/>元素完成的,配置该元素时,需要指定两个属性。
l exception:此属性指定该异常映射所设置的异常类型。
l result:此属性指定Action 出现该异常时,系统转入result属性所指向的结果。
根据<exception-mapping …/>元素出现位置的不同,异常映射又分为两种。
l 局部异常映射:将<exception-mapping …/> 元素作为 <action…/>元素的子元素配置。
l 全局异常映射: 将<exception-mapping…/>元素作为<global-exception-mapping>元素的子元素配置。
与前面得<result…/>元素配置结果类似,全局映射对应所有的Action都有效,但局部异常映射仅对异常映射所在的Action内有效。如果局部异常映射和全局映射配置了同一个异常类型,在Action内,局部异常映射会覆盖全局异常映射。


未知处理器

从struts2.1 开始 ,struts2配置文件的DTD中增加了<unknown-handler-stack…/>和<unknown-handler-ref…/>,这个元素用于配置Struts2的未知处理器。
当用请求未知Action、或指定action里的未知方法、或action 处理结束之后返回一个未知result ,struts2允许使用处理起来处理这些方法。
未知处理器需要实现 UnknownHandler 接口,该接口里包含来了3个方法:
1. HandleUnknownAction:用户请求未知Action时,该方法见会被回调。
2. HandleUnknownActionMethod: 用户请求指定Action的未知方法时,该方法将会被回调。
3. HandleUnKnownResult: action处理结束之后返回一个位置Result时,该方法将会被回调。

代码如下:
package com.struts2.action;

import org.apache.struts2.dispatcher.ServletDispatcherResult;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.UnknownHandler;
import com.opensymphony.xwork2.XWorkException;
import com.opensymphony.xwork2.config.entities.ActionConfig;

public class MyUnKnownHandler implements UnknownHandler{


/**
* @param namespace 用户请求的action所在的命名空间
* @param actionName 用户请求的Action的名字
* @return 该Action最后生成的ActionConfig,可以返回null
*/
@Override
public ActionConfig handleUnknownAction(String namespace, String actionName)
throws XWorkException {
// TODO Auto-generated method stub
return null;
}

/**
* @param action 用户请求的Action对象
* @param methodName 用户请求的Action 的方法名
* @return 该Action 的该方法处理后返回的Result。
*/

@Override
public Object handleUnknownActionMethod(Object action, String methodName)
throws NoSuchMethodException {
// TODO Auto-generated method stub
return null;
}

/**
* @param actionContext 该result所在ActionContext
* @param actionName 该result所在的Action名
* @param actionCofig 该result所在ActionContext
* @param resultCode 该result所对应的逻辑视图字符串
* @return 将要被处理的结果,可以返回null
*/
@Override
public Result handleUnknownResult(ActionContext actionContext, String actionName,
ActionConfig actionConfig, String resultCode) throws XWorkException {
// TODO Auto-generated method stub
actionContext.put("action", actionName);
actionContext.put("result", resultCode);
return new ServletDispatcherResult("/unknownResult.jsp");
}

}

相关的配置:
<!-- 使用bean 定义一个UnknownHandler -->
<bean name="yeekuHandler" type="com.opensymphony.xwork2.UnknownHandler"
class="com.struts2.action.MyUnKnownHandler"></bean>

<package name="unknown" extends="struts-default" namespace="/unknown">
<!-- 定义处理用户请求的Action -->
<action name="myAction" />
</package>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: