Struts2校验框架应用总结
2010-01-02 01:27
603 查看
在编写Action这一章节中,我们通过几行java代码来验证username和password。当然,在大型的应用程序中,这将是个很耗时的工作,即使这几行java代码也可能变成维护的重大负担。
令人高兴的是,本框架提供了一个验证框架,这个验证框架能够对输入数据进行后台验证。
一.代码准备
验证能够通过XML文档来描述,或者使用注解(annotations)。XML文档的名称以Action的名字为开头,以“-validation”作为文件名后缀。当我们想要验证OrderAction的时候,我们文件名可以
命名为OrderAction-validation.xml。OrderAction-validation.xml的代码如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "xwork-validator-1.0.2.dtd"> <validators> <field name="order.orderid"> <field-validator type="required"> <message key="order.orderid">uuuuu</message> </field-validator> <field-validator type="int"> <param name="min">1</param> <param name="max">100</param> <message key="order.orderid">8888</message> </field-validator> </field> <field name="order.totalnum"> <field-validator type="required"> <message key="order.totalnum">9999</message> </field-validator> <field-validator type="int"> <param name="min">1</param> <param name="max">100</param> <message key="order.totalnum">9999</message> </field-validator> </field> <field name="order.orderdate"> <field-validator type="required"> <message key="order.orderdate">your join is required</message> </field-validator> <field-validator type="date"> <param name="min">2000-10-10</param> <param name="max">2008-01-07</param> <message key="order.orderdate">9999</message> </field-validator> </field> </validators>
其中message中的key的值使用的消息资源的键,消息资源文件为package.properties
order.orderid=your orderid is not null order.ordermc=your ordermc is not null order.totalnum=your totalnum is not null order.totalprice=your totalprice is not null order.email=your email is not null order.phone=your phone is not null order.orderdate=youre orderdateis not null
创建一个Order.java(Action),代码如下:
package org.itfuture.www.actions; import org.itfuture.www.model.Order; import com.opensymphony.xwork2.ActionSupport; public class OrderAction extends ActionSupport { private Order order; public OrderAction() { } public String add(){ return "success"; } public String update(){ return "success"; } //重写了一下 @Override public String input() { return this.INPUT; } public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } }
其中Order为数据对象,Order.java的代码为:
package org.itfuture.www.model; import java.io.Serializable; import java.util.Date; public class Order implements Serializable { private Integer orderid; private String ordermc; private Integer totalnum; private Double totalprice; private Date orderdate; private String email; private String phone; public Order() { } public Integer getOrderid() { return orderid; } public void setOrderid(Integer orderid) { this.orderid = orderid; } public String getOrdermc() { return ordermc; } public void setOrdermc(String ordermc) { this.ordermc = ordermc; } public Integer getTotalnum() { return totalnum; } public void setTotalnum(Integer totalnum) { this.totalnum = totalnum; } public Double getTotalprice() { return totalprice; } public void setTotalprice(Double totalprice) { this.totalprice = totalprice; } public Date getOrderdate() { return orderdate; } public void setOrderdate(Date orderdate) { this.orderdate = orderdate; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
在创建OrderAction.java(Action)之后我们创建一个OrderAction-validation.xml文件。并将上述粘贴到该文件中。
接着创建一个定单的新增页面ordernew.jsp,代码如下
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <html> <head> <title>西安未来蓝图软件教育itfuture java培训中心</title> <s:head/> </head> <body> <s:form action="add" namespace="/validate" method="post" validate="true"> <s:textfield name="order.orderid" label="定单编号"></s:textfield> <s:textfield name="order.ordermc" label="定单名称"></s:textfield> <s:textfield name="order.orderdate" label="定单日期"></s:textfield> <s:textfield name="order.totalnum" label="定单总数量"></s:textfield> <s:textfield name="order.totalprice" label="定单总价格"></s:textfield> <s:textfield name="order.phone" label="定单电话"></s:textfield> <s:textfield name="order.email" label="定单Email"></s:textfield> <s:submit></s:submit> </s:form> </body> </html> 在创建一个新增成功之后的展现页面order.jsp,代码如下: <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <html> <head> <title>西安未来蓝图软件教育itfuture java培训中心</title> <s:head/> </head> <body> 新增成功!~ </body> </html>
页面第一次显示的时候,我们不想引发验证。我们需要在输入不正确被提示之前有机会输入数据(否则刚一打开页面就提示输入框为空的提示)。不使用验证的一种方式是找到一个ActionSupport基类提
供的特定的“input”方法。为了这样做,我们需要编辑ordernew.jsp页面和Order的映射。
index.jsp的主要代码如下:
<li><a href="./validate/ordernew.jsp">定单新增(一)</li> <li><a href="<s:url action="ordernew" namespace="/validate"/>">定单新增(二)</li> <li><a href="<s:url action="order_input" namespace="/validate"/>">定单新增(三)</li>
struts.xml的修改代码如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="validate" namespace="/validate" extends="struts-default"> <action name="add" method="add" class="org.itfuture.www.actions.OrderAction" > <result name="input">/validate/ordernew.jsp</result> <result name="success">/validate/order.jsp</result> </action> <!--调用execute转到新增页面--> <action name="ordernew" class="org.itfuture.www.actions.OrderAction" > <result name="success">/validate/ordernew.jsp</result> </action> <!--调用传递的input方法转到新增页面--> <action name="order_*" method="{1}" class="org.itfuture.www.actions.OrderAction" > <result name="input">/validate/ordernew.jsp</result> </action> </package> </struts>
二.校验框架代码是运行步骤和说明
为了打开order新增表单,index页面使用了三种方式其中第三个超连接涉及了order_input,当点击此超连接时。
1. 框架将这个和配置文件中的Logon_*映射相匹配起来;
2. method="{1}" 属性被method="input"替换;
3. 框架调用了OrderAction类的input方法;
4. 因为“input”在一个特殊的方法的列表中,所以验证框架将不会调用;
5. 默认的input方法返回一个“input”作为返回结果(input方法是从ActionSupport父类中的方法,本例重写了该input方法);
6. 框架展现“ordernew.jsp”来作为回应结果,没有带有任何的验证信息。
为了提交order新增表单,ordernew.jsp页面调用了OrderAction(OrderAction中的add业务)。
1. Struts2框架为目标OrderAction提供验证;
2. 找到OrderAction-validation.xml文件,框架为该类创建了一个验证对象,这个验证对象基于XML文件;
3. 验证器对输入的数据产生作用;
4. 如果验证失败,错误信息被添加到内部序列中;
5. 当所有的验证器都已经执行后,如果框架发现有错误信息产生,它寻找“input”结果对应的页面,而不调用OrderAction对象的业务方法add;
6. 如果通过验证,调用OrderAction对象的add方法,返回“success”对应的结果。
三.校验框架代码其它分析说明
1、如果点击index.jsp中的第二个超连接,那么会调用execute()方法,验证框架将会被调用,对展现的ordernew.jsp中表单输入框数据进行校验,这就会出现新增页面出现了,但验证失败的错误信
息也在页面出现了(在新增页面形成的过程中,没来得及在新增页面的表单中输入数据就校验了),这不符合常理.
2、如果点击index.jsp中的第一个超连接,直接调用ordernew.jsp,就会在该页面报错,错误信息如下:
FreeMarker template error!
Method public java.lang.String com.opensymphony.xwork2.validator.validators.ValidatorSupport.getMessage(java.lang.Object) threw an exception when invoked on
com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator@121e761
The problematic instruction:
----------
==> ${validator.getMessage(action)?js_string} [on line 50, column 26 in template/xhtml/form-close-validate.ftl]
in include "/${parameters.templateDir}/xhtml/form-close-validate.ftl" [on line 25, column 1 in template/xhtml/form-close.ftl]
----------
Java backtrace for programmers:
.......
原因是在校验配置文件OrderAction-validation.xml中我们使用了package.properties中消息键,该消息资源中的消息在不调用Action是不能使用的,只有调用Action,该页面对应的校验配置文件
OrderAction-validation.xml才能使用了package.properties中消息键。所以直接调用ordernew.jsp是不行的
四.分析说明
框架提供了一个验证框架。一个输入域可以绑定一个验证器集合。如果验证失败,框架将会返回输入信息页,并显示错误信息。为了不使用验证而到直接展现新增页面,一个特殊的“input”方法
将被调用,来代替默认的“execute”方法。
五、检验框架针对的业务方法
以上例子中的校验配置文件OrderAction-validation.xml,可以对提交给OrderAction中的所有业务方法提供校验;如果想针对Action中每个不同的业务进行数据验证,关于验证xml的文件可以这样命
名,该类名-别名(定义的action名)-validation.xml这样的话,可以针对每个不同的业务进行数据验证。
五、服务器和客户端校验
所谓的服务器校验即,提交到服务器端校验,如果在服务器端检验失败,那么把错误信息从服务器端发送到客户端。所谓的客户端检验,即在<s:form >添加 validate="true",那么会在页面根据
校验配置文件生成相应的校验js,当提交数据时,会调用页面的js在客户端校验.
google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);
相关文章推荐
- struts2 校验框架总结
- struts2 校验框架总结
- struts2 校验框架总结
- 关于Java日志框架应用总结
- Struts2中的校验框架
- Struts2输入校验总结
- 投票系统开发总结struts2,jfreechart,cookie应用,以及前端技术
- 使用Struts2验证框架实现输入校验
- Atitit. 解释器模式框架选型 and应用场景attilax总结 oao
- struts2校验框架
- struts2校验框架,内置参数信息查看
- Struts2输入校验总结
- Struts2校验框架,有效的xml(字段优先)
- Struts2输入校验总结
- Struts2内建校验器(基于校验框架的文件校验)
- struts2中validation校验框架的原理和使用
- Struts2_校验总结
- struts2的XML校验框架小体会
- Struts2输入校验总结
- Android QQ空间(Apad)项目总结(三)---应用UI框架的搭建!!!