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配置
|
|