Struts2学习笔记

Struts2配置处理结果
struts2 标签写在一行里,页面分行显示,页面会自动打出很多标签,如:tr、td 等,这真是令我很不爽,查了一下,原来struts2提供三种theme(主题),ajax、simple、xhtml(默认),在项目中修改主题即可:最简单的解决办法在 struts.xml 中加入
<constant name="struts.ui.theme" value="simple" />

访问ServletAPI
ActionContext可以获取Session以及Application
ServletActionContext直接获取Servlet对象属性

直接访问ServletAPI
实现ServletRequestAware能够访问HttpServletRequest
实现ServletResponseAware能够访问HttpServletResponse
实现ServletContextAware能够直接访问ServletContext

struts2支持结果类型
chain        Action链接的结果类型
chart        整合JfreeChart的结果类型
dispatcher     JSP整合的结果类型
freemaker      FreeMaker整合的结果类型
httpheader     控制特殊的Http行为的结果类型
jsf         与jsf整合的结果类型
redirect        直接跳转到其他Url的结果类型
redirectAction    用于直接跳转到其他Action的结果类型
stream       向浏览器返回一个InputStream(一般用于文件下载)
tiles         与Tiles整合的结果类型
velocity        与Velocity整合的结果类型
xslt          与XML/XSLT整合的结果类型
plainText      用于显示某个月免的原始代码的结果类型

plainText
显示为文本,一般包含两个参数:location&charset

 1 <action name="*_*_code">
 2     <result type="plainText">
 3         <param name="charSet">UTF-8</param><!--编码-->
 4         <param name="location">/{1}/{2}.jsp</param><!--路径-->
 5     </result>
 6 </action> 
 7 <action name="*_code">  
 8     <result type="plainText">   
 9         <param name="charSet">UTF-8</param> 
10         <param name="location">/{1}.jsp</param> 
11     </result>
12 </action>

 redirect、redirectAction
这种结果类型与dispatcher结果类型相对应,dispatcher结果类型是将请求Foreword到指定的JSP资源,而redirect是将其重定向到指定试图资源,此时系统将调用HttpServlertResponse的sendRedirect(String)方法来重定向指定视图资源,这种重定向的效果就是重新产生一个请求,因此
重要区别:重定向中,所有的请求参数、请求属性,以及Action实例和Action中封装的属性将全部丢失。

 1 <package name="default" extends="struts-default"> 
 2     <action name="indexAction" class="action.IndexAction">
 3         <result name="redirect" type="redirect">/index.jsp</result>
 4         <result name="dispatcher" type="dispatcher" >/index.jsp</result>
 6         <result name="redirectAction" type="redirectAction">
 7             <param name="actionname">ok</param>
 8             <param name="namespace">/mypackage</param>
 9         </result>
10     </action>
11 </package>
12 <package name="packagename" extends="struts-default"> 
13     <action name="ok">
14         <result>/ok.jsp</result>
15     </action>
16 </package>

使用PreResultListener
在执行execute之后返回视图之前调用

public String execute() throws Exception {
    ActionInvocation invocation = ActionContext.getContext().getActionInvocation();
    invocation.addPreResultListener(new PreResultListener() {
        public void beforeResult(ActionInvocation invocation, String resultCode) {
            System.out.println("ViewResult from:" + resultCode);
        }
    });
}

 struts2异常配置
在需要拦截错误的方法上添加throw Exception,此时抛出的异常将由struts2框架来处理.

声明式捕捉异常
struts.xml文件中配置<exception-mapping ... />
exception:捕捉异常类型
result:出现该异常时转入的逻辑视图名
根据<exception-mapping ... />出现的位置,映射异常分为两类
局部异常映射:配置在<action></action>节点内
全局异常映射:配置在<global-exception-mapping>节点内

public String execute() throws Exception {
    ActionInvocation invocation = ActionContext.getContext().getActionInvocation();
    invocation.addPreResultListener(new PreResultListener() {
        public void beforeResult(ActionInvocation invocation, String resultCode) {
            System.out.println("ViewResult:" + resultCode);
        }
    });
    
    if (getUsername().equals("user")) {
        System.out.println("username == user");
        throw new MyException();
    }
    if(getUsername().equals("admin")){
        System.out.println("username == admin");
        throw new Exception();
    }
    if(getUsername().equals("sql")){
        System.out.println("username == sql");
        throw new java.sql.SQLException();
    }
        ....
}
<global-exception-mappings>
    <exception-mapping exception="java.lang.Exception" result="error"></exception-mapping>
    <exception-mapping exception="java.sql.SQLException" result="sql_error"></exception-mapping>
</global-exception-mappings>

<action name="login" class="ko.ssh.action.LoginRegistAction" >
    <exception-mapping result="error" exception="ko.ssh.action.MyException"></exception-mapping>
    <result name="text" type="plainText">
        <param name="location">/index.jsp</param>
        <param name="charset">UTF-8</param>
    </result>
    <result name="input">/login.jsp</result>
    <result name="success">/index.jsp</result>
    <result name="error">/error.jsp</result>
</action>

输出异常信息
<s:property value="exception" />
<s:property value="exception.message" />
<s:property value="exceptionStack" />

Struts2 convention插件与约定

Struts2国际化
加载资源文件:struts.xml中添加
<constant name="struts.custom.i18n.resources" value="mess"></constant>
或者struts.property中添加
struts.custom.i18n.resources=mess

访问国际化信息
jsp页面:<s:text name="key" />
Action中:ActionSupport中getText(String key)
表单中的Label指定key属性,为国际化资源文件中的key

占位符国际化信息
eg:
welMsg={0}, Welcome! Now is {1}!
Action中调用: ActionSupport.getText("welMsg", new String[]{"value1", "value2"})
result: value1, Welcome! Now is value2!
jsp页面调用:
<s:text name="welMsg">
  <s:param>...</s:param>
  <s:param>...</s:param>
</s:text>

posted on 2013-04-02 22:20  KoStark  阅读(195)  评论(0编辑  收藏  举报