Struts2深入探索:
1,package中的abstract="true"表示該package裡面不能包函action元素
2,package中若指定namespace="/mynamespace"則:
<!--
包的namespace要以"/"開頭,對應的頁面的路徑前面也加上/mymengya/ActionName.action
如:<s:form action="/mymengya/register.action" method="post" theme="simple">
-->
<package name="mengya" extends="struts-default" namespace="/mymengya">
<action name="register"
class="com.mengya.action.RegisterAction">
<result name="success">/show.jsp</result>
<result name="input">/index.jsp</result>
<result name="invalid.token">/index.jsp</result>
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
在頁面form的action中也要加上/mynamespase並且還要加上後綴action(不管是不是用的struts標簽)
3,模型驅動
/**
* 模型Bean
* @author 張明學
*
*/
public class RegisterBean {
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
Action則要接實com.opensymphony.xwork2.ModelDriven接口:
public class RegisterAction extends ActionSupport implements ModelDriven {
/**
* 模型驅動,該模型Bean必須實例化
*/
private RegisterBean loginBean = new RegisterBean();
public Object getModel() {
return loginBean;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
對應頁面則可以直接用模型Bean的屬性
如:
<tr>
<td>
用戶名:
<s:textfield name="username"></s:textfield>
<%-- 將form的theme="simple"就可以自由布局了,對於fielderror加上name屬性就可以顯示這個屬生的錯誤信息 --%>
<s:fielderror name="username"></s:fielderror>
</td>
</tr>
<tr>
<td>
密碼:
<s:password name="password"></s:password>
<s:fielderror name="password"></s:fielderror>
</td>
</tr>
<s:property value="username"/>
<s:property value="password"/>
5,表單重復提交:
一,在form裡面加上<s:token id="register"></s:token>標簽
二,在Action裡加上<interceptor-ref name="token"></interceptor-ref>攔截器
默認攔截器:<interceptor-ref name="defaultStack"></interceptor-ref>
三:原理:
當頁面第一次生成的時候<s:token id="register"></s:token>會生成一個隱藏表單域其中包涵一個值,該值 也同樣被存放到session當中去了
當頁面第一次提交的時候token攔截器會比較這兩個值是否相同,相同則第一次提交,第一次提交後會把session這個值清空,表單若再一次提交時則
session當中沒有值即兩個值不相同提交失敗,返回的resut的name為:invalid.token 即:
<result name="invalid.token">/index.jsp</result>
<s:form action="/mymengya/register.action" method="post" theme="simple">
<s:token id="register"></s:token>
<table width="50%">
<tr>
<td>
用戶名:
<s:textfield name="username"></s:textfield>
<s:fielderror name="username"></s:fielderror>
</td>
</tr>
<tr>
<td>
密碼:
<s:password name="password"></s:password>
<s:fielderror name="password"></s:fielderror>
</td>
</tr>
<tr>
<td>
<s:submit value="注冊"></s:submit>
</td>
</tr>
</table>
</s:form>
<package name="mengya" extends="struts-default" namespace="/mymengya">
<action name="register"
class="com.mengya.action.RegisterAction">
<result name="success">/show.jsp</result>
<result name="input">/index.jsp</result>
<result name="invalid.token">/index.jsp</result>
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
修改Struts2默認的重復提交的錯誤提示信息:
在Struts2國際化屬性文件中添加一條信息:
struts.messages.invalid.token = \u8868\u5355\u4e0d\u5141\u8bb8\u91cd\u590d\u63d0\u4ea4
struts.messages.invalid.token = 不能重復提交