首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

struts2 配备 Action(三)

2012-11-20 
struts2 配置 Action(三)一。模型驱动??????? Struts2 可以把请求参数放在 action 中 , 也可以像 Struts1

struts2 配置 Action(三)

一。模型驱动

??????? Struts2 可以把请求参数放在 action 中 , 也可以像 Struts1 一样 使用 form 和 action 对应。

???? ? 模型驱动的含义:使用模型封装了所有的数据,贯穿整个 MVC 流程;模型的作用是封装用户的请求参数和处理结果

public class UserBean{private String username;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}}
?
public class LoginAction extends ActionSupport implements ModelDriven<UserBean>{private UserBean model = new UserBean();public String execute() throws Exception{return SUCCESS;}public UserBean getModel(){return model;}}

????? 使用模型模式,Action 必须实现 ModelDriven 接口,和该接口中的 getModel()方法,该方法把 Action 和与之对应的 Model 实例关联起来。

?

????? 模型驱动的 Action 和 属性驱动的 Action 没有任何区别, Struts2 不要求在 xml 配置 模型对象。( Struts-default.xml 中已经定义了模型驱动的拦截器 )


页面输出:

 <!-- 使用表达式输出 Action 实例中 model 属性的 username 属性 -->   <s:property value="model.username" />
?

如果 Action 实例中 没有 username 属性,并且采用了模型驱动模式,系统将自动输出该 Action 关联的 model 的 username 属性值。

以上代码可以改成:

 <!-- 使用表达式输出 Action 实例中 model 属性的 username 属性 -->   <s:property value="username" />

?

模型驱动 和 属性驱动 各有利弊。 模型驱动结构清晰,但编程繁琐(需要额外的 JavaBean 来作为模型);属性驱动则编程简洁,但结构不够清晰。

?

?

二。Struts2 异常机制 (Struts2 异常处理)


   之前都是在 Action 中使用 try catch 捕获异常,如果改变异常处理方式就要改代码,这很糟糕。所以最好的办法是通过声明式的方式管理异常处理

?

1.声明式异常捕捉

???? Struts2 通过 struts.xml 文件中配置 <exception-mapping .../> 处理异常。该元素有2个属性:

???? exception: 指定该异常映射所设置的异常类型

?? result:??????? 指定 Action 出现该异常时,系统转入 result 属性所指向的结果。

?

根据<exception-mapping .../>位置不同,异常映射又分 2 种:

?? 局部异常映射:<exception-mapping .../>为 <action> 元素的子元素

?? 全局异常映射: <exception-mapping .../>为 <global-exception-mappings> 元素的子元素


Action

public class LoginAction extends ActionSupport {private String username;public String execute() throws Exception{if(username.equals("1")){throw new MyException("自定义异常!");}if(username.equals("2")){throw new java.sql.SQLException("用户名不能为 2 ");}return SUCCESS;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}}

?

struts.xml

<package name="lee" extends="struts-default">    <global-results>                <result name="sql">/exception.jsp</result>        <result name="root">/exception.jsp</result>    </global-results>    <!-- 定义所有的全局异常映射 -->    <global-exception-mappings>        <!-- 抛出 SQLException 异常时,转入名为 sql 的 result -->    <exception-mapping exception="java.sql.SQLException" result="sql"/>     <!-- 抛出 Exception 异常时,转入名为 root 的 result -->    <exception-mapping exception="java.lang.Exception" result="root"/>    </global-exception-mappings>    <!-- 配置 action --><action name="Login" type="redirectAction">           <!-- 下面配置了一个局部异常映射,当 Action 抛出 lee.MyException 时,             转入名为 my 的结果 -->   <exception-mapping exception="lee.MyException" result="my"/>   <param name="my">/exception.jsp</param>      <param name="error">/error.jsp</param>   <param name="success">/welcome.jsp</param>   </result></action></package>
?

注意:全局异常映射的 result 属性值通常不要使用局部结果,局部异常映射的 result 属性值既可以使用全局结果,也可以使用局部结果。

?

2.输出异常信息

<s:property value="exception" /> : 输出异常对象本身

<s:property value="exceptionStack" /> :输出异常堆栈信息

<s:property value="exception.message" /> : 输出异常对象的 message 属性值


Struts1 只能输出异常对象的 message 属性值,不能输出堆栈信息

?

三。未知处理器

?

从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时,该方法将会被回调。??????

代码如下:

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 */@Overridepublic ActionConfig handleUnknownAction(String namespace, String actionName)throws XWorkException {return null;}/** * @param action 用户请求的Action对象 * @param methodName 用户请求的Action 的方法名 * @return 该Action 的该方法处理后返回的Result。 */@Overridepublic Object handleUnknownActionMethod(Object action, String methodName)throws NoSuchMethodException {return null;}/** * @param  actionContext  该result所在ActionContext * @param  actionName     该result所在的Action名 * @param  actionCofig    该result所在ActionContext * @param  resultCode     该result所对应的逻辑视图字符串 * @return 将要被处理的结果,可以返回null */@Overridepublic Result handleUnknownResult(ActionContext actionContext,String actionName,ActionConfig actionConfig, String resultCode) throws XWorkException {actionContext.put("action", actionName);actionContext.put("result", resultCode);return new ServletDispatcherResult("/unknownResult.jsp");}}

?

相关的配置:

<!-- 使用bean 定义一个UnknownHandler --><bean name="yeekuHandler" type="com.opensymphony.xwork2.UnknownHandler"extends="struts-default" namespace="/unknown"><!-- 定义处理用户请求的Action --><action name="myAction" /></package><!-- 定义本系统的 UnknownHandler 栈 --><unknow-handler-stack><unknow-handler-ref name="yeekuHandler" /></unknow-handler-stack>

? 上面配置中配置了一个 myAction ,该 Action 没有 class 属性,表明该 Action 将使用 ActionSupport 作为处理类。并且该 Action 没有 <result> 子元素,这意味着当用户向该 Action 请求后将返回一个未知 Result。向该 myAction.action 发送请求后,总转入 unknownResult.jsp 页面


?

?

?

?

?

热点排行