1. 程式人生 > >從struts 1.x升級到 struts 2(二) POJO

從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 
extends ActionSupport implements ServletRequestAware 
{
    
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>