Struts2資料處理的三種方式(ioc思想)
阿新 • • 發佈:2019-01-11
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裡面他要去判斷物件是否為空,所以去們需要手動建立。