属性驱动 需要提供很多set、get方法,action类就像一个javabean,既要接收请求又要封装数据 耦合性较高,页面上还要使用OGNL表达式来处理。
模型驱动 的方法在请求页面上没有变化,只需在action类中实现ModelDriven<T>接口并实现其方法getModel返回实例化的javabean对象即可。
以下代码请求页面与struts.xml配置文件用的都是同一个,javabean标准生成的就不贴了。:
请求页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<h3>模型驱动</h3>
<form action="${ pageContext.request.contextPath }/ModelDrivenDemo"
method="post">
姓名:<input type="text" name="username" /><br />
密码:<input type="password" name="password" /><br />
<input type="submit" value="注册" />
</form>
<br/>
<h3>属性驱动</h3>
<form action="${ pageContext.request.contextPath }/FieldDrivenDemo"
method="post">
姓名:<input type="text" name="username" /><br />
密码:<input type="password" name="password" /><br />
<input type="submit" value="注册" />
</form>
<h3>属性驱动超链接</h3>
<a href="${ pageContext.request.contextPath }/FieldDrivenDemo?username=alex&password=123">链接</a>
<br/>
<h3>属性驱动2 -- 使用OGNL表达式进行数据封装</h3>
直接使用域对象(推荐用这种):
struts2提供了直接使用域对象的属性驱动(即把属性和对应的
getter/setter方法从Action里面移出去,单独封装成一个域对象,然后在Action类中直
接使用这个域对象就可以了。需要改变的是,在相应的name属性上,添加一个域对象的前
缀,指明这个值到
底对应到哪一个域对象里去。(需要有setter方法)
<form action="${ pageContext.request.contextPath }/FieldDrivenDemo2"
method="post">
姓名:<input type="text" name="user.username" /><br />
密码:<input type="password" name="user.password" /><br />
<input type="submit" value="注册" />
</form>
<h3>属性驱动超链接</h3>
<a href="${ pageContext.request.contextPath }/FieldDrivenDemo2?user.username=alex&user.password=123">链接</a>
</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" namespace="/" extends="struts-default">
<!-- 全局result -->
<global-results>
<result name="success">/main.html</result>
</global-results>
<!-- 不写method直接执行action类中的execute方法 -->
<action name="demoAction" class="web.action.ActionDemo1"/>
<action name="userAction_*" class="web.action.UserAction" method="{1}">
<result name="msg">/retMsg.jsp</result>
</action>
<!-- 演示属性驱动 -->
<action name="FieldDrivenDemo" class="web.action.FieldDrivenDemo"/><!-- 默认方法 -->
<action name="FieldDrivenDemo" class="web.action.FieldDrivenDemo" method="demo1"/><!-- 指定方法 -->
<!-- 演示模型驱动 -->
<action name="ModelDrivenDemo" class="web.action.ModelDrivenDemo" method="demo" />
<action name="FieldDrivenDemo2" class="web.action.FieldDrivenDemo2" />
</package>
</struts>
属性驱动
使用属性驱动的action
package web.action;
import com.opensymphony.xwork2.ActionSupport;
import domain.User;
/**
* 通过属性驱动的方式来封装请求数据 OGNL表达式
* @author Administrator
*
*/
public class FieldDrivenDemo2 extends ActionSupport {
/**
* 通过OGNL表达式来封装数据
*
* 1.在action类中需要定义一个javabean的属性(无需实例化),提供get,set方法
* 2.需要在前端使用OGNL表达式,如下简单的传值链接:
* <a href="xxx/xxxAction?action类中bean成员变量名.属性=值">链接</a>
*/
private static final long serialVersionUID = 4777771838176721169L;
//定义bean成员变量,并提供get、set方法
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//正常使用封装后的javabean
@Override
public String execute() throws Exception {
System.out.println(user.getUsername() + ":" + user.getPassword());
return NONE;
}
}
使用OGNL的属性驱动action类
package web.action;
import com.opensymphony.xwork2.ActionSupport;
import domain.User;
/**
* 通过属性驱动的方式来封装请求数据 OGNL表达式
* @author Administrator
*
*/
public class FieldDrivenDemo2 extends ActionSupport {
/**
* 通过OGNL表达式来封装数据
*
* 1.在action类中需要定义一个javabean的属性(无需实例化),提供get,set方法
* 2.需要在前端使用OGNL表达式,如下简单的传值链接:
* <a href="xxx/xxxAction?action类中bean成员变量名.属性=值">链接</a>
*/
private static final long serialVersionUID = 4777771838176721169L;
//定义bean成员变量,并提供get、set方法
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//正常使用封装后的javabean
@Override
public String execute() throws Exception {
System.out.println(user.getUsername() + ":" + user.getPassword());
return NONE;
}
}
模型驱动的代码:
action类
package web.action;
import com.opensymphony.xwork2.ModelDriven;
import domain.User;
/**
* 使用模型驱动的方式来封装请求参数
*
* #需要实现modeldriven接口,并实现其方法getModel返回实例化的bean对象
*
*
* @author Administrator
*
*/
public class ModelDrivenDemo implements ModelDriven<User>{
//实例化bean对象
private User user = new User();
/*
* 实现方法并返回实例化bean对象
* (non-Javadoc)
* @see com.opensymphony.xwork2.ModelDriven#getModel()
*/
@Override
public User getModel() {
return user;
}
public void demo() {
System.out.println(user);
}
}