struts2 action

1、使用領域對象來接收用戶輸入
【工程1:sx_ch0301】:

User對象中包含兩個字段:username和password,在Action中有一個User對象user,則在jsp中:

Jsp代碼
<input type="text" name="user.username">
<input type="password" name="user.password">

<input type="text" name="user.username">
<input type="password" name="user.password"> 來進行數據綁定。

當Struts2嘗試設置user對象的username屬性時,將依次調用以下的方法:

Java代碼
action.getUser();
action.setUser(new User());
action.getUser().setUserName();

action.getUser();
action.setUser(new User());
action.getUser().setUserName();Struts2首先嚐試獲得User對象的引用,當它發現User對象爲null時,它將使用User類的默認構造方法創建一個User實例,並調用action的setUser()方法設置這個實例。這樣,Struts2就可以設置Usser對象的username字段了。



在Struts2中,自動實例化對象的特性對於任意層次的對象包含關係都是適用的。



例如, user.address.street這樣的表達式會調用:

Java代碼
getUser().getAdderss().setStreet(...);

getUser().getAdderss().setStreet(...); Struts2會先創建User對象,接着創建Address對象,然後設置Address對象的street屬性。



2、使用ModelDriver action
【工程2:sx_ch0302】:
LoginAction 類實現了 ModelDriven 接口:(注意要實例化 User 對象,否則在 getModel() 時會取不到對象。)

Java代碼
public class LoginAction implements Action, ModelDriven<User> {

private User user = new User();

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

}

public class LoginAction implements Action, ModelDriven<User> {

private User user = new User();

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

}在login.jsp頁面中,表單字段就不需要再使用“user.”前綴了:

Jsp代碼
<input type="text" name="username">
<input type="password" name="password">

<input type="text" name="username">
<input type="password" name="password">在sucess.jsp頁面中,表單字段也不需要再使用“user.”前綴了:

Jsp代碼
<s:property value="username" />

<s:property value="username" />3、使用action的屬性接收用戶輸入
【工程3:sx_ch0303】:
在 Struts2 中,可以直接使用 action 的屬性來接收用戶的輸入。爲LoginAction添加 username 和 password 屬性,同時實現這兩個屬性的getter和setter方法(這樣可以直接刪除 User 類 ):



Java代碼
public class LoginAction implements Action {

private String username;

private String password;

public String execute() throws Exception {
// 這裏直接和屬性比對
if ("zhangsan".equals(username) && "1234".equals(password)) {
return SUCCESS;
} else {
return ERROR;
}
}

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 class LoginAction implements Action {

private String username;

private String password;

public String execute() throws Exception {
// 這裏直接和屬性比對
if ("zhangsan".equals(username) && "1234".equals(password)) {
return SUCCESS;
} else {
return ERROR;
}
}

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;
}
} 4、訪問request、session和application對象
4.1 與 Servlet API 解耦的訪問方式

【工程4:sx_ch0304】:
Java代碼
// 獲得action的執行上下文
ActionContext context = ActionContext.getContext();

// 得到三個對象
Map request = (Map)context.get("request");
Map session = context.getSession();
Map application = context.getApplication();

// 使用三個對象
// 在請求中放置歡迎信息
request.put("greeting", "歡迎光臨");

// 在Session中保存 User 對象
session.put("user", user);

// 統計用戶訪問量,在 application 中保存用戶訪問量數據
Integer count = (Integer) application.get("counter");
if (null == count) {
count = 1;
} else {
count++;
}
application.put("counter", count);

// 獲得action的執行上下文
ActionContext context = ActionContext.getContext();

// 得到三個對象
Map request = (Map)context.get("request");
Map session = context.getSession();
Map application = context.getApplication();

// 使用三個對象
// 在請求中放置歡迎信息
request.put("greeting", "歡迎光臨");

// 在Session中保存 User 對象
session.put("user", user);

// 統計用戶訪問量,在 application 中保存用戶訪問量數據
Integer count = (Integer) application.get("counter");
if (null == count) {
count = 1;
} else {
count++;
}
application.put("counter", count);使用JSP內置的表達式語言來訪問request、session和application範圍的數據:

