ModelDriven 的好处时,可以将网页提交的数据转换为 类对象。ModelDriven为模板类,模板参数即为转换的类对象的类型。
例如:要在网页上输入:姓名、年龄、地址、电话。并提交到服务器。我们定义类UserModel,来存储这些数据。UserModel即为模板类ModelDriven的模板参数。映射关系如下:
1. 首先定义一个页面index.jsp,让用户输入信息,并提交到服务器。
<%--index.jsp --%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<pre name="code" class="javascript"><pre name="code" class="javascript"><%--注意要包含此标签库 --%>
<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<center>
<s:form action="user">
<s:textfield label="Name" name="name" />
<s:textfield label="Age" name="age" />
<s:textfield label="Phone" name="phone" />
<s:textfield label="Address" name="address" />
<s:submit />
</s:form>
</center>
</body>
</html>
2. 定义类UserModel
package com.action;
public class UserModel {
private String m_name;
private String m_age;
private String m_address;
private String m_phone;
public String getName () {return this.m_name; }
public void setName (String n) { this.m_name = n; }
// 注意这里的方法名,要与 index.jsp中 <s:textfield label="Age" name="age" /> 中name后面的名字一致.
// 例如,jsp文件中的name后为age,所以这里的方法名为:setAge和getAge 。其它的输入项的处理与此类似
public String getAge () { return this.m_age; }
public void setAge (String a) { this.m_age = a; }
public String getAddress () { return this.m_address; }
public void setAddress (String a) { this.m_address = a; }
public String getPhone () { return this.m_phone; }
public void setPhone (String p) { this.m_phone = p; }
}
3. 实现 ModelDriven
package com.action;
import com.action.UserModel;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction extends ActionSupport implements ModelDriven<UserModel> {
private static final long serialVersionUID = 1L;
private UserModel m_userModel = new UserModel ();
// 注意必须实现此方法。 struts框架会调用此方法获取对象,并调用对应的方法(例如:setAge)保存输入的参数信息。
public UserModel getModel () {
return this.m_userModel;
}
public String execute () throws Exception {
ActionContext context = ActionContext.getContext();
// 这里的user与success.jsp中的user对应。设置此的目的在于,在于在success.jsp页面中,可以根据user获取对象,并显示数据。
context.put("user", this.m_userModel);
return SUCCESS;
}
}
4. 定义结果展示页面success.jsp
<%--success.jsp --%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<center>
<s:property value="#user.name" /><br/> <%--注意这里name只能小写,类方法名要大写 --%>
<s:property value="#user.age" /><br/>
<s:property value="#user.phone" /><br/>
<s:property value="#user.address" /><br/>
</center>
</body>
</html>
5. 另外,还需要配置web.xml 与struts.xml文件。
Struts框架是基于过滤器实现的,因此需要在web.xml中配置过滤器。主要是配置过滤器的名字,以及过滤器名字对应的URL信息。核心配置如下:
<filter>
<filter-name>Struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
struts.xml文件主要是配置哪个一个action由哪个类处理。处理后的结果显示到哪儿。 核心配置如下:
<package name="default" namespace="/" extends="struts-default">
<action name="user" class="com.action.LoginAction">
<result name="success">/success.jsp</result>
</action>
</package>
核心的配置是说在/空间下,存在一个名为user的action(在index.jsp中已经标明其action为user)。此action由类com.action.LoginAction处理。此类为前面实现ModelDriven时的类。 处理结果由success.jsp显示。