通用標簽:
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 包含靜態(tài)英文文件
<s:incl e val="/_incl e1.html"></s:incl e>
</li>
<li>incl e _incl e2.html 包含靜態(tài)中文文件
<s:incl e val="/_incl e2.html"></s:incl e>
</li>
<li>incl e _incl e1.html 包含靜態(tài)英文文件,說明%用法
//%{}強制把{}中的內容轉換問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/> |
遍歷過的元素總數(shù):<s:property val="#status.count"/> |
遍歷過的元素索引:<s:property val="#status.index"/> |
當前是偶數(shù)?:<s:property val="#status.even"/> |
當前是奇數(shù)?:<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>
第二種:可以用動態(tài)方法調用,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中繼續(xù)往上拋
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>
繼續(xù)在需要處理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,統(tǒng)一處理錯誤信息:
<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目錄下創(chuàng)建:
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>
處理資源文件中的參數(shù)
在abc_zh_CN.properties文件中加入:
welcome.msg=\歡\迎\你\:{0}
在abc_en_US.propertieszhong 加入
welcome.msg=welcome\:{0}
在頁面中注入?yún)?shù):
<s:text name="welcome.msg">
<s:param val="username"></s:param>
</s:text>
動態(tài)語言切換
URL:.../Login?reqst_locale=en_US
URL:.../Login?reqst_locale=zh_CN
攔截器
自定義攔截器:
一、實現(xiàn)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中使用攔截器實現(xiàn)類型轉換
自定義轉換的日期格式:
<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配置