在Struts2.0裏面有一個非常牛*的功能就是支持更高級的POJO訪問,這句話是什麼意思呢?下面來通過例子實際操作一把就能體會到這個功能的強大與好使了。
要實現的功能:如果用戶輸入用戶名xiaozu,密碼111111,則顯示welcome,xiaozhu!否則提示用戶名或密碼錯誤。
下面是我們所需的文件:
登陸頁面login.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>登陸頁面</title>
</head>
<body>
<s:form action="/test/loginAction.action" method="post">
<s:textfield name="userName" label="用戶名"/>
<s:password name="password" label="密碼"/>
<s:submit/>
</s:form>
</body>
</html>
請求處理LoginAction.java:
- package tutorial;
- import com.opensymphony.xwork2.ActionSupport;
- public class LoginAction extends ActionSupport {
- private String msg="顯示默認消息";
- private String userName;
- private String password;
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getMsg() {
- return msg;
- }
- public String execute(){
- if ("xiaozhu".equals(userName)&&"111111".equals(password)) {
- msg="welcome,"+userName;
- } else {
- msg="用戶名或密碼錯誤";
- }
- return this.SUCCESS;
- }
- }
響應頁面HelloWorld.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello</title>
</head>
<body>
<h3><s:property value="msg"/></h3>
</body>
</html>
如上所示,對於login.jsp表單中的每個值域我們都會在相應的action中聲明一個對應的屬性併產生相應的get和set方法,如果這個表單中的值很多(例如註冊用戶信息的表單),就會導致action十分龐大和容易混亂,並且也不利於我們的軟件分層,違背了OO的原則,下面看一下改進後的方案。
登陸頁面login.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<s:form action="/test/loginAction.action" method="post">
<s:textfield name="user.userName" label="用戶名"/>
<s:password name="user.password" label="密碼"/>
<s:submit/>
</s:form>
</body>
</html>
新增實體類User.java:
- package tutorial;
- public class User {
- private String userName;
- private String password;
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- }
請求處理LoginAction.java:
- package tutorial;
- import com.opensymphony.xwork2.ActionSupport;
- public class LoginAction extends ActionSupport {
- private String msg="顯示默認消息";
- private User user;
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- public String getMsg() {
- return msg;
- }
- public String execute(){
- if("xiaozhu".equals(user.getUserName()) &&"111111".equals(user.getPassword()))
- msg="welcome,"+user.getUserName();
- else
- msg="用戶名或密碼錯誤";
- return this.SUCCESS;//
- }
- }
響應頁面HelloWorld.jsp:
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello</title>
</head>
<body>
<h3><s:property value="msg"/></h3>
</body>
</html>
前後兩種處理方式有何不同呢?後者新建了一個User實體類,用於封裝從表單中接收的數據,而在action中就不用設置相應的屬性和方法了,並且這樣做能夠讓我們的軟件層次感更加明顯,系統結構也更加清晰。以User爲例,描述一下采用這種方式的關鍵步驟:
1. 在action中定義一個User類型的對象:User user;
2. 表單中各個控件的name屬性要採取如下命名規則:對象名.屬性名,注意對象名必須與action中定義的一樣,屬性名也必須和該對象的屬性一一對應。如上例中的user.userName和user.password。