struts2快速入門_day02



一:結果頁面配置
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;
	}
	
}

最後:其實這些東西都很簡單,本來懶得做筆記,但是既然學了,就順便做一下筆記 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章