分享

struts 2 配置方法及其技巧实例整理(二)

 WindySky 2011-07-03
  Struts标签

通用标签:

property

//property访问普通属性,自动识别人ognl表达式

<li>property: <s:property val="username"/> </li>

       <li>property 取值为字符串: <s:property val="'username'"/> </li>

       <li>property 设定默认值: <s:property val="admin" default="管理员"/> </li>

       <li>property 设定HTML: <s:property val="'<hr/>'" escape="false"/> </li>

       <hr />

set

       <li>set 设定adminName值(默认为reqst 和 ActionContext): <s:set var="adminName" val="username" /></li>   

       <li>set 从reqst取值: <s:property val="#reqst.adminName" /></li>

       <li>set 从ActionContext取值: <s:property val="#adminName" /></li>   

       <%--<li>set 设定范围: <s:set name="adminPassword" val="password" scope="page"/></li>

       <li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %></li>

       --%>

       <li>set 设定var,范围为ActionContext: <s:set var="adminPassword" val="password" scope="session"/></li>

       <li>set 使用#取值: <s:property val="#adminPassword"/> </li>

       <li>set 从相应范围取值: <s:property val="#session.adminPassword"/> </li>      

       <hr />      

       <%--<li>push:<s:set name="myDog" val="new com.bjsxt.struts2.ognl.Dog('o y')"></s:set></li>

       <li>

       push:<s:push val="#myDog">

           <s:property val="name"/>

       </s:push>

       </li>

       <li>push: <s:property val="name"/></li>

       --%>     

       <hr />

bean

       <li>bean 定义bean,并使用param来设定新的属性值:

           <s:bean name="com.bjsxt.struts2.tags.Dog" >

              <s:param name="name" val="'pp'"></s:param>

              <s:property val="name"/>            

           </s:bean>        

       </li>        

       <li>bean 查看debug情况:

           <s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">

              <s:param name="name" val="'o y'"></s:param>

           </s:bean>

           拿出值:

           <s:property val="#myDog.name"/>         

       </li>

       <hr />      

incl e

       <li>incl e _incl e1.html 包含静态英文文件

       <s:incl e val="/_incl e1.html"></s:incl e>

       </li>     

       <li>incl e _incl e2.html 包含静态中文文件

       <s:incl e val="/_incl e2.html"></s:incl e>

       </li>     

       <li>incl e _incl e1.html 包含静态英文文件,说明%用法

//%{}强制把{}中的内容转换问ognl表达式

       <s:set var="incPage" val="%{'/_incl e1.html'}" />

       <s:incl e val="%{#incPage}"></s:incl e>

       </li>     

       <hr />

控制标签

if

       <li>if elseif else:

       age = <s:property val="#parameters.age[0]" /> <br />

       <s:set var="age" val="#parameters.age[0]" />

       <s:if test="#age < 0">wrong age!</s:if>

       <s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>

       <s:else>yeah!</s:else><br />      

       <s:if test="#parameters.aaa == null">null</s:if>

       </li>     

       <hr /> 

iterator

       <li>遍历集合:<br />

       <s:iterator val="{1, 2, 3}" >

           <s:property/> |

       </s:iterator>

       </li>

       <li>自定义变量:<br />

       <s:iterator val="{'aaa', 'bbb', 'ccc'}" var="x">

           <s:property val="#x.toUpperCase()"/> |

       </s:iterator>

       </li>

       <li>使用status:<br />

       <s:iterator val="{'aaa', 'bbb', 'ccc'}" status="status">

           <s:property/> |

           遍历过的元素总数:<s:property val="#status.count"/> |

           遍历过的元素索引:<s:property val="#status.index"/> |

           当前是偶数?:<s:property val="#status.even"/> |

           当前是奇数?:<s:property val="#status.odd"/> |

           是第一个元素吗?:<s:property val="#status.first"/> |

           是最后一个元素吗?:<s:property val="#status.last"/>

           <br />

       </s:iterator>      

       </li>      

       <li>

       <s:iterator val="#{1:'a', 2:'b', 3:'c'}" >

           <s:property val="key"/> | <s:property val="val"/> <br />

       </s:iterator>

       </li>      

       <li>

       <s:iterator val="#{1:'a', 2:'b', 3:'c'}" var="x">

           <s:property val="#x.key"/> | <s:property val="#x.val"/> <br />

       </s:iterator>

       </li>      

       <li>      

       <s:fielderror fieldName="fielderror.test" theme="simple"></s:fielderror>      

       </li>

