Struts2详细实例教程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Struts2(上)
一、经典的MVC模式
二、Struts1.x对MVC的实现
三、Struts1.x的主要组件和作用
组件作用
ActionServlet 中央控制器
Action 分控制器,调用JavaBean实现业务逻辑,
Action可以分为Action、DispatchAction等不
同类型
ActionForm 封装参数,实现服务器验证,文件上传等Forward 转发到目的地,可以是JSP,也可以是另一个
Action
Struts-config.xml 配置文件,配置有ActionForm,Action,Forward
等,通过XML解析,然后使用反射技术使用
该文件
Struts标签库和JSTL类似,和Struts-config.xml、
ActionForm、Action等对象可以紧密集成
四、Struts1.x 开发实例-登录程序
见案例。

五、Struts2(WebWork)的MVC
Struts2的MVC架构
六、Struts2的主要组件
组件作用
FilterDispatcher 起中央控制器作用的过滤器
Action 处于Model层的Action,调用JavaBean实现
业务逻辑
struts.xml 核心配置文件,配置有Action、Result等result 和forward类似,转发的目的地,支持多种视
图技术。

七、Struts2的实例-登录
在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:\Struts2Login”。

在Struts2.0.11版本中找到war包struts2-blank-2.0.11.war,解开该war包,在WEB-INF/lib 目录下复制出所有的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB-INF/lib目录中。

