程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts2.0深入學習 命名空間,模型驅動,表單重復提交

Struts2.0深入學習 命名空間,模型驅動,表單重復提交

編輯:關於JAVA

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 = 不能重復提交

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved