1. 程式人生 > >Struts2學習——請求引數獲取

Struts2學習——請求引數獲取

Struts2框架是web層的優秀框架,他的核心是採用Filter技術,並且使用Action類代替Servlet技術,當然如果特別想使用servlet技術,也可以通過一些方法獲取Servlet中的所有物件(如:request、response、session、ServletContext……)

獲取了這些物件後,你就可以做一些想做的事,比如……想幹啥就幹啥

 

一、從Action中獲取ServletAPI

  • 具體如何獲取ServletAPI,有三種方式(底層都是相同的方法)
  •  
  • 1. 通過ActionContext

例如:

//request域=> map (struts2並不推薦使用原生request域)
Map<String, Object> requestScope = (Map<String, Object>)ActionContext.getContext().get("request");
//推薦,直接使用put方法將鍵值對存到Action物件中
ActionContext.getContext().put("name", "requestTom");
		
//session域 => map
Map<String, Object> sessionScope = ActionContext.getContext().getSession();
sessionScope.put("name", "sessionTom");
		
//application域=>map
Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
applicationScope.put("name", "applicationTom");
  • 2. 通過ServletActionContext
//原生request
HttpServletRequest request = ServletActionContext.getRequest();
//原生session
HttpSession session = request.getSession();
//原生response
HttpServletResponse response = ServletActionContext.getResponse();
//原生servletContext
ServletContext servletContext = ServletActionContext.getServletContext();
  • 3. 通過實現介面方式
public class Demo7Action extends ActionSupport implements ServletRequestAware {
	
	
	private HttpServletRequest request;

	public String execute() throws Exception { 
		
		System.out.println("原生request:"+request);
		return SUCCESS;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}
	
}

 

二、獲取引數

  • 既然Struts2不推薦使用Servlet中的Api,那麼如何從請求中獲取引數,Action有自己的方式: 

  • 以表單提交的資料獲取方式為例:(分為三種方式)

 

  • 1. 屬性注入方式:

  • 方式1 表單:
<form action="${pageContext.request.contextPath}/xxxAction" method="post">
	使用者名稱:<input type="text" name="name" /><br>
	年齡:<input type="text" name="age" /><br>
	生日:<input type="text" name="birthday" /><br>
	<input type="submit" value="提交" />
</form>
  • 方式1 Action屬性 
//準備與引數鍵名稱相同的屬性
private String name;
//自動型別轉換 只能轉換8大基本資料型別以及對應包裝類
private Integer age;
//支援特定型別字串轉換為Date ,例如 yyyy-MM-dd
private Date   birthday;
  •  當表單提交到該Action時,封裝資料屬性名會對應input的name值自動
  • (注意,有set/get方法的私有成員變數才能稱之為屬性,這裡未寫出set/get方法,但是實際開發種一定有)

 

  • 2. 物件驅動方式:

  • 方式2 表單:
<form action="${pageContext.request.contextPath}/Demo9Action">
	使用者名稱:<input type="text" name="user.name" /><br>
	年齡:<input type="text" name="user.age" /><br>
	生日:<input type="text" name="user.birthday" /><br>
	<input type="submit" value="提交" />
</form>
//準備user物件
private User user;

public User getUser() {
	return user;
}

public void setUser(User user) {
	this.user = user;
}
  • 物件的屬性與表單的name值對應進行自動封裝
  • 這裡將物件作為屬性,同樣生成set/get方法

 

  • 3. 模型驅動方式:

  • 表單與方式1 的表單相同
  • 程式碼:
public class Demo10Action extends ActionSupport implements ModelDriven<User> {
	//準備user 成員變數
	private User user =new User();

	public String execute() throws Exception { 
		
		System.out.println(user);
		
		return SUCCESS;
	}

	@Override
	public User getModel() {
		return user;
	}

}
  • 此種方式需要實現介面ModelDriven,泛型為想要封裝的物件類。然後實現方法getModel()。
  • 優點:前臺頁面無須任何改動(與方式1相同);
  • 缺點:只能封裝一個物件

 

  • 拓展:當然其實還有第四種方式,作為拓展知識,集合形式:

  • 頁面:
<form action="${pageContext.request.contextPath}/Demo11Action" method="post" >
	list:<input type="text" name="list" /><br>
	list:<input type="text" name="list[3]" /><br>
	map:<input type="text" name="map['haha']" /><br>
	<input type="submit" value="提交" />
</form>
  • 程式碼:
//list
private List<String> list;
//Map
private Map<String,String> map;
	
  • 注意:這裡同樣為集合型別的屬性,需要有set/get方法
  • List集合name值為屬性名,角標為集合索引,
  • Map集合,角標為key值