在上例中,其实我只使用了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;

public class LoginAction extends ActionSupport implements ServletRequestAware

...{
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest request)

...{
this.request = request;
}

private String userName;
public String getUserName()

...{
return this.userName;
}
public void setUserName(String userName)

...{
this.userName = userName;
}
private String password;
public String getPassword()

...{
return this.password;
}
public void 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;

public class User

...{
private String userName;
public String getUserName()

...{
return this.userName;
}
public void setUserName(String userName)

...{
this.userName = userName;
}
private String password;
public String getPassword()

...{
return this.password;
}
public void 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;

public class LoginAction extends ActionSupport implements ServletRequestAware

...{
private HttpServletRequest request;
public void setServletRequest(HttpServletRequest request)

...{
this.request = request;
}
private User user;
public User getUser()

...{
return this.user;
}
public void 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>