從struts 1.x升級到 struts 2(二) POJO
在上例中,其實我只使用了struts2中的簡單MVC對映,同時,我在servlet和JSP中大量使用了request物件,而且沒有使用任何的struts標籤,這些都是struts不希望使用者做的事情。但是,我在寫本文的時候,更想從最原始的地方入手,一步步地揭示struts的功能。老本兒不能忘啊,我可不希望某天我離了struts後,發現地球不轉了。
POJO,簡單的Java物件(Plain Old Java Objects)實際就是普通JavaBeans,使用POJO名稱是為了和EJB混淆起來, 而且簡稱比較直接. 有一些屬性及其getter setter方法的類,有時可以作為value object或dto來使用.當然,如果你有一個簡單的運算屬性也是可以的,但不允許有業務方法,不能攜帶有connection之類的,例如針對某個資料庫表的對映類,裡面用getter和setter方法來表示每一個欄位,但不帶任何的的Insert、Delete之類的操作。
簡單POJO
本節講述struts使用的POJO技術代替request.getParameter()方法來獲取表單輸入。除了LoginAction.java外,上節的所有程式均不變,LoginAction.java修改如下:
package example;
import javax.servlet.http.HttpServletRequest;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
publicclass LoginAction
{
private HttpServletRequest request;
publicvoid setServletRequest(HttpServletRequest request)
{
this.request = request;
}
private String userName;
public String getUserName()
{
returnthis.userName;
publicvoid setUserName(String userName)
{
this.userName = userName;
}
private String password;
public String getPassword()
{
returnthis.password;
}
publicvoid setPassword(String password)
{
this.password = password;
}
public String execute() throws Exception
{
if(this.userName.equals("lld") &&this.password.equals("lld"))
{
this.request.setAttribute("UserName", this.userName);
this.request.setAttribute("Password", this.password);
return"success";
}else
return"failed";
}
}
根據JSP頁面上表單輸入物件的名稱,在servlet類中建立對應名稱的getter及setter,執行後我們會神奇地發現,系統自動呼叫了setter,將表單中的資料傳到了變數中!
無論是以get還是以post方式傳入的引數,struts POJO都能夠支援。
高階POJO
Struts 2.0更厲害的是支援更高階的POJO訪問,我們可以將userName和password從LoginAction類中分離為單獨的類User。這樣對我們開發多層系統尤其有用,它可以使系統結構更清晰。
新建的User.java如下所示
package example;
publicclass User
{
private String userName;
public String getUserName()
{
returnthis.userName;
}
publicvoid setUserName(String userName)
{
this.userName = userName;
}
private String password;
public String getPassword()
{
returnthis.password;
}
publicvoid setPassword(String password)
{
this.password = password;
}
}
而LoginAction.java改為如下形式:
package example;
import javax.servlet.http.HttpServletRequest;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
publicclass LoginAction extends ActionSupport implements ServletRequestAware
{
private HttpServletRequest request;
publicvoid setServletRequest(HttpServletRequest request)
{
this.request = request;
}
private User user;
public User getUser()
{
returnthis.user;
}
publicvoid setUser(User user)
{
this.user = user;
}
public String execute() throws Exception
{
if(this.user.getUserName().equals("lld") &&this.user.getPassword().equals("lld"))
{
this.request.setAttribute("UserName", this.user.getUserName());
this.request.setAttribute("Password", this.user.getPassword());
return"success";
}else
return"failed";
}
}
將Login.jsp修改如下:
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<html>
<head>
<title>Login</title>
</head>
<body>
<form name="form1" action="/tutorial/example/Login.action" method="post">
user name: <input type="text" name="user.UserName"/><br />
password: <input type="password" name="user.Password"/><br />
<input type="submit" value="Submit"/>
</form>
</body>
</html>