在src目录下建立一个类,包名mypack,类名UserAction,其代码如下:
package mypack;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String username;
private String userpass;
public String getUsername() {
return username;
}
public void setUsername(String username) {
ername = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
erpass = userpass;
}
@Override
public String execute() throws Exception {
if ("Mike".equals(username) && "123".equals(userpass)
|| "张三".equals(username) && "abc".equals(userpass))
return "success";
else
return "error";
}
}
在src目录下建立Struts2的配置文件struts.xml,内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"/dtds/struts-2.0.dtd">
<struts>
<!-- 定义包管理配置的action 继承struts-default.xml中的配置 -->
<package name="actions" extends="struts-default">
<!-- 定义Action(login.action) -->
<action name="login" class="erAction">
<!-- 定义转发路径对应的字符串名 -->
<result name="success">/Success.jsp</result>
<result name="error">/Error.jsp</result>
</action>
</package>
</struts>
修改web.xml,在其中加入一个过滤器,过滤/*路径。

<!-- 过滤器类 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter>
<!-- 过滤所有的url请求 -->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在webroot目录下编写3个jsp页面,index.jsp、Success.jsp和Error.jsp,注意这里把page 指令中的pageEncoding设置为“utf-8”,就没有中文问题了。

index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<!-- 提交到action -->
<form action="login.action" method="post">
用户名:
<!-- 参数名和action中的属性名一样 -->
<input type=text name=username>
<br>
密&nbsp;&nbsp;码:
<input type=password name=userpass>
<br>
<input type=submit name=subm value="提交">
<input type=reset name=reset value="取消">
</form>
</body>
</html>
●Success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'Success.jsp' starting page</title> </head>
<body>
<h1>
欢迎
<%=request.getParameter("username")%>
,登录
</h1>
</body>
</html>
●Error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'Error.jsp' starting page</title>
</head>
<body>
<h1>
用户名或密码错误!
</h1>
</body>
</html>
把程序部署在tomcat5.5以上的版本中运行。

图1-2 index.jsp
图1-3 Success.jsp
八、Struts2的中文乱码解决
中文乱码问题一般是指当请求参数有中文时,无法在Action中得到正确的中文。

Struts2中有2种办法可以解决这个问题:
●设置JSP页面的pageEncoding=”utf-8”,就不会出现中文乱码;
●如果JSP页面的pageEncoding=”GBK”,那么需要修改struts.i18n.encoding=GBK,在
struts.xml中加入如下语句进行修改。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GBK"/>
……
</struts>
上面2种方法可以解决POST请求中的中文参数,但是GET请求中的中文参数不能解决,GET请求中的中文参数的乱码需要通过修改Tomcat的server.xml文件来解决,修改如下内容,加入URIEncoding=”GBK”:
<Connector p ort="8080" …… URIEncoding="GBK"/>
九、Struts2的Action中访问web对象
Struts2的Action就是一个普通的POJO对象,它和Web对象request、response、session
和application没有耦合在一起,这样便于单独测试Action,那么我们在Action中如何访问这些web对象呢?
访问这些web内部对象有2种方式:
●直接访问Web对象
Struts2框架提供org.apache.struts2.ServletActionContext辅助类来获得web对象。

HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();
●Action访问ActionContext
com.opensymphony.xwork2.ActionContext是一个Action执行的上下文,Action执行期间所用到的对象都保存在ActionContext中,例如session、参数等,并且ActionContext是一个局部线程变量,不用担心Action的线程安全。

ActionContext context = ActionContext.getContext();
该类的常用方法见表1-3所示:
表1-3 ActionContext中的常用方法
Object get(Object key) 使用key来查找当前ActionContext中的值
Map getApplication() 返回一个Application范围的Map
static ActionContext getContext() 获得当前线程的ActionContext实例
Map getParameters() Map类型的所有HttpServletRequest的参数
Map getSession() Map类型的HttpSession值
ValueStack getValueStack() 返回一个ValueStack类型OGNL值栈
void put(Object key,Object value) 向当前ActionContext存入值,等于在
HttpServletRequest中加入值
void setApplication(Map application) 设置application上下文
void setSession(Map session) 设置session值,参数为Map实例这种方法使用的所有对象和Web对象没有直接联系,所以在测试的时候也是很方便的,我们推荐在程序中使用此方法来访问web对象。

十、操作实例Struts2实现按类别查询图书
本案例的工程文件结构如图1-7所示,文件说明见表1-4所示:
图1-7 案例的工程文件结构
表1-4 案例的文件说明
文件名说明
BookAction.java Strut2的Action
DbConn.java 数据库连接类
BookOper.java 数据库查询类
Book.java 数据对象类
struts.xml Struts2的action配置文件
web.xml Web应用配置文件,Struts2框架在其中配置了Filter
booklist.jsp 显示查询结果页面
Index.jsp 输入书籍类别的页面
1.生成一个web project,名称为“Struts2按类别查询图书”,指定存放路径为f:\ Struts2
按类别查询图书;
2.生成Model层的JavaBean;
数据库连接类DbConn.java
package db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DbConn {
public static Connection getConn() {
Connection conn = null;
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn = DriverManager.getConnection(
"jdbc:sqlserver://localhost:1433;databasename=pubs", "sa",
"");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
}
数据库查询类BookOper.java
package oper;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import po.Book;
public class BookOper {
public List<Book> selectByType(String type) {
Connection conn = db.DbConn.getConn();
java.sql.PreparedStatement pstmt = null;
java.sql.ResultSet rs = null;
List<Book> data = new ArrayList<Book>();
try {
pstmt = conn
.prepareStatement("select title_id,title,type,price from titles where type=?");
pstmt.setString(1, type);
rs = pstmt.executeQuery();
while (rs.next()) {
Book book = new Book();
book.setTitleid(rs.getString(1));
book.setTitle(rs.getString(2));
book.setType(rs.getString(3));
book.setPrice(rs.getFloat(4));
data.add(book);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (rs != null)
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (pstmt != null)
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return data;
}
}
数据持久化类Book.java
package po;
//图书的数据类
public class Book {
private String titleid;
private String title;
private String type;
private float price;
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getTitleid() {
return titleid;
}
public void setTitleid(String titleid) {
this.titleid = titleid;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
3.生成Struts2的Action对象,在src目录中编写action的配置文件struts.xml;
BookAction.java
package action;
import oper.BookOper;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class BookAction extends ActionSupport {
private String type; //书类型
private BookOper bo = new BookOper(); //查询类
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
//查询结果放在request中
ActionContext.getContext().put("booklist", bo.selectByType(type));
//返回success指定的页面
return SUCCESS; //"success"
}
}
●struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"/dtds/struts-2.0.dtd">
<struts>
<package name="actions" extends="struts-default">
<action name="typequery" class="action.BookAction">
<!-- name="success" -->
<result>/booklist.jsp</result>
</action>
</package>
</struts>
4.生成JSP页面index.jsp和booklist.jsp;
●index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<h1>按类别查询图书</h1>
<form action="typequery.action" method="post">
书籍类别:<input type=text name=type> <!-- 参数名和action中属性名一样 --> <input type=submit name=subm value="查询">
</form>
</body>
</html>
●booklist.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'booklist.jsp' starting page</title> </head>
<body>
<h1>查询结果</h1>
<table border=1>
<tr><th>编号</th><th>名称</th><th>类型</th><th>单价</th></tr>
<c:forEach var="book" items="${booklist}">
<tr><td>${book.titleid }</td>
<td>${book.title }</td>
<td>${book.type }</td>
<td>${book.price }</td></tr>
</c:forEach>
</table>
</body>
</html>
5.修改web.xml,在其中配置Struts2的过滤器;
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="/xml/ns/j2ee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/j2ee
/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
6.在tomcat5.5以上版本中部署web程序为“type”,运行效果如图1-8和1-9。

图1-8 index.jsp
图1-9 booklist.jsp
Struts2(下)
一、Action的分类
1.继承ActionSupport实现Action
通过继承ActionSupport来实现Action是我们的推荐做法,因为ActionSupport中提供了输入验证、国际化、execute等常用方法,使得编写Action时代码很简单。

package mypack;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorld extends ActionSupport {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
message = "大家好!";
return SUCCESS;
}
}
ActionSupport实现了Action接口,这个接口中定义了一些常量和execute方法。

public abstract interface com.opensymphony.xwork2.Action{
// 定义常量
public static final ng.String SUCCESS = "success";
public static final ng.String NONE = "none";
public static final ng.String ERROR = "error";
public static final ng.String INPUT = "input";
public static final ng.String LOGIN = "login";
// 定义抽象方法
public abstract ng.String execute() throws Exception;
}
ActionSupport类的代码部分内容如下:
public class com.opensymphony.xwork2.ActionSupport implements
com.opensymphony.xwork2.Action,com.opensymphony.xwork2.Validateable,
com.opensymphony.xwork2.ValidationAware,com.opensymphony.xwork2.TextProvider ,
com.opensymphony.xwork2.LocaleProvider,java.io.Serializable{
......
//添加字段异常
public void addFieldError(ng.String fieldName,ng.String errorMessage){}
//execute
public String execute() throws Exception{}
//输入验证
public void validate(){}
......
}
struts.xml的配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"/dtds/struts-2.0.dtd">
<struts>
<package name="actions" extends="struts-default">
<action name="hello" class="mypack.HelloWorld">
<result>/Success.jsp</result>
</action>
</package>
</struts>
2.模型驱动(ModelDriven)的Action
Struts2的Action属于MVC模型层,Action中的方法代表业务逻辑,Action中的属性代表请求中的参数,当页面请求参数较多的时候,把过多的参数对象的属性定义在Action中不太符合Struts所倡导的松耦合原则,所以我们推荐单独用JavaBean来封装参数,在Action 中为JavaBean赋值,这就是ModelDriven的Action。

模型驱动的Action要求Action实现ModelDriven接口,假如登录页面需要传输参数username和userpass,我们把这2个参数封装在一个数据的JavaBean中,然后在Action中定义该JavaBean为Model即可,代码如下: Userinfo.java
package po;
//用户名和密码的封装对象
public class Userinfo {
private String username;
private String userpass;
public String getUsername() {
return username;
}
public void setUsername(String username) {
ername = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
erpass = userpass;
}
}
●UserAction.java
package action;
import erinfo;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<Userinfo> {
private Userinfo model = new Userinfo();
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
//返回模型对象的实例
public Userinfo getModel() {
// TODO Auto-generated method stub
return model;
}
}
当请求该Action的时候,请求中的参数会自动填充到模型Userinfo的属性中,当然需要参数名和属性名一样,到跳转的页面上利用Struts2标签<s:property value="username" />可以取出模型Userinfo中的属性username。

在ModelDriven接口中的方法getModel()必须实现,通过它告诉系统模型的具体对象是什么。

●struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"/dtds/struts-2.0.dtd">
<struts>
<package name="actions" extends="struts-default">
<action name="user" class="erAction">
<result>/new.jsp</result>
</action>
</package>
</struts>
●new.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'new.jsp' starting page</title>
</head>
<body>
username:<s:property value="username" />
</body>
</html>
3.多方法的Action
Action中的方法代表业务逻辑,那么一个模块中的多个业务逻辑如何用Action来处理呢?我们有2种办法来处理这个问题:
1.一个Action对应一个业务逻辑,实现方便,但是Action数量多,struts.xml中需要配置
的内容也多,这种方法不推荐;
2.一个Action对应多个业务逻辑,例如表的CRUD操作,含有多个业务逻辑,我们只写
一个Action来实现,Action的数量没有增加,struts.xml的配置也简单,所以这种方法是我们推荐的做法。

Action中自定义方法的声明和execute方法一样,方法的调用路径为“Action名称!方法名称.action”。

public String 方法名() throws Exception{}
以用户表Userinfo的CRUD操作为例,看一下多方法Action的代码:
package action;
import erinfo;
import erService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class CrudUserAction extends ActionSupport implements ModelDriven<Userinfo> {
// crud业务方法
private UserService userservice = new UserService();
private Userinfo userinfo=new Userinfo();
// 模型对象userinfo
public Userinfo getModel() {
// TODO Auto-generated method stub
return userinfo;
}
// 增加
public String create() throws Exception {
userservice.createUser(userinfo);
return SUCCESS;
}
// 查询
public String retrive() throws Exception {
// 查询结果放在request中
ActionContext.getContext().put("userlist", userservice.selectUsers());
return "list";
}
// 修改
public String update() throws Exception {
userservice.updateUser(userinfo);
return SUCCESS;
}
// 删除
public String delete() throws Exception {
userservice.deleteUser(userinfo.getUsername());
return SUCCESS;
}
// 默认的execute
public String execute() throws Exception {
return SUCCESS;
}
}
在struts.xml中配置如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"/dtds/struts-2.0.dtd">
<struts>
<package name="actions" extends="struts-default">
<action name="CrudUser" class="action.CrudUserAction">
<result>/Success.jsp</result>
<result name="list">/UserList.jsp</result>
</action>
</package>
</struts>
调用CRUD业务逻辑的请求路径见表2-1。

表2-1 多方法Action中每个方法的请求路径
业务逻辑方法请求路径
create() CrudUser!create.action
retrive() CrudUser!retrive.action
update() CrudUser!update.action
delete() CrudUser!delete.action
execute() CrudUser.action
二、Result类型
Action中表示跳转的目的地使用了在struts.xml配置的字符串,格式为:<result name=””type=””></result>,type可以有多种选择,Struts2支持各种视图技术,例如JSP、JSF、XML 等,默认的是JSP。

常见的type类型配置如下:
●dispatcher
转发到JSP页面,和<jsp:forward page=””/>的效果一样,是默认类型。

<result>/Success.jsp</result>
<result name=”a”>/Success.jsp</result>
<result name=”b” type=”dispatcher”>/Success.jsp</result>
●redirect
重定向到JSP页面,和response.sendRedirect(“”)的效果一样。

<result name=”a” type=”redirect”>/Success.jsp</result>
●redirect-action
重定向到action,目的地为Action,配置时可以指定如下两个参数:actionName-重定向的Action名;namespace-重定向的Action所在的命名空间。

<result name=”a” type=”redirect-action”>
<param name=”actionName”>myaction</param>
<param name=”namespace”>/test</param>
</result>
●chain
转发到action,形成action-chain,可以指定两个参数:actionName-重定向的Action名;namespace-重定向的Action所在的命名空间。

<result type=”chain”>
<param name=”actionName”>myaction</param>
<param name=”namespace”>/test</param>
</result>
●stream
用于向页面返回一个InputStream,原始数据直接传递给HttpServletResponse,这种结果类型在用户下载文件(例如PDF文件等)等情况下非常有意义。

<result name=”success” type=”stream”>
<param name=”contentType”>image/jpg</param>
<param name=”inputName”>imageStream</param>
<param name=”contentDisposition”>filename=”document.pdf”</param>
<param name=”buffersize”>1024</param>
</result>
●plaintext
用于输出目的地JSP/HTML的源代码内容,可以指定两个参数:location-目的地JSP/HTML,charSet-输出内容时使用的字符集。

<result name="success" type="plaintext">
<param name="location">/Success.jsp</param>
<param name="charset">utf-8</param>
</result>
除了上述类型以外,还支持如下的类型:
●chart:用于整合JFreeChart的result类型;
●freemarker:用于整合FreeMarker的result类型;
●httpheader:用于处理特殊http行为的result类型;
●jasper:用于整合JasperReport的result类型;
●jsf:用于整合JSF的result类型;
●titles:用于整合Titles的result类型;
●velocity:用于整合Velocity的result类型;
●xslt:用于整合XML/XSLT的result类型。

这些视图技术的支持,有些还需要导入相应的插件包,即Struts2提供的含有plugin字样的jar包。

三、输入验证
1.javaScript客户端验证
2.validate方法验证
●在Action中加入validate验证方法,把添加和修改时验证分开,添加用户时验证方法为
validateCreate(),修改用户时的验证方法为validateUpdate()。

package action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import erOper;
import erinfo;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven<Userinfo> {
// 数据模型
private Userinfo user = new Userinfo();
// 业务类
private UserOper uo = new UserOper();
public Userinfo getModel() {
// TODO Auto-generated method stub
return user;
}
// 增加前
public String precreate() throws Exception {
return "addupdate";
}
// 增加
public String create() throws Exception {
uo.create(user);
return select();
}
// 删除
public String delete() throws Exception {
uo.delete(user.getUserid());
return select();
}
// 修改
public String update() throws Exception {
uo.update(user);
return select();
}
// 查询
public String select() throws Exception {
ActionContext.getContext().put("userlist", uo.retriveAll());
return SUCCESS;
}
// 查询单个
public String retrive() throws Exception {
Userinfo myuser = uo.retriveOne(user.getUserid());
user.setUsername(myuser.getUsername());
user.setUserpass(myuser.getUserpass());
user.setSex(myuser.getSex());
user.setSfz(myuser.getSfz());
user.setBirthday(myuser.getBirthday());
user.setWorktime(myuser.getWorktime());
user.setEmail(myuser.getEmail());
user.setInterest(myuser.getInterest());
user.setIntro(myuser.getIntro());
user.setXl(myuser.getXl());
return "addupdate";
}
// 验证方法
// 增加时验证
public void validateCreate() {
checkForm();
// 用户名是否存在
if(uo.checkUserName(user.getUsername()))
this.addFieldError("username", "用户名已经被占用");
}
// 修改时验证
public void validateUpdate() {
checkForm();
if(uo.checkUserName(user.getUsername(),user.getUserid()))
this.addFieldError("username", "用户名已经被占用");
}
// 验证要求
public void checkForm() {
HttpServletRequest request = ServletActionContext.getRequest();
// 用户名不能为空
if (user.getUsername() == null || user.getUsername().equals("")) this.addFieldError("username", "用户名不能为空");
// 密码不能为空
if (user.getUserpass() == null || user.getUsername().equals("")) this.addFieldError("userpass", "密码不能为空");
// 2次密码相同
else if
(!user.getUserpass().equals(request.getParameter("userpass1")))
this.addFieldError("userpass", "2次密码不一样");
// 身份证不能为空
if (user.getSfz() == null || user.getSfz().equals(""))
this.addFieldError("sfz", "身份证不能为空");
// 身份证必须是15或18位
else if (!user.getSfz().matches("^\\d{17}[\\d|X]|\\d{15}$")) this.addFieldError("sfz", "身份证必须是15位或18位");
// email不能为空
if (user.getEmail() == null || user.getEmail().equals("")) this.addFieldError("email", "Email不能为空");
else if (!user.getEmail().matches("^\\w+@\\w+(\\.\\w+)+$")) this.addFieldError("email", "Email格式错误");
// 生日不能为空
if (user.getBirthday() == null)
this.addFieldError("birthday", "生日不能为空");
// 兴趣至少选一项
if (user.getInterest() == null)
this.addFieldError("interest", "兴趣至少选一项");
// 工作年限1-100之间
if (user.getWorktime() < 1 || user.getWorktime() > 100)
this.addFieldError("worktime", "工作年限必须在1-100之间");
// 简介不能为空
if (user.getIntro() == null || user.getIntro().equals(""))
this.addFieldError("intro", "简介不能为空");
}
}
Struts.xml中增加了验证出错时跳转到的页面<result name=”input”></result>。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"/dtds/struts-2.0.dtd">
<struts>
<!-- 请求参数的中文处理 -->
<constant name="struts.i18n.encoding" value="GBK"/>
<!-- 修改后的xml自动加载 -->
<constant name="struts.configuration.xml.reload" value="true"/> <package name="actions" extends="struts-default">
<action name="user" class="erAction">
<result>/UserList.jsp</result>
<result name="addupdate">/AddUpdate.jsp</result>
<result name="input">/AddUpdate.jsp</result>
</action>
</package>
</struts>
3.validate框架(xml)验证
为了使用Struts2的框架验证文件进行输入验证,需要建立一个特定的验证规则文件,该文件是一个XML格式配置文件,文件命名规则为<Action类名-validation.xml>,保存在Action 实现类相同的目录下,如果是多方法Action,需要使用Action的别名配置(每个方法映射为不同的Action别名,可以使用通配符),每个方法的验证文件名为<Action类名-别名-validation.xml>。

这个例子中的验证文件的名字为:StuAction-validation.xml。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"/xwork/xwork-validator-1.0.2.dtd">
<!-- 验证规则定义根元素 -->
<validators>
<!-- 第一个验证字段:姓名name -->
<field name="name">
<!-- 验证规则:非空(系统预先定义好的规则) -->
<field-validator type="requiredstring">
<!-- 错误提示 -->
<message>姓名不能为空</message>
</field-validator>
<!-- 验证规则:长度在5-10之间(系统预先定义好的规则) -->。

相关文档
最新文档