1. 程式人生 > >Struts2資料處理的三種方式(ioc思想)

Struts2資料處理的三種方式(ioc思想)

ioc思想(控制反轉,注入),資料不需要手動獲取,型別也不需要手動轉換(數字直接給你轉成int,日期符合格式會給你轉成日期格式...)。

一、屬性驅動:

使用 struts2獲取表單資料:只需表單域名稱和 Action處理類的屬性名稱一致,並且提供屬性的set方法,那麼在 Action處理類中即可獲得表單資料。

登入頁面login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="login.action" method="post">
		username:<input type="text" name="username"><br>
		password:<input type="text" name="password"><br>
		<input type="submit" value="login">
	</form> 
</body>
</html>

 

 struts.xml頁面

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="default" extends="struts-default" namespace="/">
		<!-- 模型驅動 -->
		<action name="login" class="cn.sxt.action.LoginAction" method="login">
			<result>/sucess.jsp</result>
		</action>
	</package>
</struts>

Action處理類

/**
 * 屬性驅動
 */
import com.opensymphony.xwork2.Action;
public class LoginAction {
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public String getPassword() {
		return password;
	}
	public void setUsername(String username) {//一定要有
		this.username = username;
	}
	public void setPassword(String password) {//一定要有
		this.password = password;
	}
	//登入處理業務
	public String login() {
		System.out.println("username="+username+"\tpassword="+password);
		return Action.SUCCESS;
	}
}

如果資料需要顯示到頁面上,那麼該資料可以做為處理類的屬性,處理方法後該屬性有值,並且有該屬性的get方法。那麼在頁面上可以直接通過el表示式獲取。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${username}:${password}登入成功</h1>
</body>
</html>

 屬性驅動用的比較少,屬性驅動命名要注意。

 二、物件驅動:

在Action的處理類中,屬性以物件方式存在,該屬性物件只需宣告即可,需要保證該屬性物件有無參構造方法,並且提供get/set方法。在表單域中的表單域名稱以 屬性物件名.屬性物件的屬性來命名。

登入頁面login4.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="login4.action" method="post">
		username:<input type="text" name="user.username"><br><!--屬性物件名.屬性物件的屬性-->
		password:<input type="text" name="user.password"><br><!--屬性物件名.屬性物件的屬性-->
		<input type="submit" value="login">
	</form> 
</body>
</html>

 struts.xml頁面 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="default" extends="struts-default" namespace="/">
		<!-- 物件驅動 -->
		<action name="login4" class="cn.sxt.action.LoginAction4" method="login">
			<result>/sucess4.jsp</result>
		</action>
	</package>
</struts>

Action處理類

import com.opensymphony.xwork2.Action;
import cn.sxt.vo.User;
/**
 * 物件驅動
 */
public class LoginAction4 {
	//保證物件要有無參的構造方法
	private User user;//在 Action的處理類中,屬性以物件方式存在,該屬性物件只需宣告可
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	//登入業務
	public String login() {
		System.out.println("username="+user.getUsername()+":password="+user.getPassword());
		return Action.SUCCESS;
	}
}

顯示資料的頁面 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>username:${user.username}</h1>
<h1>password:${user.password}</h1>
</body>
</html>

第二種方式用的比較多。 

  三、模型驅動:

在物件驅動中,頁面的表單域名稱比較的複雜,如果物件屬性比較多的情況下,程式碼量較大。通過模型驅動可以解決這個問題。(我就可以不用向上面對象驅動一樣屬性物件名.屬性物件的屬性  直接用屬性),模型驅動需要實現 ModelDriven介面,並且主動將物件建立好。

處理類

1、手動建立物件。

2、實現ModelDriven<> 介面  ModelDriven<要注入的物件>。

3、getModel()方法返回建立的物件。

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack;
import cn.sxt.vo.User;
/**
 * 模型驅動
 * 在物件驅動中,頁面的表單域名稱比較的複雜,如果物件屬性比較多的情況下,程式碼量比較大。通過模型驅動可以解決這個問題。
 */
//com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor
public class LoginAction implements ModelDriven<User>{//需要實現ModelDriven介面
	
	private User user = new User();//物件需要自己去建立
	public User getUser() {
		return user;//return user = new User();//物件需要自己去建立
	}
	public void setUser(User user) {
		this.user = user;
	}
	//登入業務
	public String login() {
		System.out.println("username="+user.getUsername()+":password="+user.getPassword());
		return Action.SUCCESS;
	}
	@Override
	public User getModel() {
		
		return user;
	}
	//  實現方式  攔截器
	/* com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor
	   public String intercept(ActionInvocation invocation) throws Exception {
	        Object action = invocation.getAction();

	        if (action instanceof ModelDriven) {
	            ModelDriven modelDriven = (ModelDriven) action;
	            ValueStack stack = invocation.getStack();
	            Object model = modelDriven.getModel();  //返回我手動建立的物件
	            if (model !=  null) { //不為空我才加入
	            	stack.push(model);
	            }
	            if (refreshModelBeforeResult) {
	                invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
	            }
	        }
	        return invocation.invoke();
	    }*/

}

 struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!--extends必須寫,直接或者間接繼承struts-default name自定義 -->
	<package name="default" extends="struts-default" namespace="/">
		<!-- 模型驅動 -->
		<action name="login" class="cn.sxt.action.LoginAction" method="login">
			<result>/sucess.jsp</result>
		</action>
	</package>
</struts>

登入頁面login.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="login.action" method="post">
		username:<input type="text" name="username"><br><!--不需要 user. 了  -->
		password:<input type="text" name="password"><br>
		<input type="submit" value="login">
	</form> 
</body>
</html>

顯示頁面sucess.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>username:${username}</h1>
<h1>password:${password}</h1>
</body>
</

在 ModelDriven裡面他要去判斷物件是否為空,所以去們需要手動建立。