Action接收參數的四種方法
- 在Action中定義屬性和get、set方法,Struts2將會自動把接受的參數賦值到對應的屬性:
public class UserAction extends ActionSupport {
private String name;
private int age;
public String execute() {<span style="white-space:pre"> </span>//localhost:8080/Struts/user?name=aaa&age=20
return SUCCESS;
}
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;
}
}
- 在Action類中定義model對象並添加get、set方法,在model對象中定義屬性添加get、set方法,Struts2會將屬性傳入model中:
public class UserAction extends ActionSupport {
private User user;
public String execute() {<span style="white-space:pre"> </span>//localhost:8080/Struts/user?user.name=a&user.age=19
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
class User {
private String name;
private int age;
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;
}
}
- 使用DTO進行中間過渡,用於參數中帶有不需要存入model的屬性時:
public class UserAction extends ActionSupport {
private UserDTO user;
public String execute() { //localhost:8080/Struts/user?user.username=a&user.password=b&user.confirmingPassword=b
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(UserDTO user) {
this.user = user;
}
}
class UserDTO {
private String username;
private String password;
private String confirmingPassword;
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 getConfirmingPassword() {
return confirmingPassword;
}
public void setConfirmingPassword(String confirmingPassword) {
this.confirmingPassword = confirmingPassword;
}
}
- 實現ModelDriven接口,自行創建成員對象實例,實現getModel方法:
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
class User {
private String name;
private int age;
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;
}
}
獲取Request、Session和Application的四種方法:
- 使用ActionContext獲取:
public class TestAction extends ActionSupport {
private Map request;
private Map session;
private Map application;
public TestAction() {
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
public String execute() {
request.put("username", "aaa");
session.put("password", "bbb");
application.put("name", "ccc");
return SUCCESS;
}
}
- 實現RequestAware、SessionAware、ApplicationAware接口,通過IOC注入獲取:
public class TestAction extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
public String execute() {
request.put("username", "aaa");
session.put("password", "bbb");
application.put("name", "ccc");
return SUCCESS;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
}
- 通過ServletActionContext獲取:
public class TestAction extends ActionSupport {
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public TestAction() {
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
}
public String execute() {
request.setAttribute("username", "aaa");
session.setAttribute("password", "bbb");
application.setAttribute("name", "ccc");
return SUCCESS;
}
}
- 實現HttpRequestAware接口,通過IOC注入獲取:
public class TestAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
public String execute() {
request.setAttribute("username", "aaa");
session.setAttribute("password", "bbb");
application.setAttribute("name", "ccc");
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
this.application = session.getServletContext();
}
}
Result
Result標籤有兩個屬性type和name,其中type有4種常用選項,分別爲:
- dispatcher(默認選項):轉發到一個頁面
- redirect:重定向到一個頁面
- chain:轉發到一個Action
- redirectAction :重定向到一個Action
有些頁面可以爲所有Action服務,例如主頁、錯誤頁面等,可以使用<global-results>標籤將這些頁面的Result設置成全局Result:
<global-results>
<result name="error">/error.jsp</result>
<result name="main">/index.jsp</result>
</global-results>
同時Result也支持動態結果集,用法爲"${r}",r代表ValueStack中的一個屬性名。例如Action爲:
public class UserAction extends ActionSupport {
private int type;
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) url="/success.jsp";
else if (type == 2) url="/error.jsp";
return "success";
}
}
struts.xml中的配置爲:
<pre name="code" class="java"><action name="user" class="struts.action.UserAction">
<span style="white-space:pre"> </span><result>${url}</result>
</action>
或者用於重定向傳遞參數:
<action name="user" class="struts.action.UserAction">
<result type="redirect">/user.jsp/type=${type}</result>
</action>