Struts2的傳值方式
從前臺到後臺,struts2的傳值方式共三種:屬性驅動、物件驅動以及模型驅動。
一、屬性驅動
頁面程式碼:input框中的name值只是填寫單純的屬性名稱
<form action="FieldDrivenValueAction" method="POST"> 使用者名稱:<input name="username"> <br> 密碼:<input name="password"> <br> 性別:<input name="sex"> <br> 年齡:<input name="age"> <br> <input type="submit" value="提交"/> </form>
後臺程式碼:注意點:要為類中的每個屬性提供getXXX和setXXX方法。這樣前臺提交form表單時,我們就能在後臺接收到相應的屬性值。
public class FieldDrivenValueAction extends ActionSupport{ private static final long serialVersionUID = 1L; private String username; private String password; private String sex; private String age; public String addUser(){ System.out.println(username); System.out.println(age); return "success"; } 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; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
二、物件驅動
1.首先我們要新建實體類,目的是為了解耦,在action中將不是邏輯處理的程式碼抽離出來。
public class User {
private String username;
private String password;
private String sex;
private String age;
........getXXX\setXXX略
}
2.頁面,input框中name屬性的填寫方式也變了,並不是單純的屬性名了,而是“物件.屬性名”的方式
<form action="ObjectDrivenValueAction" method="POST"> 使用者名稱:<input name="user.username"> <br> 密碼:<input name="user.password"> <br> 性別:<input name="user.sex"> <br> 年齡:<input name="user.age"> <br> <input type="submit" value="提交"/> </form>
3.後臺,新建一個屬性為我們的實體物件,並提供getXXX和setXXX方法。這樣提交form表單時,我們就能在實體物件中取得前臺傳過來的屬性值。
public class ObjectDrivenValueAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String addUser(){
System.out.println(user.getUsername());
System.out.println(user.getAge());
return "success";
}
}
三、模型驅動(也是最為常用的一種方式)
1.我們同樣需要新建實體物件
2.頁面,input框中的name屬性只是填寫簡單的屬性值
form action="ModelDrivenValueAction" method="POST">
使用者名稱:<input name="username">
<br>
密碼:<input name="password">
<br>
性別:<input name="sex">
<br>
年齡:<input name="age">
<br>
<input type="submit" value="提交"/>
</form>
3.後臺,前兩種方式Action只是繼承自ActionSuppport,模型驅動就有些不同了,我們要實現ModelDriven介面,並且重寫它的getModel方法,這樣前臺的屬性值就會傳到後臺定義的實體屬性User中去。
public class ModelDrivenValueAction implements ModelDriven<User>{
private User user;
@Override
public User getModel() {
if(user==null){
user = new User();
}
return user;
}
public String addUser(){
System.out.println(user.getUsername());
System.out.println(user.getSex());
return "success";
}
}
手動分割線
前臺向後臺的傳值都熟知了,那麼後臺怎麼往前臺傳值呢?這裡就要用到struts的值棧和Ognl表示式了。關於值棧,分為兩個部分,一個是root(本質是一個List集合),一個是context(本質是存放有鍵值對的map物件),這裡不做過多介紹了。後臺向前臺傳值的時候,可以將值直接放入值棧中,也可以放入到context中,這樣前臺就可以通過ognl表示式獲取到前臺穿過來的值了,詳細看例子。
1.頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!--使用struts2的標籤,必須加上該指令-->
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>資訊展示頁面</title>
</head>
<body>
<!--便於看到值棧-->
<s:debug></s:debug>
<!--從值棧中取值,直接填寫屬性值-->
username:<s:property value="username"/><br/>
Age:<s:property value="age"/>
<hr>
<!--從ActionContext中取,必須加上‘#’-->
username2:<s:property value="#user2.username"/>
age2:<s:property value="#user2.age"/>
</body>
</html>
2.後臺
public class AfterToBeforeAction extends ActionSupport{
private static final long serialVersionUID = 1L;
public String receiveValue(){
User user = new User();
user.setUsername("haha");
user.setAge("88");
User user2 = new User();
user2.setUsername("boniu");
user2.setAge("8");
ActionContext ac = ActionContext.getContext();
//從context中獲取到值棧物件
ValueStack stack = ac.getValueStack();
//壓棧,將值放入到棧中,前臺取值時通過屬性名即可獲取
stack.push(user);
//放入context中,前臺取值時要加'#'號
ac.put("user2", user2);
return "success";
}
}
值棧具體是什麼樣子的,可以通過我們頁面上使用的struts2標籤<s:debug />看到其部分,這裡貼兩張圖,供大家參考,有機會再詳談值棧。
圖1中綠色標記的,即是我們通過stack.push()方法將user物件壓入棧中的體現
圖2中的user2即是我們通過context.put()方法放入context中的user2物件