Jsp代碼
${seesionScope.user.username},${requestScope.greeting}
${applicationScope.counter}

${seesionScope.user.username},${requestScope.greeting}
${applicationScope.counter}【工程5:sx_ch0305】:
利用請求對象來傳遞數據還有一種方式,直接使用 ActionContext 類的put()方法將數據保存到 ActionContext 中:

Jsp代碼
ActionContext.getContext().put("greeting", "歡迎光臨");

ActionContext.getContext().put("greeting", "歡迎光臨");
然後在頁面中,從請求對象中取出 greeting 屬性:

Jsp代碼
${requestScope.greeting}

${requestScope.greeting}或者:

Jsp代碼
<%=request.getAttribute("greeting")%>

<%=request.getAttribute("greeting")%>【工程6:sx_ch0306】:
通過接口注入來獲取request、session和application對象,

request:實現 RequestAware 接口,實現setRequset(Map request)方法
session:實現 SessionAware 接口,實現setSession(Map session)方法
application:實現 ApplicationAware 接口,實現setApplication(Map application)方法
Java代碼
public class LoginAction implements Action, RequestAware, SessionAware,
ApplicationAware {

private User user = new User();

private Map request;

private Map session;

private Map application;

public void setRequest(Map request) {
this.request = request;
}

public void setSession(Map session) {
this.session = session;
}

public void setApplication(Map application) {
this.application = application;
}

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {

// 在請求中放置歡迎信息
request.put("greeting", "歡迎光臨");

// 在Session中保存 User 對象
session.put("user", user);

// 統計用戶訪問量,在 application 中保存用戶訪問量數據
Integer count = (Integer) application.get("counter");
if (null == count) {
count = 1;
} else {
count++;
}
application.put("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}

public class LoginAction implements Action, RequestAware, SessionAware,
ApplicationAware {

private User user = new User();

private Map request;

private Map session;

private Map application;

public void setRequest(Map request) {
this.request = request;
}

public void setSession(Map session) {
this.session = session;
}

public void setApplication(Map application) {
this.application = application;
}

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {

// 在請求中放置歡迎信息
request.put("greeting", "歡迎光臨");

// 在Session中保存 User 對象
session.put("user", user);

// 統計用戶訪問量,在 application 中保存用戶訪問量數據
Integer count = (Integer) application.get("counter");
if (null == count) {
count = 1;
} else {
count++;
}
application.put("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}

4.2 與 Servlet API 耦合的訪問方式

【工程7:sx_ch0307】:
通過ServletActionContext 類來獲取HttpServletRequest和ServletContext對象

HttpServletRequest:public static HttpServletRequest getRequest()
ServletContext:public static ServletContext getServletContext()
注:ServletActionContext 類並沒有提供直接得到 HttpSession 對象的方法,此對象可通過 HttpServletRequest 對象的 getSession() 方法來得到。

Java代碼
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.coderdream.model.User;
import com.opensymphony.xwork2.Action;

public class LoginAction implements Action {
private User user = new User();

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {

HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext context = ServletActionContext.getServletContext();

// 在請求中放置歡迎信息
request.setAttribute("greeting", "歡迎光臨");

// 在Session中保存 User 對象
session.setAttribute("user", user);

// 統計用戶訪問量,在 application 中保存用戶訪問量數據
Integer count = (Integer) context.getAttribute("counter");
if (null == count) {
count = 1;
} else {
count++;
}
context.setAttribute("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.coderdream.model.User;
import com.opensymphony.xwork2.Action;

public class LoginAction implements Action {
private User user = new User();

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {

HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
ServletContext context = ServletActionContext.getServletContext();

// 在請求中放置歡迎信息
request.setAttribute("greeting", "歡迎光臨");

// 在Session中保存 User 對象
session.setAttribute("user", user);

// 統計用戶訪問量,在 application 中保存用戶訪問量數據
Integer count = (Integer) context.getAttribute("counter");
if (null == count) {
count = 1;
} else {
count++;
}
context.setAttribute("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}【工程8:sx_ch0308】:
還可以通過 ActionContext 類的 get() 方法,傳遞 ServletActionContext.HTTP_REQUEST 和 ServletActionContext.SERVLET_CONTEXT 鍵值來獲取HttpServletRequest和ServletContext對象,同樣,通過 ServletActionContext.HTTP_RESPONSE 鍵值來得到 HttpServletResponse 對象



Java代碼
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.coderdream.model.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;

public class LoginAction implements Action {
private User user = new User();

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {
ActionContext ctx = ActionContext.getContext();
// 通過鍵值獲得對象
HttpServletRequest request = (HttpServletRequest) ctx
.get(ServletActionContext.HTTP_REQUEST);
HttpSession session = request.getSession();
ServletContext context = (ServletContext) ctx
.get(ServletActionContext.SERVLET_CONTEXT);

// 在請求中放置歡迎信息
request.setAttribute("greeting", "歡迎光臨");

// 在Session中保存 User 對象
session.setAttribute("user", user);

// 統計用戶訪問量,在 application 中保存用戶訪問量數據
Integer count = (Integer) context.getAttribute("counter");
if (null == count) {
count = 1;
} else {
count++;
}
context.setAttribute("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.coderdream.model.User;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;

public class LoginAction implements Action {
private User user = new User();

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {
ActionContext ctx = ActionContext.getContext();
// 通過鍵值獲得對象
HttpServletRequest request = (HttpServletRequest) ctx
.get(ServletActionContext.HTTP_REQUEST);
HttpSession session = request.getSession();
ServletContext context = (ServletContext) ctx
.get(ServletActionContext.SERVLET_CONTEXT);

// 在請求中放置歡迎信息
request.setAttribute("greeting", "歡迎光臨");

// 在Session中保存 User 對象
session.setAttribute("user", user);

// 統計用戶訪問量,在 application 中保存用戶訪問量數據
Integer count = (Integer) context.getAttribute("counter");
if (null == count) {
count = 1;
} else {
count++;
}
context.setAttribute("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}【工程9:sx_ch0309】:
最後,還可以通過 Action 類實現 ServletRequestAware 和 ServletContextAware 接口,由 Struts2 框架向 Action 實例注入 HttpServletRequest 和 ServletContext 對象:



Java代碼
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;

import com.coderdream.model.User;
import com.opensymphony.xwork2.Action;

public class LoginAction implements Action, ServletRequestAware,
ServletContextAware {
private User user = new User();

private HttpServletRequest request;

private ServletContext context;

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {
HttpSession session = request.getSession();

// 在請求中放置歡迎信息
request.setAttribute("greeting", "歡迎光臨");

// 在Session中保存 User 對象
session.setAttribute("user", user);

// 統計用戶訪問量,在 application 中保存用戶訪問量數據
Integer count = (Integer) context.getAttribute("counter");
if (null == count) {
count = 1;
} else {
count++;
}
context.setAttribute("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

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

public void setServletContext(ServletContext context) {
this.context = context;
}
}

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;

import com.coderdream.model.User;
import com.opensymphony.xwork2.Action;

public class LoginAction implements Action, ServletRequestAware,
ServletContextAware {
private User user = new User();

private HttpServletRequest request;

private ServletContext context;

@SuppressWarnings("unchecked")
public String execute() throws Exception {
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword())) {
HttpSession session = request.getSession();

// 在請求中放置歡迎信息
request.setAttribute("greeting", "歡迎光臨");

// 在Session中保存 User 對象
session.setAttribute("user", user);

// 統計用戶訪問量,在 application 中保存用戶訪問量數據
Integer count = (Integer) context.getAttribute("counter");
if (null == count) {
count = 1;
} else {
count++;
}
context.setAttribute("counter", count);

return SUCCESS;
} else {
return ERROR;
}
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

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

public void setServletContext(ServletContext context) {
this.context = context;
}
}

輸出結果:
發佈了10 篇原創文章 · 獲贊 0 · 訪問量 2826
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章