Struts 的action請求方式
阿新 • • 發佈:2019-02-13
在struts2中關於action的請求url請求基本上由三種情況:
首先要先提下struts在傳送請求的處理流程:
客戶端請求(http://localhost:8080/HelloWorld/stu/stuadd)->tomcat接收請求->根據HelloWorld這個專案來載入處理web.xml->把請求交給strutstfilter來處理,strutsfilter交給doFilter處理->doFilter根據struts.xml找到對應的namespace、action,及action處理完成返回的資訊來顯示呼叫對應的result頁面->返回給客戶端
struts.xml配置如下:
<package name="student" namespace='/stu' extends="struts-default">
#1:不指定 <action method="methodName">由StudentAction中的預設函式execute來處理
<action name="default" class="com.hupu.action.StudentAction" >
<result>/Student_index.jsp</result>
</action>
#2:指定<action method="methodName"> 來處理
<action name="index" class="com.hupu.action.StudentAction" method="index" >
<result>/Student_index.jsp</result>
</action>
<!-- method 請求時 回撥用 method=add的方法 -->
<action name="stuadd" class="com.hupu.action.StudentAction" method="add" >
<result name='add_student'>/Student_add.jsp</result>
<result name='add_student_error'>/Student_add_error.jsp</result>
</action>
#3: <!-- DMI 動態方法呼叫 user!add 這樣 就可以只配置這一樣action 就能處理相似的請求-->
<action name="user" class="com.hupu.action.UserAction">
<result name='add_user'>/user_add.jsp</result>
</action>
#4:萬用字元處理
<action name="*_*" class="com.hupu.action.{1}Action" method="{2}">
<result>/{1}_{2}.jsp</result>
</action>
</package>
引數傳遞:struts中引數傳遞有基本三種方法:
1:Action接收引數:
1:由Action中的getXXX(),setXXX()來處理引數的接收,其中的Action的屬性名稱不一定要傳遞的引數的名稱一樣,但是getXXX後面的名稱一定要一致。
程式碼:
public class UserAction extends ActionSupport {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//引數和成員變數時一一對應的 型別自動轉換
private String name;
private int age;
public String add(){
return "add_user";
}
}
2:域模型物件
建立一個域模型物件接收引數此時引數的傳遞:user.name=.....
同時由於可能域模型欄位比要接收的欄位少比如password的輸入的驗證,這時可以使用DTO(資料傳輸物件)
作為中間的資料接收然後再傳遞來處理
DTO:資料傳輸物件
DO:資料物件
3:modeldriven 模型驅動
程式碼:使用的是com.opensymphony.xwork2.ModelDriven;模型驅動類
這是請求的url地址:http://localhost:8080//HelloWorld/stu/stuadd?name=liujijun&age=27 就能填充到
Student類中,這是需要單獨的new出來一個student物件
public class StudentAction extends ActionSupport implements ModelDriven<Student> {
private Student student = new Student();
public String index(){
return SUCCESS;
}
public String add(){
if(true){
this.addFieldError("name", "name is error");
this.addFieldError("name", "name is too long");
return "add_student_error";
}
return "add_student";
}
@Override
public Student getModel() {
// TODO Auto-generated method stub
return student;
}
@Override
public String execute(){
return SUCCESS;
}
}
首先要先提下struts在傳送請求的處理流程:
客戶端請求(http://localhost:8080/HelloWorld/stu/stuadd)->tomcat接收請求->根據HelloWorld這個專案來載入處理web.xml->把請求交給strutstfilter來處理,strutsfilter交給doFilter處理->doFilter根據struts.xml找到對應的namespace、action,及action處理完成返回的資訊來顯示呼叫對應的result頁面->返回給客戶端
struts.xml配置如下:
<package name="student" namespace='/stu' extends="struts-default">
#1:不指定 <action method="methodName">由StudentAction中的預設函式execute來處理
<action name="default" class="com.hupu.action.StudentAction" >
<result>/Student_index.jsp</result>
</action>
#2:指定<action method="methodName"> 來處理
<action name="index" class="com.hupu.action.StudentAction" method="index" >
<result>/Student_index.jsp</result>
</action>
<!-- method 請求時 回撥用 method=add的方法 -->
<action name="stuadd" class="com.hupu.action.StudentAction" method="add" >
<result name='add_student'>/Student_add.jsp</result>
<result name='add_student_error'>/Student_add_error.jsp</result>
</action>
#3: <!-- DMI 動態方法呼叫 user!add 這樣 就可以只配置這一樣action 就能處理相似的請求-->
<action name="user" class="com.hupu.action.UserAction">
<result name='add_user'>/user_add.jsp</result>
</action>
#4:萬用字元處理
<action name="*_*" class="com.hupu.action.{1}Action" method="{2}">
<result>/{1}_{2}.jsp</result>
</action>
</package>
引數傳遞:struts中引數傳遞有基本三種方法:
1:Action接收引數:
1:由Action中的getXXX(),setXXX()來處理引數的接收,其中的Action的屬性名稱不一定要傳遞的引數的名稱一樣,但是getXXX後面的名稱一定要一致。
程式碼:
public class UserAction extends ActionSupport {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//引數和成員變數時一一對應的 型別自動轉換
private String name;
private int age;
public String add(){
return "add_user";
}
}
2:域模型物件
建立一個域模型物件接收引數此時引數的傳遞:user.name=.....
同時由於可能域模型欄位比要接收的欄位少比如password的輸入的驗證,這時可以使用DTO(資料傳輸物件)
作為中間的資料接收然後再傳遞來處理
DTO:資料傳輸物件
DO:資料物件
3:modeldriven 模型驅動
程式碼:使用的是com.opensymphony.xwork2.ModelDriven;模型驅動類
這是請求的url地址:http://localhost:8080//HelloWorld/stu/stuadd?name=liujijun&age=27 就能填充到
Student類中,這是需要單獨的new出來一個student物件
public class StudentAction extends ActionSupport implements ModelDriven<Student> {
private Student student = new Student();
public String index(){
return SUCCESS;
}
public String add(){
if(true){
this.addFieldError("name", "name is error");
this.addFieldError("name", "name is too long");
return "add_student_error";
}
return "add_student";
}
@Override
public Student getModel() {
// TODO Auto-generated method stub
return student;
}
@Override
public String execute(){
return SUCCESS;
}
}