UI标签

在实际运用中使用并不多;

在struts.xml文件中添加属性:

       设置标签的主题:simple/css_xhtml/xhtml

    <constant name="struts.ui.theme" val="css_xhtml" /> 

       <li>

       <s:form >

       <div class="formFieldError">

       <s:fielderror />

       </div>

       <s:textfield name='aaa'></s:textfield>

       </s:form>

       </li> 

 

 

两种action的配置方法:

第一种:

       <action name="*-*" class="com.bjsxt.bbs2009.action.{1}Action" method="{2}">

            <result>/admin/{1}-{2}.jsp</result>

            <result name="input">/admin/{1}-{2}.jsp</result>

       </action>

第二种:可以用动态方法调用,user!add

       <action name="category" class="com.bjsxt.bbs2009.action.CategoryAction">

            <result>/admin/category_list.jsp</result>

            <result name="add_input">/admin/category_add_input.jsp</result>

            <result name="update_input">/admin/category_update_input.jsp</result>           

       </action> 

 

 

声明式异常处理

先把异常抛给struts

    p lic List<Category> list() throws SQLException {

              ...

                     } catch (SQLException e) {

                     e.printStackTrace();

                     throw(e);

              }

              ...

       }

在Action中继续往上抛

    p lic String list() throws Exception {

       categories = categoryService.list();

       return S?SS;

    }

struts处理

    方法一:在struts.xml文件中配置局部的error处理:

       <action name="*-*" class="com.bjsxt.bbs2009.action.{1}Action" method="{2}">

            <result>/admin/{1}-{2}.jsp</result>

            <result name="input">/admin/{1}-{2}.jsp</result>

            <exception-mapping result="error" exception="java.sql.SQLException" /> 

            <result name="error">/error.jsp</result>

       </action>

    方法二:在struts.xml文件中配置全局的error处理,由action进行处理:

    <package name="bbs2009_default" extends="struts-default">  

       <global-results>

        <result name="error">/error.jsp</result>

    </global-results>   

        <global-exception-mappings>

        <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>

    </global-exception-mappings>   

    </package>

       继续在需要处理error的Action中配置:

       <action name="*-*" class="com.bjsxt.bbs2009.action.{1}Action" method="{2}">

            <result>/admin/{1}-{2}.jsp</result>

            <result name="input">/admin/{1}-{2}.jsp</result>

            <result name="error">/error.jsp</result>

       </action>

       方法三:直接配置全局error,统一处理错误信息:

    <package name="bbs2009_default" extends="struts-default">     

       <global-results>

        <result name="error">/error.jsp</result>

    </global-results>   

        <global-exception-mappings>

        <exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>

    </global-exception-mappings>

    </package>

 

 

DefaultActionRef_Bug

    <default-action-ref name="Category_list" />

使用default-action-ref访问index页面时,不会方法任何的action

为了解决这个问题,可以定义一个index的action

       <action name="index" class="com.bjsxt.bbs2009.action.CategoryAction" method="list">

            <result>/index.jsp</result>

       </action>

然后再web.xml中设置:

  <welcome-file-list>

    <welcome-file>index</welcome-file>

  </welcome-file-list> 

 

 

I18N

一般使用:

在src目录下创建:

    app_en_US.properties,app_zh_CN.properties

    在两个文件中分别写入:

welcome.msg=hello,sir

welcome.msg=\欢\迎\你\!

    从国际化资源文件中读取信息:

       ResourceBundle res = ResourceBundle.getBundle("app", Locale.CHINA);

       System.out.println(res.getString("welcome.msg" ));

在Action中使用,需要这样命名:

    更Action处于同一个包中:

    LoginAction_zh_CN.properties

login.username=\用\户\名\:

在页面中使用:

    <s:property val="getText('login.username')"/> <input name="username" />

包级别的国际化文件:

    只能叫package:package_en_US.properties

整个项目一个资源文件:

    随意命名:

    abc_zh_CN.properties,abc_en_US.properties

    struts.xml文件中配置:

    <constant name="struts.custom.i18n.resources" val="abc"></constant>

处理资源文件中的参数

    在abc_zh_CN.properties文件中加入:

welcome.msg=\欢\迎\你\:{0}

    在abc_en_US.propertieszhong 加入

welcome.msg=welcome\:{0}

    在页面中注入参数:

    <s:text name="welcome.msg">

       <s:param val="username"></s:param>

    </s:text>

动态语言切换

URL:.../Login?reqst_locale=en_US

URL:.../Login?reqst_locale=zh_CN 

 

 

拦截器

自定义拦截器:

一、实现import com.opensymphony.xwork2.interceptor.Interceptor接口:

p lic class MyInterceptor implements Interceptor {

 

    p lic void destroy() {

       // TODO Auto-generated method st     

    }

    p lic void init() {

       // TODO Auto-generated method st     

    }

    p lic String intercept(ActionInvocation invocation) throws Exception {

       long start = System.currentTimeMillis();

       String r = invocation.invoke();

       long end = System.currentTimeMillis();

       System.out.println("action time = " + (end - start));

       return r;

    }

}

二、在struts.xml中配置:

       <interceptors>

           <interceptor name="my" class="com.bjsxt.interceptor.MyInterceptor"></interceptor>

       </interceptors>

三、在Action中配置:

       <action name="test" class="com.bjsxt.action.TestAction">

           <result>/test.jsp</result>

           <interceptor-ref name="my"></interceptor-ref>

           <interceptor-ref name="defaultStack"></interceptor-ref>

       </action>

注意:为了还能使用到默认的拦截器:需要重新配置默认的拦截器defaultStack

使用token拦截器控制重复提交:

可以设置提交方式为post防止,也可以使用token拦截器:

       <action name="user" class="com.bjsxt.action.UserAction">

           <result>/addOK.jsp</result>       

           <interceptor-ref name="defaultStack"></interceptor-ref>

           <interceptor-ref name="token"></interceptor-ref>

           <result name="invalid.token">/error.jsp</result>

       </action>

 

 

类型转换

在struts中使用拦截器实现类型转换

自定义转换的日期格式:

    <s:date name="d" format="yyyy/MM/dd HH:mm:ss"/><br/>

在url中传递map:

    ...?users[‘a’]=usera&users[‘b’]=userb

    输出为:{a=usera, b=userb}

在url中传递java.awt.Point

    在Action中Point生成不了getter方法

    ...?p.x=2&p.y=3

    解决方法:

编写自己的转换器

p lic class MyPointConverter extends StrutsTypeConverter{ 

    @Override

    p lic Object convertFromString(Map context, String[] vals, Class toClass) {     

           Point p = new Point();

           String[] strs = (String[])vals;

           String[] xy = strs[0].split(",");

           p.x = Integer.parseInt(xy[0]);

           p.y = Integer.parseInt(xy[1]);

           return p;

    }

    @Override

    p lic String convertToString(Map context, Object o) {

       // TODO Auto-generated method st

       return o.toString();

    }

}

完成注册(三种方法):

       ① 局部:XXXAction-conversion.properties

           在TestAction-conversion.properties中加入:                              p=com.bjsxt.converter.MyPointConverter  //p是action中的属性名   

           url:.../test?p=5.8

       ② 全局:xwork-conversion.properties

           在xwork-conversionlproperties中配置:

java.awt.Point=com.bjsxt.converter.MyPointConverter

       ③ Annotation

    url传入list时:

       .../test?ps=1,2&ps=1,3    

       .../test?ps[0].x=1&ps[0].y=2& ps[1].x=1&ps[1].y=3    

这时要使用java.awt.Point配置

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多