- 浏览: 109068 次
- 性别:
- 来自: 广州
最新评论
-
lang8888511:
package com.utilimport org.xvol ...
利用JNative实现Java调用动态库 -
yanzhoupuzhang:
要是那个发送指令的部分能详细点就好了啊!!!!
使用JNative对条码打印机进行打印(转别人) -
wukele:
中文编码一下
条形码barcode4j的使用 -
dopic:
受不了你
java 文件操作 -
hyint:
刚刚的帖子回复到文件操作的地方了,但是问题还是存在的,继续你的 ...
利用JNative实现Java调用动态库
5.2 DispatchAction类
通常在一个Action类中只完成一个业务操作,如果在一个Action类中完成一组紧密相关的业务操作,可以使用org.apache.struts.actions.DispatchAction类。例如与一件商品相关的基本操作有增加商品、删除商品、修改商品和查看商品。可以为这些操作分别定义一个Action,这样会使得整个应用的Action变得非常多,并且这些Action在执行具体业务操作之前,都要执行一些类似的功能,这会造成大量重复代码。
通过将增加商品、删除商品、修改商品和查看商品这些业务相关的操作合并到一个Action中,将减少重复编码,使应用更加便于维护。DispatchAction类就是为执行一些聚合操作而设计的Action类,可以通过创建一个DispatchAction类的子类,来执行一组业务相关的操作。
不同于一般的Action类,创建一个扩展DispatchAction类的子类,不必覆盖execute()方法,而是创建一些实现具体业务操作的方法,这些方法与execute()方法有相同的参数和返回值,以及声明可能抛出同样的异常。以下代码为一个扩展DispatchAction类的代码示例,该段代码实现了对用户的添加(add)、编辑(edit)和删除(delete)。
org.apache.struts.actions.DispatchAction;
public final class UserAction extends Dispatch[color=darkred][/color]Action{
public ActionForward add(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception {
.…..
return mapping.findForward("add");
}
public ActionForward delete(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception {
……
return mapping.findForward("delete");
}
public ActionForward edit(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception {
……
return mapping.findForward("edit");
}
}
在配置DispatchAction类时,需要指定parameter属性为method。如下面为配置UserAction的代码。
<action path="" type="" name="" scope="request"
input="" parameter="method" validate="true">
<forward name="" path="" redirect="false"/>
</action>
当UserAction的execute()方法被执行时,实际是执行基类DispatchAction的execute()方法。DispatchAction根据参数method的值确定调用用户自定义的DispatchAction中的哪个方法。因此,在编写触发DispatchAction的代码时,不仅指明映射路径,还需要附加一个名为method的参数,指明要调用的方法路径。如下面的代码为调用UserAction的add方法。
http://localhost:8080/login/users?method=add
路径名/users将动作映射到UserAction,method参数指明调用的方法为add。
5.3 动态ActionForm
使用ActionForm可以给开发者在处理HTML表单上带来极大的帮助。它简化了代码编写,并提供了自动的数据验证。但是,ActionForm也存在几个非常明显的缺点。
首先,如果ActionForm对应的HTML表单添加或删除属性,ActionForm类就可能需要修改并重新编译;其次,如果HTML表单是动态的,那么ActionForm更是无能为力了;另外,ActionForm增加了一个项目中类的绝对数量。
从Struts1.1开始对这些不足进行了改进,引入了动态ActionForm(DynaActionForm)的概念。动态ActionForm允许用户无须为应用程序的每一个HTML表单创建具体的ActionForm类。Struts框架包中的DynaActionForm类及其子类实现了动态ActionForm。DynaActionForm类扩展了ActionForm类。用户可以直接使用DynaActionForm类,或者扩展该类以覆盖其validate()和reset()方法。
5.3.1 配置动态ActionForm
动态ActionForm支持在Struts配置文件struts-config.xml中完成ActionForm的全部配置,无须编写任何额外的Java代码。对DynaActionForm来说,在Struts配置文件struts-config.xml中,<form-bean>元素的type属性设置为DynaActionForm或其子类,并在<form-bean>中包含一系列<form-property>子元素来标记动态表单的属性。例程5-5是一个在struts-config.xml中配置DynaActionForm的实例。
例程5-5 在struts-config.xml中配置DynaActionForm的实例
<form-bean
name="loginActionForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
在例程5-6中,<form-bean>元素的type属性指定使用Struts框架包中的DynaActionForm类,用户也可以扩展这个类,实现自定义的动态ActionForm。
<form-property>元素的name属性指定了ActionForm中的属性名,type属性指定了属性类型。其中属性类型必须是标准的Java类,即当属性类型是int、long、float、double、boolean等这些基本数据类型时,要使用它们的包装类,即要使用Integer、Long、Float、Double和Boolean类。
使用动态ActionForm,当需要添加新的属性时,只需要修改配置文件,无须更改源代码,这样便提供了巨大的功能和灵活性。<form-property>元素允许用户为每一个属性指定初始值。Struts框架在应用程序启动时将这些属性设置为这些值。
在默认情况下,DynaActionForm类的reset()方法调用基类ActionForm的reset()方法。如果想要在每次调用reset()方法时,将所有属性设置到初始状态,就需要定义一个扩展DynaActionForm类的子类,覆盖其reset()方法,在reset()方法中将所有属性复位到初始状态。但是,用户不必在子类的reset()方法中编写冗长的属性复位代码,DynaActionForm类的initialize()方法已经为用户做了这些工作,用户要做的只是在reset()方法中调用initialize()方法。Initialize()方法把表单的所有属性恢复为默认值。表单属性的默认值由<form-bean>元素的<form-property>子元素的initial属性指定。如果没有为<form-property>指定initial属性,则属性的默认值应由相应的Java类型自动决定。例如整型将复位为0,布尔型复位到false,字符串等对象复位到null。
5.3.2 在Action中访问动态ActionForm
同普通ActionForm一样,Action类和JSP都可访问动态ActionForm,而访问方法也基本一致。访问动态ActionForm与访问普通ActionForm的最大区别在于对属性的访问方式不同。在标准ActionForm中,针对每个属性都提供了getter和setter方法,来读取和设置属性。而DynaActionForm把所有的属性保存在一个Map对象中,因此访问DynaActionForm中的属性与访问Map对象中的方法类似:
public Object get(String name)
public void set(String name, Object value)
例如,在前面的登录系统的loginAction中访问一个名为loginActionForm的动态ActionForm的方法为:
//从Form Bean中取出表单数据
DynaActionForm loginActionForm = (DynaActionForm)form;
String username = (String)loginActionForm.get("username");
String password = (String)loginActionForm.get("password");
5.3.3 动态ActionForm的表单验证
DynaActionForm类的validate()方法没有提供任何默认的验证行为。可以通过定义扩展DynaActionForm类的子类,然后覆盖validate()方法,但是以编程的方式来验证动态ActionForm并不是一个理想的策略。动态ActionForm的验证应该使用Struts的Validator验证插件。Validator插件允许采用特定的配置文件为动态ActionForm配置验证规则,如检查必需的输入域、日期和时间等。关于Validator的使用方法可参考本讲5.4节。
5.3.4 动态ActionForm应用实例
例如在第3讲的登录系统中,我们用动态ActionForm取代原来的普通ActionForm,具体修改步骤如下。
(1)删除LoginActionForm类。
把原系统中的LoginActionForm删除,因为使用动态ActionForm后,不需要它了。
(2)修改struts-config.xml。
具体修改的地方如下:
<form-beans>
<form-bean name="loginActionForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
</form-beans>
(3)修改LoginAction类。
修改后的LoginAction类如例程5-6所示。
例程5-6 LoginAction类
package login;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import java.util.*;
public class LoginAction extends Action {
public ActionForward execute(ActionMapping actionMapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
//从Form Bean中取出表单数据
DynaActionForm loginActionForm = (DynaActionForm)form;
String username = (String)loginActionForm.get("username");
String password = (String)loginActionForm.get("password");
//生成一个Session 对象
HttpSession session = request.getSession(true);
session.removeAttribute("username");
session.setAttribute("username",username);
//生成一个ArrayList对象,并把用户名和密码的值存入该对象中
ArrayList arr = new ArrayList();
arr.add(username); arr.add(password);
String prompt;
//调用模型组件loginHandler,检查该用户是否已注册
LoginHandler login = new LoginHandler();
akarta mark = login.checkLogin(arr);
if(mark) prompt = "Success";
else prompt = "Fail";
return actionMapping.findForward(prompt);
}
}
(4)编译、打包、运行。
把修改后的程序编译、打包后,运行效果与原来的系统一样。
5.4 Validator验证框架
Struts1.1及以上版本,在提供了动态ActionForm的同时,配合数据验证的需要,还提供了表单输入自动验证的功能,即使用Validator验证框架。
Validator验证框架是通过配置验证规则实现验证功能的,开发人员不需要编写代码,同时也能够最大限度重用同一个验证规则。因此,这种验证方式在目前的Struts应用中得到了广泛的应用。
在使用Validator验证框架时,需要用到两个基于XML的配置文件进行验证规则的配置,一个是validator-rules.xml,另一个是validation.xml。这两个文件应该部署在相应的Web应用中的WEB-INF文件夹下。此外,Validator还应在struts-config.xml中进行配置。
其中,validator-rules.xml文件包含了一组通用的验证规则,对所有Struts应用都可以使用,Struts软件包中本身提供了这个文件。一般不需要开发人员进行修改,直接将其部署在相应的WEB-INF文件夹中即可。
5.4.1 Validator的安装
Struts1.2发布版中包含了Validator框架用到的所有文件和包。Validator作为Jakarta的commons工程的一部分,可以从地址http://jakarta.apache.org/commons/下载其最新版本。
Validator框架依赖的两个最重要的包即jakarta-oro.jar和commons-validator.jar。
l akarta-oro.jar:提供了一组处理正则表达式、文本的替换、过滤和分割等功能。
l commons-validator.jar:提供了一个简单的、可扩展的验证框架,包含了一些通用的标准验证规则和验证方法。
使用Validator验证框架时,需要在配置文件validator-rules.xml和validation.xml中配置验证规则。这两个文件应该部署在相应的Web应用中的WEB-INF文件夹下。此外,Validator还应在struts-config.xml中进行配置。
5.4.2 在struts-config.xml中配置Validator
Validator框架是作为一个Struts插件配置到Struts应用程序中的,即Struts扩展中的PlugIn机制。通过在Struts配置文件struts-config.xml中配置Validator插件,Struts应用在启动时就能够知道Validator框架正在被使用,加载并初始化Validator框架。以下代码是一个典型的在struts-config.xml中配置Validator的方式:
<plug-in className="org.apache.struts.validator.ValidatorPlugin">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
应用程序启动时,Struts框架将调用validatorPlugIn类的init()方法初始化Validator框架。Init()方法根据pathnames属性,加载相应的validator-rules.xml文件和validation.xml文件,把验证信息读入到内存中。
StopOnFirstError属性的作用是指定客户端JavaScript验证的执行方式。当该值为false时,JavaScript会在验证全部需要验证的表单字段后发出错误警告信息;否则在发现第一个验证错误时就返回。
5.4.3 validator-rules.xml的配置
validator-rules.xml配置文件包含了一组通用的有效性规则,这些通用性的验证规则可以满足大部分验证需求,而且该文件也是独立于应用程序的,可以被任何Struts应用程序使用。该文件内含于Struts的发行包中,在一般情况下,无须对该文件做任何改动。只有当打算扩展或修改默认的验证规则时才需修改这个文件。
Validator-rules.xml文件的根元素是<form-validation>,该元素包含零个或多个global元素。Global元素包含零个或多个validator元素。这些元素在dtd文件中的定义如下:
<!ELEMENT form-validation (global*, formset*)>
<!ELEMENT global (validator*, constant*)>
每个validator元素定义了一个唯一的有效性验证规则。以下代码是validator-rules.xml文件中一个名为integer的有效性验证规则。
<validator name="integer"
classname="org.apache.struts.validator.FieldChecks"
method="validateInteger"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.integer"
jsFunctionName="IntegerValidations"/>
validator元素有8个属性,它们的含义列于表5-2中。
表5-2 validator元素的属性
属 性
描 述
name
指定验证规则的逻辑名称,该名称在validator-rules.xml文件中必须是唯一的
classname
指定实现验证规则的逻辑的类
method
指定实现验证规则的逻辑的方法
methodParams
在method属性中指定的方法的参数列表
msg
指定资源包中的一个消息key。当出现一个有效性验证错误时,Validator框架将使用这个key到资源包中查找匹配的消息文本
depends
指定在调用当前验证规则执行当前验证逻辑之前,应该先调用的其他验证规则
jsFunctionName
指定生成JavaScript函数的名称,如果没有指定该属性,则JavaScript函数名称使用validator的名称
jsFunction
指定一些传递到页面中的JavaScript用于执行表单验证
在默认情况下,Validator框架使用以下消息文本:
# Struts Validator Error Messages
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.
应该把以上的内容添加到Struts资源文件中。如果打算使用自定义的消息文本替换这些默认的消息文本,可以修改validator-rules.xml文件中validator元素的msg属性,也可以直接修改以上的消息文本。
5.4.4 validation.xml的配置
validation.xml文件是Validator框架需要的另一个配置文件。该文件是特定于应用程序的,由开发人员自己来创建。它描述了那些具体应用中的ActionForm所使用的validator-rules.xml文件中的有效性验证规则。通过ActionForm在validation.xml文件中配置所需要的验证规则,开发人员就不必将验证逻辑硬编码放在ActionForm的内部。一个简单的validation.xml文件如例程5-7所示。
例程5-7 validation.xml实例
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//
EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<formset>
<form name="loginActionForm">
<field property="username"
depends="required">
<arg0 key="prompt.username"/>
</field>
<field property="password"
depends="required, minlength,maxlength">
<arg0 key="prompt.password"/>
<arg1 key="${var:minlength}" name="minlength"
resource="false"/>
<arg2 key="${var:maxlength}" name="maxlength"
resource="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>16</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
validation.xml文件中包含form-validation、global、formset、form、field、msg、arg、var等元素。下面对它们一一进行介绍。
1.form-validation元素
<form-validation>元素是validation.xml文件的根元素。它包含2个子元素,即<global>元素和<formset>元素,其在dtd中的定义如下:
<!ELEMENT form-validation (global*, formset*)>
2.global元素
global元素允许开发人员配置可以用在文件其他部分中的constant元素,也就是全局常量。这与在Java文件中定义一个常量,然后在类中使用该常量的方式相似。constant元素以名字和值的方式出现。例如:
<form-validation>
<global>
<constant>
<constant-name>zip</constant-name>
<constant-value>^\d{5}\d*$</constant-value> <!--常量值,这里是一个正则表达式-->
</constant>
<global>
<formset>
<form name="registerForm">
<field property ="zipPostal" depends="required, mask">
<arg0 key="registerForm.zippostal.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>${zip}</var-value>
</var>
</field>
</form>
</formset>
<form-validation>
在以上代码中,在<global>元素中定义了一个常量zip,在<formset>元素中可以通过${constant-name}的形式,如${zip},来引用这个常量。
3.formset元素
<formset>元素包含两个子元素,即<constant>元素和<form>元素。<constant>元素可以出现零次或多次,<form>元素至少出现一次。这里的<constant>元素中定义的constant常量是局部常量,只能在当前<formset>元素内引用。
<formset>元素有2个属性,即language和country,它们用于国际化。
4.form元素
form元素定义了一套将要进行有效性验证的域(field),其name属性指定对应表单的名字,并且name属性与Struts配置文件中的form-bean元素的name属性一致。
form元素可以包含多个field元素。
5.field元素
一个field元素对应于一个表单中需要验证的字段。它的属性如表5-3所示。
表5-3 field元素的属性
属 性
描 述
property
将要进行有效性验证的ActionForm的属性名
depends
指定字段的验证规则,多个规则之间以逗号分开
page
如果对应的ActionForm是一个跨页表单,可能包括一个page属性与表单中的page属性相对应,用户指定该字段应该在哪一页被处理
indexedListProperty
后循环列表,执行该域的有效性验证
field元素可以包含几个子元素:msg元素、arg元素及var元素。
6.msg元素
field元素的msg子元素指定验证规则对应的消息文本。该消息文本将替代默认的消息文本,即validator-rules.xml中定义的消息文本。msg元素的值必须是应用程序消息资源包中的某个消息资源的关键字。例如:
<field property="lastName" depends="required, mask" page="1">
<msg name="mask" key="registerForm.lastname.maskmsg"/>
<arg0 key="registerForm.lastname.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]*$</var-value>
</var>
</field>
当lastName字段有效性验证失败时,显示的错误消息是消息资源中registerForm. lastname.masking键所指的消息文本。
msg元素的属性如表5-4所示。
表5-4 msg元素的属性
属 性
描 述
key
指定绑定的消息资源中的消息文本或直接指定消息文本
name
指定验证规则的名字
bundle
指定绑定的消息资源的名称
resource
当该属性值为true时,表示使用来自消息资源的消息文本;当该属性值为false时,表示直接在key属性中设置消息文本。默认值为true。
7.arg元素
arg元素可以用来向消息文本中传递参数。它有name、key、resource和position等几个属性,name、key、resource属性的含义与msg元素的属性相当。position属性用来指定消息文本中的替换位置。
例如,例程5-8是关于minlength验证规则的配置文件。
例程5-8 minlength验证规则的配置文件
<field property="password"
depends="required, minlength">
<arg0 key="prompt.password" />
<arg1 key="${var:minlength}" name="minlength"
resource="false" position="1"/>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
在validator-rules.xml文件中,minlength验证规则的默认消息文本是:
{0} can not be less than {1} characters.
在例程5-8中,position属性的值为1的arg元素定义中,name属性的值为minlength,表示仅适用于minlength验证规则,resource属性的值为false,表示可直接在key属性中设定消息文本,即key属性的值为${var:minlength},在这里是3。把以上代码中两个arg的key值分别放入minlength验证规则的默认消息文本中的相应位置,最后返回的消息文本应该是:
password can not be less than 3 characters.
8.var元素
var元素用来向验证规则传递参数。例如在例程5-7中,定义了maxlength和minlength两个参数,分别传递给maxlength和minlength验证规则。
arg元素也可以访问var元素,语法形式是${var:var-name}。例如,在例程5-7中的${var:maxlength}和${var:minlength}的使用。
5.4.5 DynaValidatorForm类及其子类
Validator框架不能用于验证标准的ActionForm类,使用Validator时应该使用与之匹配的ActionForm类:ValidatorForm类或DynaValidatorForm类,以及其子类ValidatorActionForm和DynaValidatorActionForm。它们都是ActionForm类的子类。它们之间的关系如图5-3所示。
图5-3 DynaValidatorForm类的类关系图
5.4.6 Validator的应用示例
以登录系统为例来示例如何应用Validator来实现自动表单输入验证功能。本节的示例程序是在第3讲的登录系统的程序基础上进行修改所得。本实例的代码在本书附带的光盘的code/ch5/validator目录中。
(1)修改登录页面login.jsp,如例程5-9所示。
例程5-9 修改后的登录页面login.jsp
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@page contentType="text/html; charset=gb2312" %>
<html:html>
<head><title>登录页面</title></head>
<body>
<font color="red"><html:errors/></font>
<html:form action="loginAction" method="post">
用户名: <html:text property="username" size="15"/><br><br>
密  码: <html:password property="password" size="15"/><br><br>
<html:submit value="登录" property="submit"/><br>
</html:form>
</body>
</html:html>
(2)修改struts-config.xml文件,如例程5-10所示。
例程5-10 修改后的struts-config.xml文件
?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1
//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="loginActionForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
</form-beans>
<action-mappings>
<action input="/login.jsp" name="loginActionForm"
path="/loginAction" scope="request"
type="login.LoginAction" validate="true" >
<forward name="Success" path="/main.jsp"/>
<forward name="Fail" path="/register.jsp"/>
</action>
</action-mappings>
<message-resources parameter="ApplicationResources"/>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
</struts-config>
(3)创建和部署验证规则及验证内容文件。
通常可以使用Struts原有的验证规则文件validator-rules.xml,将Struts二进制发布包的lib/目录下的该文件复制到当前应用程序的WEB-INF/目录下即可。具体要验证的表单数据内容和采用何种规则进行验证只能由开发者自己规定,具体做法是在应用程序的WEB-INF/目录下创建XML文件validation.xml。本项目的validation.xml如例程5-11所示。
例程5-11 validation.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<formset>
<form name="loginActionForm">
<field
property="username"
depends="required,minlength">
<arg0 key="label.username"/>
<arg1 name="minlength" key="${var:minlength}" resource="false" position="1"/>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
<field
property="password"
depends="required,minlength">
<arg0 key="label.password"/>
<arg1 name="minlength" key="${var:minlength}"
resource="false" position="1"/>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
(4)创建资源包属性文件ApplicationResources.properties,如例程5-12所示。
例程5-12 ApplicationResources.properties
# Simple properties file for test.
title.login = Login Page
item.submit = Submit
error.name.required=A UserName is Required
error.psw.required=A Password is Required
label.username=Username
label.password=Password
errors.required={0} can not be null
errors.minlength={0} can not less than {1} char.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
(5)修改Action类——LoginAction.java,如例程5-13所示。
例程5-13 LoginAction.java
package login;
import org.apache.struts.action.*;
import org.apache.struts.validator.DynaValidatorForm;
import javax.servlet.http.*; java.util.*;
public class LoginAction extends Action {
public ActionForward execute(ActionMapping actionMapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//从Form Bean中取出表单数据
DynaValidatorForm loginActionForm = (DynaValidatorForm)form;
String username = (String)loginActionForm.get("username");
String password = (String)loginActionForm.get("password");
//生成一个Session 对象
HttpSession session = request.getSession(true);
session.removeAttribute("username");
session.setAttribute("username",username);
//生成一个ArrayList对象,并把用户名和密码的值存入该对象中
ArrayList arr = new ArrayList();
arr.add(username);
arr.add(password);
String prompt;
//调用模型组件loginHandler,检查该用户是否已注册
LoginHandler login = new LoginHandler();
boolean mark = login.checkLogin(arr);
if(mark) prompt = "Success";
else prompt = "Fail";
return actionMapping.findForward(prompt);
}
}
通常在一个Action类中只完成一个业务操作,如果在一个Action类中完成一组紧密相关的业务操作,可以使用org.apache.struts.actions.DispatchAction类。例如与一件商品相关的基本操作有增加商品、删除商品、修改商品和查看商品。可以为这些操作分别定义一个Action,这样会使得整个应用的Action变得非常多,并且这些Action在执行具体业务操作之前,都要执行一些类似的功能,这会造成大量重复代码。
通过将增加商品、删除商品、修改商品和查看商品这些业务相关的操作合并到一个Action中,将减少重复编码,使应用更加便于维护。DispatchAction类就是为执行一些聚合操作而设计的Action类,可以通过创建一个DispatchAction类的子类,来执行一组业务相关的操作。
不同于一般的Action类,创建一个扩展DispatchAction类的子类,不必覆盖execute()方法,而是创建一些实现具体业务操作的方法,这些方法与execute()方法有相同的参数和返回值,以及声明可能抛出同样的异常。以下代码为一个扩展DispatchAction类的代码示例,该段代码实现了对用户的添加(add)、编辑(edit)和删除(delete)。
org.apache.struts.actions.DispatchAction;
public final class UserAction extends Dispatch[color=darkred][/color]Action{
public ActionForward add(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception {
.…..
return mapping.findForward("add");
}
public ActionForward delete(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception {
……
return mapping.findForward("delete");
}
public ActionForward edit(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response) throws Exception {
……
return mapping.findForward("edit");
}
}
在配置DispatchAction类时,需要指定parameter属性为method。如下面为配置UserAction的代码。
<action path="" type="" name="" scope="request"
input="" parameter="method" validate="true">
<forward name="" path="" redirect="false"/>
</action>
当UserAction的execute()方法被执行时,实际是执行基类DispatchAction的execute()方法。DispatchAction根据参数method的值确定调用用户自定义的DispatchAction中的哪个方法。因此,在编写触发DispatchAction的代码时,不仅指明映射路径,还需要附加一个名为method的参数,指明要调用的方法路径。如下面的代码为调用UserAction的add方法。
http://localhost:8080/login/users?method=add
路径名/users将动作映射到UserAction,method参数指明调用的方法为add。
5.3 动态ActionForm
使用ActionForm可以给开发者在处理HTML表单上带来极大的帮助。它简化了代码编写,并提供了自动的数据验证。但是,ActionForm也存在几个非常明显的缺点。
首先,如果ActionForm对应的HTML表单添加或删除属性,ActionForm类就可能需要修改并重新编译;其次,如果HTML表单是动态的,那么ActionForm更是无能为力了;另外,ActionForm增加了一个项目中类的绝对数量。
从Struts1.1开始对这些不足进行了改进,引入了动态ActionForm(DynaActionForm)的概念。动态ActionForm允许用户无须为应用程序的每一个HTML表单创建具体的ActionForm类。Struts框架包中的DynaActionForm类及其子类实现了动态ActionForm。DynaActionForm类扩展了ActionForm类。用户可以直接使用DynaActionForm类,或者扩展该类以覆盖其validate()和reset()方法。
5.3.1 配置动态ActionForm
动态ActionForm支持在Struts配置文件struts-config.xml中完成ActionForm的全部配置,无须编写任何额外的Java代码。对DynaActionForm来说,在Struts配置文件struts-config.xml中,<form-bean>元素的type属性设置为DynaActionForm或其子类,并在<form-bean>中包含一系列<form-property>子元素来标记动态表单的属性。例程5-5是一个在struts-config.xml中配置DynaActionForm的实例。
例程5-5 在struts-config.xml中配置DynaActionForm的实例
<form-bean
name="loginActionForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
在例程5-6中,<form-bean>元素的type属性指定使用Struts框架包中的DynaActionForm类,用户也可以扩展这个类,实现自定义的动态ActionForm。
<form-property>元素的name属性指定了ActionForm中的属性名,type属性指定了属性类型。其中属性类型必须是标准的Java类,即当属性类型是int、long、float、double、boolean等这些基本数据类型时,要使用它们的包装类,即要使用Integer、Long、Float、Double和Boolean类。
使用动态ActionForm,当需要添加新的属性时,只需要修改配置文件,无须更改源代码,这样便提供了巨大的功能和灵活性。<form-property>元素允许用户为每一个属性指定初始值。Struts框架在应用程序启动时将这些属性设置为这些值。
在默认情况下,DynaActionForm类的reset()方法调用基类ActionForm的reset()方法。如果想要在每次调用reset()方法时,将所有属性设置到初始状态,就需要定义一个扩展DynaActionForm类的子类,覆盖其reset()方法,在reset()方法中将所有属性复位到初始状态。但是,用户不必在子类的reset()方法中编写冗长的属性复位代码,DynaActionForm类的initialize()方法已经为用户做了这些工作,用户要做的只是在reset()方法中调用initialize()方法。Initialize()方法把表单的所有属性恢复为默认值。表单属性的默认值由<form-bean>元素的<form-property>子元素的initial属性指定。如果没有为<form-property>指定initial属性,则属性的默认值应由相应的Java类型自动决定。例如整型将复位为0,布尔型复位到false,字符串等对象复位到null。
5.3.2 在Action中访问动态ActionForm
同普通ActionForm一样,Action类和JSP都可访问动态ActionForm,而访问方法也基本一致。访问动态ActionForm与访问普通ActionForm的最大区别在于对属性的访问方式不同。在标准ActionForm中,针对每个属性都提供了getter和setter方法,来读取和设置属性。而DynaActionForm把所有的属性保存在一个Map对象中,因此访问DynaActionForm中的属性与访问Map对象中的方法类似:
public Object get(String name)
public void set(String name, Object value)
例如,在前面的登录系统的loginAction中访问一个名为loginActionForm的动态ActionForm的方法为:
//从Form Bean中取出表单数据
DynaActionForm loginActionForm = (DynaActionForm)form;
String username = (String)loginActionForm.get("username");
String password = (String)loginActionForm.get("password");
5.3.3 动态ActionForm的表单验证
DynaActionForm类的validate()方法没有提供任何默认的验证行为。可以通过定义扩展DynaActionForm类的子类,然后覆盖validate()方法,但是以编程的方式来验证动态ActionForm并不是一个理想的策略。动态ActionForm的验证应该使用Struts的Validator验证插件。Validator插件允许采用特定的配置文件为动态ActionForm配置验证规则,如检查必需的输入域、日期和时间等。关于Validator的使用方法可参考本讲5.4节。
5.3.4 动态ActionForm应用实例
例如在第3讲的登录系统中,我们用动态ActionForm取代原来的普通ActionForm,具体修改步骤如下。
(1)删除LoginActionForm类。
把原系统中的LoginActionForm删除,因为使用动态ActionForm后,不需要它了。
(2)修改struts-config.xml。
具体修改的地方如下:
<form-beans>
<form-bean name="loginActionForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
</form-beans>
(3)修改LoginAction类。
修改后的LoginAction类如例程5-6所示。
例程5-6 LoginAction类
package login;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import java.util.*;
public class LoginAction extends Action {
public ActionForward execute(ActionMapping actionMapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
//从Form Bean中取出表单数据
DynaActionForm loginActionForm = (DynaActionForm)form;
String username = (String)loginActionForm.get("username");
String password = (String)loginActionForm.get("password");
//生成一个Session 对象
HttpSession session = request.getSession(true);
session.removeAttribute("username");
session.setAttribute("username",username);
//生成一个ArrayList对象,并把用户名和密码的值存入该对象中
ArrayList arr = new ArrayList();
arr.add(username); arr.add(password);
String prompt;
//调用模型组件loginHandler,检查该用户是否已注册
LoginHandler login = new LoginHandler();
akarta mark = login.checkLogin(arr);
if(mark) prompt = "Success";
else prompt = "Fail";
return actionMapping.findForward(prompt);
}
}
(4)编译、打包、运行。
把修改后的程序编译、打包后,运行效果与原来的系统一样。
5.4 Validator验证框架
Struts1.1及以上版本,在提供了动态ActionForm的同时,配合数据验证的需要,还提供了表单输入自动验证的功能,即使用Validator验证框架。
Validator验证框架是通过配置验证规则实现验证功能的,开发人员不需要编写代码,同时也能够最大限度重用同一个验证规则。因此,这种验证方式在目前的Struts应用中得到了广泛的应用。
在使用Validator验证框架时,需要用到两个基于XML的配置文件进行验证规则的配置,一个是validator-rules.xml,另一个是validation.xml。这两个文件应该部署在相应的Web应用中的WEB-INF文件夹下。此外,Validator还应在struts-config.xml中进行配置。
其中,validator-rules.xml文件包含了一组通用的验证规则,对所有Struts应用都可以使用,Struts软件包中本身提供了这个文件。一般不需要开发人员进行修改,直接将其部署在相应的WEB-INF文件夹中即可。
5.4.1 Validator的安装
Struts1.2发布版中包含了Validator框架用到的所有文件和包。Validator作为Jakarta的commons工程的一部分,可以从地址http://jakarta.apache.org/commons/下载其最新版本。
Validator框架依赖的两个最重要的包即jakarta-oro.jar和commons-validator.jar。
l akarta-oro.jar:提供了一组处理正则表达式、文本的替换、过滤和分割等功能。
l commons-validator.jar:提供了一个简单的、可扩展的验证框架,包含了一些通用的标准验证规则和验证方法。
使用Validator验证框架时,需要在配置文件validator-rules.xml和validation.xml中配置验证规则。这两个文件应该部署在相应的Web应用中的WEB-INF文件夹下。此外,Validator还应在struts-config.xml中进行配置。
5.4.2 在struts-config.xml中配置Validator
Validator框架是作为一个Struts插件配置到Struts应用程序中的,即Struts扩展中的PlugIn机制。通过在Struts配置文件struts-config.xml中配置Validator插件,Struts应用在启动时就能够知道Validator框架正在被使用,加载并初始化Validator框架。以下代码是一个典型的在struts-config.xml中配置Validator的方式:
<plug-in className="org.apache.struts.validator.ValidatorPlugin">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
应用程序启动时,Struts框架将调用validatorPlugIn类的init()方法初始化Validator框架。Init()方法根据pathnames属性,加载相应的validator-rules.xml文件和validation.xml文件,把验证信息读入到内存中。
StopOnFirstError属性的作用是指定客户端JavaScript验证的执行方式。当该值为false时,JavaScript会在验证全部需要验证的表单字段后发出错误警告信息;否则在发现第一个验证错误时就返回。
5.4.3 validator-rules.xml的配置
validator-rules.xml配置文件包含了一组通用的有效性规则,这些通用性的验证规则可以满足大部分验证需求,而且该文件也是独立于应用程序的,可以被任何Struts应用程序使用。该文件内含于Struts的发行包中,在一般情况下,无须对该文件做任何改动。只有当打算扩展或修改默认的验证规则时才需修改这个文件。
Validator-rules.xml文件的根元素是<form-validation>,该元素包含零个或多个global元素。Global元素包含零个或多个validator元素。这些元素在dtd文件中的定义如下:
<!ELEMENT form-validation (global*, formset*)>
<!ELEMENT global (validator*, constant*)>
每个validator元素定义了一个唯一的有效性验证规则。以下代码是validator-rules.xml文件中一个名为integer的有效性验证规则。
<validator name="integer"
classname="org.apache.struts.validator.FieldChecks"
method="validateInteger"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends=""
msg="errors.integer"
jsFunctionName="IntegerValidations"/>
validator元素有8个属性,它们的含义列于表5-2中。
表5-2 validator元素的属性
属 性
描 述
name
指定验证规则的逻辑名称,该名称在validator-rules.xml文件中必须是唯一的
classname
指定实现验证规则的逻辑的类
method
指定实现验证规则的逻辑的方法
methodParams
在method属性中指定的方法的参数列表
msg
指定资源包中的一个消息key。当出现一个有效性验证错误时,Validator框架将使用这个key到资源包中查找匹配的消息文本
depends
指定在调用当前验证规则执行当前验证逻辑之前,应该先调用的其他验证规则
jsFunctionName
指定生成JavaScript函数的名称,如果没有指定该属性,则JavaScript函数名称使用validator的名称
jsFunction
指定一些传递到页面中的JavaScript用于执行表单验证
在默认情况下,Validator框架使用以下消息文本:
# Struts Validator Error Messages
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.
应该把以上的内容添加到Struts资源文件中。如果打算使用自定义的消息文本替换这些默认的消息文本,可以修改validator-rules.xml文件中validator元素的msg属性,也可以直接修改以上的消息文本。
5.4.4 validation.xml的配置
validation.xml文件是Validator框架需要的另一个配置文件。该文件是特定于应用程序的,由开发人员自己来创建。它描述了那些具体应用中的ActionForm所使用的validator-rules.xml文件中的有效性验证规则。通过ActionForm在validation.xml文件中配置所需要的验证规则,开发人员就不必将验证逻辑硬编码放在ActionForm的内部。一个简单的validation.xml文件如例程5-7所示。
例程5-7 validation.xml实例
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//
EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<formset>
<form name="loginActionForm">
<field property="username"
depends="required">
<arg0 key="prompt.username"/>
</field>
<field property="password"
depends="required, minlength,maxlength">
<arg0 key="prompt.password"/>
<arg1 key="${var:minlength}" name="minlength"
resource="false"/>
<arg2 key="${var:maxlength}" name="maxlength"
resource="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>16</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
validation.xml文件中包含form-validation、global、formset、form、field、msg、arg、var等元素。下面对它们一一进行介绍。
1.form-validation元素
<form-validation>元素是validation.xml文件的根元素。它包含2个子元素,即<global>元素和<formset>元素,其在dtd中的定义如下:
<!ELEMENT form-validation (global*, formset*)>
2.global元素
global元素允许开发人员配置可以用在文件其他部分中的constant元素,也就是全局常量。这与在Java文件中定义一个常量,然后在类中使用该常量的方式相似。constant元素以名字和值的方式出现。例如:
<form-validation>
<global>
<constant>
<constant-name>zip</constant-name>
<constant-value>^\d{5}\d*$</constant-value> <!--常量值,这里是一个正则表达式-->
</constant>
<global>
<formset>
<form name="registerForm">
<field property ="zipPostal" depends="required, mask">
<arg0 key="registerForm.zippostal.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>${zip}</var-value>
</var>
</field>
</form>
</formset>
<form-validation>
在以上代码中,在<global>元素中定义了一个常量zip,在<formset>元素中可以通过${constant-name}的形式,如${zip},来引用这个常量。
3.formset元素
<formset>元素包含两个子元素,即<constant>元素和<form>元素。<constant>元素可以出现零次或多次,<form>元素至少出现一次。这里的<constant>元素中定义的constant常量是局部常量,只能在当前<formset>元素内引用。
<formset>元素有2个属性,即language和country,它们用于国际化。
4.form元素
form元素定义了一套将要进行有效性验证的域(field),其name属性指定对应表单的名字,并且name属性与Struts配置文件中的form-bean元素的name属性一致。
form元素可以包含多个field元素。
5.field元素
一个field元素对应于一个表单中需要验证的字段。它的属性如表5-3所示。
表5-3 field元素的属性
属 性
描 述
property
将要进行有效性验证的ActionForm的属性名
depends
指定字段的验证规则,多个规则之间以逗号分开
page
如果对应的ActionForm是一个跨页表单,可能包括一个page属性与表单中的page属性相对应,用户指定该字段应该在哪一页被处理
indexedListProperty
后循环列表,执行该域的有效性验证
field元素可以包含几个子元素:msg元素、arg元素及var元素。
6.msg元素
field元素的msg子元素指定验证规则对应的消息文本。该消息文本将替代默认的消息文本,即validator-rules.xml中定义的消息文本。msg元素的值必须是应用程序消息资源包中的某个消息资源的关键字。例如:
<field property="lastName" depends="required, mask" page="1">
<msg name="mask" key="registerForm.lastname.maskmsg"/>
<arg0 key="registerForm.lastname.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]*$</var-value>
</var>
</field>
当lastName字段有效性验证失败时,显示的错误消息是消息资源中registerForm. lastname.masking键所指的消息文本。
msg元素的属性如表5-4所示。
表5-4 msg元素的属性
属 性
描 述
key
指定绑定的消息资源中的消息文本或直接指定消息文本
name
指定验证规则的名字
bundle
指定绑定的消息资源的名称
resource
当该属性值为true时,表示使用来自消息资源的消息文本;当该属性值为false时,表示直接在key属性中设置消息文本。默认值为true。
7.arg元素
arg元素可以用来向消息文本中传递参数。它有name、key、resource和position等几个属性,name、key、resource属性的含义与msg元素的属性相当。position属性用来指定消息文本中的替换位置。
例如,例程5-8是关于minlength验证规则的配置文件。
例程5-8 minlength验证规则的配置文件
<field property="password"
depends="required, minlength">
<arg0 key="prompt.password" />
<arg1 key="${var:minlength}" name="minlength"
resource="false" position="1"/>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
在validator-rules.xml文件中,minlength验证规则的默认消息文本是:
{0} can not be less than {1} characters.
在例程5-8中,position属性的值为1的arg元素定义中,name属性的值为minlength,表示仅适用于minlength验证规则,resource属性的值为false,表示可直接在key属性中设定消息文本,即key属性的值为${var:minlength},在这里是3。把以上代码中两个arg的key值分别放入minlength验证规则的默认消息文本中的相应位置,最后返回的消息文本应该是:
password can not be less than 3 characters.
8.var元素
var元素用来向验证规则传递参数。例如在例程5-7中,定义了maxlength和minlength两个参数,分别传递给maxlength和minlength验证规则。
arg元素也可以访问var元素,语法形式是${var:var-name}。例如,在例程5-7中的${var:maxlength}和${var:minlength}的使用。
5.4.5 DynaValidatorForm类及其子类
Validator框架不能用于验证标准的ActionForm类,使用Validator时应该使用与之匹配的ActionForm类:ValidatorForm类或DynaValidatorForm类,以及其子类ValidatorActionForm和DynaValidatorActionForm。它们都是ActionForm类的子类。它们之间的关系如图5-3所示。
图5-3 DynaValidatorForm类的类关系图
5.4.6 Validator的应用示例
以登录系统为例来示例如何应用Validator来实现自动表单输入验证功能。本节的示例程序是在第3讲的登录系统的程序基础上进行修改所得。本实例的代码在本书附带的光盘的code/ch5/validator目录中。
(1)修改登录页面login.jsp,如例程5-9所示。
例程5-9 修改后的登录页面login.jsp
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@page contentType="text/html; charset=gb2312" %>
<html:html>
<head><title>登录页面</title></head>
<body>
<font color="red"><html:errors/></font>
<html:form action="loginAction" method="post">
用户名: <html:text property="username" size="15"/><br><br>
密  码: <html:password property="password" size="15"/><br><br>
<html:submit value="登录" property="submit"/><br>
</html:form>
</body>
</html:html>
(2)修改struts-config.xml文件,如例程5-10所示。
例程5-10 修改后的struts-config.xml文件
?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1
//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="loginActionForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="username" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
</form-beans>
<action-mappings>
<action input="/login.jsp" name="loginActionForm"
path="/loginAction" scope="request"
type="login.LoginAction" validate="true" >
<forward name="Success" path="/main.jsp"/>
<forward name="Fail" path="/register.jsp"/>
</action>
</action-mappings>
<message-resources parameter="ApplicationResources"/>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property
property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
</struts-config>
(3)创建和部署验证规则及验证内容文件。
通常可以使用Struts原有的验证规则文件validator-rules.xml,将Struts二进制发布包的lib/目录下的该文件复制到当前应用程序的WEB-INF/目录下即可。具体要验证的表单数据内容和采用何种规则进行验证只能由开发者自己规定,具体做法是在应用程序的WEB-INF/目录下创建XML文件validation.xml。本项目的validation.xml如例程5-11所示。
例程5-11 validation.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<formset>
<form name="loginActionForm">
<field
property="username"
depends="required,minlength">
<arg0 key="label.username"/>
<arg1 name="minlength" key="${var:minlength}" resource="false" position="1"/>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
<field
property="password"
depends="required,minlength">
<arg0 key="label.password"/>
<arg1 name="minlength" key="${var:minlength}"
resource="false" position="1"/>
<var>
<var-name>minlength</var-name>
<var-value>3</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
(4)创建资源包属性文件ApplicationResources.properties,如例程5-12所示。
例程5-12 ApplicationResources.properties
# Simple properties file for test.
title.login = Login Page
item.submit = Submit
error.name.required=A UserName is Required
error.psw.required=A Password is Required
label.username=Username
label.password=Password
errors.required={0} can not be null
errors.minlength={0} can not less than {1} char.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
(5)修改Action类——LoginAction.java,如例程5-13所示。
例程5-13 LoginAction.java
package login;
import org.apache.struts.action.*;
import org.apache.struts.validator.DynaValidatorForm;
import javax.servlet.http.*; java.util.*;
public class LoginAction extends Action {
public ActionForward execute(ActionMapping actionMapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//从Form Bean中取出表单数据
DynaValidatorForm loginActionForm = (DynaValidatorForm)form;
String username = (String)loginActionForm.get("username");
String password = (String)loginActionForm.get("password");
//生成一个Session 对象
HttpSession session = request.getSession(true);
session.removeAttribute("username");
session.setAttribute("username",username);
//生成一个ArrayList对象,并把用户名和密码的值存入该对象中
ArrayList arr = new ArrayList();
arr.add(username);
arr.add(password);
String prompt;
//调用模型组件loginHandler,检查该用户是否已注册
LoginHandler login = new LoginHandler();
boolean mark = login.checkLogin(arr);
if(mark) prompt = "Success";
else prompt = "Fail";
return actionMapping.findForward(prompt);
}
}
发表评论
-
背景暗一点,突出当前页
2008-05-01 18:32 1449<%@ page language="java ... -
条形码barcode4j的使用
2008-05-01 18:31 39861.去http://barcode4j.sourceforge ... -
JAVA如何调用WINDOWS命令行
2008-05-01 18:28 7957JAVA如何调用WINDOWS命令行 用Java编写应用时, ... -
Servlet实现的图形验证码
2008-05-01 18:27 1413Servlet实现的图形验证码 ... -
servlet产生数字验证码
2008-05-01 18:25 1154servlet产生数字验证码 package com.sun ... -
使用servlet编写一个验证码的例子
2008-05-01 18:24 1523使用servlet编写一个验证码的例子 package com ... -
用Servlet生成jpeg图像
2008-05-01 18:21 1378用Servlet生成jpeg图像 思想:1:在服务器根据客 ... -
使用Java Servlet动态生成图片
2008-05-01 18:20 2146使用Java Servlet动态生成图片 在Web应用中,经 ... -
用Servlet生成动态图片
2008-05-01 18:18 1333用Servlet生成动态图片 打开eclipse(最好是装了m ... -
用servlet生成图片,在jsp叶面中显示
2008-05-01 18:17 2193用servlet生成图片,在jsp叶面中显示。 代码如下~: ... -
struts应用之利用.properties核对用户名和密码
2008-05-01 17:22 1107目的:在一个文档中给出用户名和密码,根据文档核对用户名和密码, ... -
Eclipse web中的国际化
2008-05-01 17:20 10681.首先工具栏windows->ge ... -
整合Eclipse、Struts、Hibernate和Spring的Java web开发
2008-05-01 17:04 1361本讲我们将介绍几种比 ... -
用STRUTS实现国际化
2008-05-01 17:00 942一.JSP页面部分 1. 页面文字处理 1.1概述 ... -
Struts国际化处理的思路
2008-05-01 16:41 1171一、Struts的国际化 ...
相关推荐
下面我们将深入探讨Struts基础`jar`包中的关键知识点。 1. **Struts核心库** - `struts-core.jar`: 这是Struts框架的核心库,包含了Action、ActionForm、ActionMapping等核心组件,以及控制器Dispatcher的实现。它...
通过这个“Struts基础与案例开发详解”教程,你可以全面了解Struts框架的基础知识,并通过实际的项目练习提升开发技能。无论是初学者还是有经验的开发者,都能从中受益,进一步掌握Java Web开发的精髓。
以下是一些关于Struts基础的常见问题及其答案: 1. **什么是Struts框架?** Struts 是一个基于MVC设计模式的Java Web框架,用于构建结构清晰且易于维护的Web应用。它通过提供控制器Servlet(ActionServlet)来协调...
总之,Struts基础学习是一个实践性很强的过程,通过实际操作和不断试验,你将能更好地掌握这个强大的MVC框架。记得理论与实践相结合,多查阅文档,参与社区讨论,这样你的Struts技能将会不断提升。
在"Struts基础教程附录"中,我们可以期待学习到以下几个关键知识点: 1. **MVC模式**:理解MVC模式是使用Struts的基础。模型(Model)负责处理业务逻辑,视图(View)用于展示数据,控制器(Controller)处理用户...
这个"Struts基础演示DEMO.rar"压缩包包含了几个关键文件,可以帮助我们了解和学习Struts的基本概念和工作原理。 首先,"struts的教程.doc"可能是关于Struts的详细教程文档,通常会涵盖Struts框架的基础知识,包括...
这个"struts基础(简单的登录系统)"是为初学者设计的,旨在帮助理解Struts框架的基础概念和工作原理。 Struts框架的核心是Model-View-Controller(MVC)设计模式,它将业务逻辑、数据和用户界面分离,使得开发更有序...
Struts的基础知识是Java Web开发中的重要组成部分,以下是对Struts基础知识的详尽解析。 一、Struts架构 Struts框架的核心由多个组件组成,包括ActionServlet、Action、ActionForm、ActionMapping和Tiles等。Action...
对于初级程序员来说,掌握Struts基础知识至关重要。 **1. MVC架构** MVC模式是一种设计模式,用于将业务逻辑、数据处理和用户界面分离。在Struts中,Model代表业务逻辑和数据,View负责展示,Controller处理用户...
这个"Struts基础教程的源代码"应该包含了一些基本的 Struts 应用示例,例如用户注册(registration)功能的实现。下面将详细介绍 Struts 框架的核心概念和在用户注册场景中的应用。 1. **MVC设计模式**:MVC 是一种...
在"struts基础源代码以及注释"这个压缩包中,包含了一系列的文件,如struts2_7到struts2_8,这可能代表了Struts 2的不同版本。每个版本可能有其特定的更新和改进,这些文件包含了框架的核心组件和相关注释,帮助...
**STRUTS基础** Struts是Java Web开发中的一款经典MVC(Model-View-Controller)框架,由Apache软件基金会维护。它为开发者提供了一种结构化的、可扩展的、易于维护的方式来构建Web应用程序。本资源包含完整的源...
在"基于MyEclipse的Struts基础总结"中,我们可以探讨以下几个重要的知识点: 1. **MVC模式**:MVC(Model-View-Controller)是一种设计模式,用于将应用程序的业务逻辑、用户界面和数据处理分开。在Struts中,...
Struts基础开发视频,非常适合初学者认识了解使用Struts框架
Struts基础教程01
Struts基础教程02
Struts基础教程04
Struts基础教程03
Struts基础教程05