一:結果頁面配置
1.1:全局結果頁面
假如多個Action最終返回的頁面是一樣的,我們是這樣寫的,
無論訪問http://localhost:8080/項目名/JapanAction或者ChinaAction.action,最終都是訪問earth.jsp這個頁面
但是<result name="success">/earth.jsp</result>部分就重複了
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="resultPageConfig" extends="struts-default" namespace="/">
<action name="ChinaAction" class="cn.itcast.結果頁面配置.GlobalResultPageAction" method="method1">
<result name="success">/earth.jsp</result>
</action>
<action name="JapanAction" class="cn.itcast.結果頁面配置.GlobalResultPageAction" method="method2">
<result name="success">/earth.jsp</result>
</action>
</package>
</struts>
使用全局結果頁面後:
<struts>
<package name="resultPageConfig" extends="struts-default" namespace="/">
<global-results>
<!--只能在此package下有效 -->
<result name="success">/earth.jsp</result>
</global-results>
<action name="ChinaAction" class="cn.itcast.結果頁面配置.GlobalResultPageAction" method="method1">
<!-- <result name="success">/earth.jsp</result> -->
</action>
<action name="JapanAction" class="cn.itcast.結果頁面配置.GlobalResultPageAction" method="method2">
<!-- <result name="success">/earth.jsp</result> -->
</action>
</package>
</struts>
1.2:局部結果頁面:就是類似這種
<action name="ChinaAction" class="cn.itcast.結果頁面配置.GlobalResultPageAction" method="method1">
<result name="success">/earth.jsp</result>
</action>
1.3:result標籤的type屬性
針對jsp的轉發和重定向:dispatcher, redirect
針對Action的轉發和重定向, chain(一般不用,有緩存),redirectAction
<package name="resultTypeAttrbute" extends="struts-default" namespace="/">
<action name="JspAction" class="cn.itcast.結果頁面配置.JspAction" method="method3">
<!--針對頁面:type屬性值默認是轉發dispatcher,我這裏設置重定向操作: 奇怪的是它這裏重定向/也是相對於項目下,可能做了封裝 -->
<result name="success" type="redirect">/index.jsp</result>
</action>
<action name="FirstAction" class="cn.itcast.結果頁面配置.FirstAction" method="method4">
<!--針對Action類,type屬性值等於chain是轉發操作,等於redirectAction是重定向操作,內容寫另一個Action標籤的name屬性值就行 -->
<result name="success" type="redirectAction">TwoAction</result>
</action>
<!--讓它沒有返回值,Action類中可以return 一個Action.NONE就行 -->
<action name="TwoAction" class="cn.itcast.結果頁面配置.TwoAction" method="method5">
</action>
</package>
二:在action類中獲取表單提交數據(三種方式)
其實感覺跟原生的Servlet區別不是很大,換湯不換藥
2.1:使用ActionContext
ActionContext.getContext().getParameters(); //跟Servlet中request.getParameters()差不多
2.2:使用ServletActionContext
ServletActionContext.getRequest().getParameter("xxx");//這個和原生的Servlet獲取表單的值,我看不出有什麼區別???
2.3:使用接口注入:我感覺比原生的Servlet還麻煩,沒什麼卵用
注:這裏和Servlet我感覺沒什麼區別,甚至感覺還麻煩些!
三:struts2提供獲取表單數據方式
3.1:屬性封裝: 直接把表單提交屬性封裝到action的屬性裏面(會用)
實現步驟
(1)在action成員變量位置定義變量
- 變量名稱和表單輸入項的name屬性值一樣
(2)生成變量的set方法(把set和get方法都寫出來)
(3)使用屬性封裝獲取表單數據到屬性裏面,不能把數據直接封裝到實體類對象裏面
public class AttributeAction extends ActionSupport{
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
//可以獲取到
System.out.println(username+":"+password);
return Action.NONE;
}
}
注:個人感覺不怎麼樣!!
3.2:模型驅動封裝:可以直接把表單數據封裝到實體類對象裏面(掌握)
(1)實現ModelDriven<T>接口,T裏面的屬性必須和表單name屬性值保持一致
(2)在action類的成員位置,創建一個T對象,在getModel的方法中返回就行
/**
* 模型驅動封裝
* @author wzj
*
*/
public class ModelDriverAction extends ActionSupport implements ModelDriven<User>{
//創建對象
private User user = new User();
@Override
public String execute() throws Exception {
System.out.println(user);
return Action.NONE;
}
@Override
public User getModel() {
return user;
}
}
注:它可以根據User中的屬性類型,自動幫你轉換,然後封裝到User對象中,跟我在Servlet時期使用BeanUtils工具差不多!
3.3:表達式封裝(會用)
(1)在Action類中聲明對應的實體類,並給出get/set方法
(2)在表單輸入項的name屬性值裏面寫表達式形式
public class ExpressionAction extends ActionSupport{
//1.聲明實體類
private User user;
//2.get/set方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return Action.NONE;
}
}
注:模型驅動和表達式封裝的區別!
使用模型驅動只能把數據封裝到一個實體類中
使用表達式封裝可以把數據封裝到不同實體類中
四:表單數據封裝到集合裏面:
4.1:封裝數據到List集合
步驟:在Action類中聲明List,並提供get/set方法
在表單輸入項中填表達式
public class ListAction extends ActionSupport{
//1.聲明一個List集合
private List<User> list;
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
@Override
public String execute() throws Exception {
System.out.println(list);
return Action.NONE;
}
}
最後:其實這些東西都很簡單,本來懶得做筆記,但是既然學了,就順便做一下筆記