第7讲 Struts2的输入校验
struts2

—高级软件人才实作培训专家! 高级软件人才实作培训专家!
搭建Struts2开发环境
搭建Struts2环境时,我们一般需要做以下几个步骤的工作: 1》找到开发Struts2应用需要使用到的jar文件. 2》编写Struts2的配置文件 3》在web.xml中加入Struts2 MVC框架启动配置
北京传智播客教育
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
搭建Struts2开发环境--Struts2在web中的启动配置
在struts1.x中, struts框架是通过Servlet启动的.在struts2中, struts框架是通过Filter启动的.他在web.xml中的配置如下:
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
Struts2
讲师: 讲师:黎活明
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
Struts2
Struts2是在WebWork2基础发展而来的.和struts1一样, Struts2也属于MVC框架. 不过有一点大家需要注意的是:尽管Struts2和struts1在名字上的差别不是很大,但 Struts2和struts1在代码编写风格上几乎是不一样的.那么既然有了struts1,为何还要 推出struts2.主要是因为struts2有以下优点:
北京传智播客教育
—高级软件人才实作培训专家! 高级软件人才实作培训专家!
第一个Struts2应用--HelloWorld
在默认的配置文件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="itcast" namespace="/test" extends="struts-default"> <action name="helloworld" class="cn.itcast.action.HelloWorldAction" method="execute" > <result name="success">/WEB-INF/page/hello.jsp</result> </action> </package> </struts>
Struts2的介绍及总结

Struts2在WebWork基础上发展起来的,可扩展的JAVA EE web框架。
框架设计的目标贯穿整个开发周期,从开发到发布,包括维护的整个过程。
Action类:Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。
Struts2提供一个ActionSupport基类去实现常用的接口。
Action接口不是必须的,任何有execute标识的POJO 对象都可以用作Struts2的Action对象。
线程模式:Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。
Servlet依赖:Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。
如果需要,Struts2 Action仍然可以访问初始的request和response。
但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。
可测试性:Struts2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入:Struts2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。
Action属性能够通过web页面上的taglibs访问。
表达式语言:Struts 2 使用"ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。
ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
Struts2不仅支持JSTL,Struts2 还可使用OGNL进行类型转换。
提供基本和常用对象的转换器。
校验:Struts2支持通过validate方法和XWork校验框架来进行校验。
XWork 校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。
Strust2 数据校验

Strust2-数据校验一. ActionSupport是个工具类,他实现了Action, Validatable等接口, Validatable提供validate()方法进行数据验证.Action只要继承ActionSupport类,重写validate()方法就可以进行数据验证二. 校验的流程首先,Struts框架对输入数据进行类型转换,然后再进行数据校验,如果类型转换与数据校验都没有错误发生, 就进入execute(),否则请求将被转发到input视图三. 注册实例1. register.jsp[html]view plaincopy1.<span style="font-size:16px;"><%@ page language="java"contentType="text/html; charset=utf-8"%>2.<%@ taglib prefix="s"uri="/struts-tags"%>3.<html>4.<head>5.<title>Insert title here</title>6.</head>7.<body>8.<s:form action="register"method="post">9.<s:textfield name="name"label="姓名"required="true"/>10.<s:textfield name="age"label="年龄"required="true"/>11.<s:submit value="提交"></s:submit>12.</s:form>13.</body>14.</html>15.</span>2.当姓名和年龄提交时候,用RegistAction类来获取数值:RegistAction.java[html]view plaincopy1.<span style="font-size:16px;"> 1: public class RegistAction extends ActionSupport {2. 2: private String name;3. 3:4. 4: private int age;5. 5:6. 6: ...//省略name,age的setter,getter方法7. 7:8. 8: public String execute() {9. 9: return SUCCESS;10. 10: }11. 11:12. 12: public void validate() {13. 13: if ("".equals(name)) {14. 14: this.addFieldError("name", "用户名不能为空");15. 15: }16. 16: if (name.length() > 6) {17. 17: this.addFieldError("name", "用户名长度不能超过5位");18. 18: }19. 19:20. 20: if (age <1 || age > 150) {21. 21: this.addFieldError("age", "年龄范围必须在1~150之间");22. 22: }23. 23: }24. 24: }25.</span>[html]view plaincopy1.<span style="font-size:16px;">.struts.xml2.3. 1: <package name="test1"extends="struts-default"namespace="test1">4. 2: <action name="register1"class="test1.RegistAction">5. 3: <result name="input">register.jsp</result>6. 4: <result name="success">../success.jsp</result>7. 5: </action>8. 6: </package>9.</span>[html]view plaincopy1.<span style="font-size:16px;">4.success.jsp2.3. 1: <%@ page contentType="text/html;charset=GBK"%>4. 2: <%@ taglib prefix="s"uri="/struts-tags" %>5. 3: <s:property value="name"/>,欢迎您登录!6.7.</span>如果name和age都不输入,则会执行Action中的校验方法,会提示用户名不能为空如果不输入userName, age输入为abc,会提示Invalid field value for field "age".username is empty1. 其中Invalid field value for field "age" 信息是struts2通过内置的类型转换器进行类型转换时,如果不能成功转换, struts2框架自动生成一条错误信息,并将该错误信息放到addFieldError里面,这种默认的输出信息格式是在xwork-2.0.4.jar中定义的.com/opensymphony/xwork2/xwork-messages.properties文件中有一条xwork.default.invalid.fieldvalue=Invalid field value for field "{0}".2. 这是一种全局的错误提示方式,整个系统中只要是字段类型转换错误都会这样提示,我们也可以改变这种输出格式,只要在全局的国际资源文件中重写xwork.default.invalid.fieldvalue就可以了.实现方式:在struts.xml中加入<constant name="struts.custom.i18n.resources"value="messageResource"></constant>或者也可以在struts.properties中加入struts.custom.i18n.resources=messageResource指定国际化资源文件名为messageResource. Properties新建messageResource. Properties资源文件并添加数据xwork.default.invalid.fieldvalue={0} failure 修改之后字段类型转换错误提示为: {0} failure3 所有的类型转换失败后,struts2会将基本类型设置为0,对象类型设置为null,这里的age的类型为Integer,当类型转换失败age值为null,如果age的类型为int,那么转换失败后值为04.这种提示信息不够友好,也可以定义局布的提示信息,为每一个Action新建一个properties文件,文件名为XXX.properties(Action名.properties)实现方式:新建RegistAction.properties并添加invalid.fieldvalue.age=age errorinvalid.fieldvalue.birthday=birthday error其中age和birthday分别为字段的名称四.Struts2也提供类似BaseDispatchAction的功能1.<span style="font-size:16px;">1: package com;2. 2:3. 3: import com.opensymphony.xwork2.ActionSupport;4. 4:5. 5: public class Regist2Action extends ActionSupport {6. 6:7. 7: private String userName;8. 8:9. 9:10. 10:11. 11: public String getUserName() {12. 12:13. 13: return userName;14. 14:15. 15: }16. 16:17. 17: public void setUserName(String userName) {18. 18:19. 19: erName = userName;20. 20:21. 21: }22. 22:23. 23: public String regist() throws Exception {24. 24:25. 25: System.out.println("注册成功-regist");26. 26:27. 27: return SUCCESS;28. 28:29. 29: }30. 30:31. 31:32. 32:33. 33: public void validateRegist() {34. 34:35. 35: if(userName.equals("")){36. 36:37. 37: addFieldError("userName", "请输入用户名-registValidate");38. 38:39. 39: }40. 40:41. 41: }42. 42:43. 43: }44. 44:45. 45: <action name="regist2"class="com.Regist2Action"method="regist">46. 46: <result name="success">/welcome.jsp</result>47. 47: <result name="input">/regist2.jsp</result>48. 48: </action>49.</span>指定了method为regist,当请求时会执行regist(),不会再去执行默认的execute()方法了, validateRegist()方法是专门针对regist校验的.(格式为validate+方法名)。
基于Struts2的运动员信息管理输入校验

基于Struts2的运动员信息管理输入校验潘健【期刊名称】《电子测试》【年(卷),期】2015(0)3【摘要】Enrollment music class students,so the college needs more music equipments.The college always faces challenge of the comprehensive information management for music equipments.This paper conducted data integrity design based on the database design on accounting treatment system for music equipment management.Entity integrity was achieved by the primary key,and it designed primary key of three tables and described the syntax when created primary key;referentialted foreign key; user-defined integrity was achieved by designing the corresponding constraint for relevant fields.%基本Struts2校验框架研究输入校验,为系统开发提供支持。
首先,通过图形描述了Struts2校验框架运行流程;然后,基于SQL Server数据库管理系统设计了运动员信息表的逻辑结构;最后,对运动员信息表的字段进行归类,设计了7种校验器的程序代码。
本文的研究内容具有思路清晰、方法科学等特点。
【总页数】3页(P153-155)【作者】潘健【作者单位】渤海大学教育与体育学院,辽宁锦州,121013【正文语种】中文【相关文献】1.基于Struts2框架的输入校验功能的实现与应用 [J], 李晓明2.基于Struts2的信息管理系统设计与实现 [J], 廉彬;朱保中3.基于Struts2的信息管理系统设计与实现 [J], 赵维维4.Struts2的输入校验研究 [J], 王春林;耿祥义5.Struts2的输入校验研究 [J], 王春林; 耿祥义因版权原因,仅展示原文概要,查看原文内容请购买。
Struts2验证框架源码详解讲解

Action配置中一定要设置input返回页面添加验证只要创建验证的xml文件1.创建xml文件名验证Action中全部方法在Action同包下,创建:Action类名-validation.xml如:ValidateAction创建ValidateAction-validation.xml验证Action中单个方法<!-- 每个方法单独配置一个Action --><!-- 在Action同包下,创建:Action类名-action方法配置名称-validation.xml --><action name="validateAdd"class="com.struts2.validator.ValidateAction" method="add"><!-- 要创建ValidateAction-validateAdd-validation.xml --><!-- 使用通配符配置 --><!-- 在Action同包下,创建:Action类名-action方法对应的名称-validation.xml --><action name="validate_*"class="com.struts2.validator.ValidateAction" method="{1}"><!-- 要创建ValidateAction-validate_add-validation.xml,validate_add为访问这个action方法的路径 -->注意事项注意:1.要验证的方法不能叫input.2.这样配置在form表单中要在<s:form action="validate_add">中action写好名称,不能写action="validate_",然后<s:submit value="提交"method="add"/>这样会找不到对应的配置文件,跳过验证.3.如果验证出错,返回input页面时,那些存在ValueStack中的值会丢失,可以将Action实现Preparable接口,然后prepare()方法里初始化添加页面需要的值.4.如果使用Preparable接口,必须在action配置中添加<interceptor-refname="paramsPrepareParamsStack"/>.这样prepare()才能得到form提交的参数.2.创建xml内容<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator1.0.2//EN" "/xwork/xwork-validator-1.0.2.dtd"><validators><!-- 要验证的字段名称 --><!-- 要验证Action中UserBean的id字段,name="userBean.id"(userBean为Action中的变量名) --><field name="mail"><!-- type要验证的类型,short-circuit(默认false),true含义,如果当前验证失败了,下面的验证就不执行了.如requiredstring失败了,email就不验证了. --><!-- field-validator下面可以有多个param元素,但是最多只能有一个message --><field-validator type="requiredstring"><param name="trim">true</param><message>Please enter a mail</message></field-validator><field-validator type="email"><message>Invalid MAIL</message></field-validator></field></validators>Struts内建验证程序(type的值)required保证字段的值不是空值null.空字符串不是空值null.<field name="userName"><field-validator type="required"><message>Please enter a user name</message></field-validator></field>requiredstring保证字段不是空值null,也不是空白(empty).param:trim(boolean) ->true->去除前后空格<field name="userName"><field-validator type="requiredstring"><param name="trim">true</param><message>Please enter a user name</message></field-validator></field><field name="password"><field-validator type="requiredstring"><param name="trim">false</param><message>Please enter a password</message> </field-validator></field>int验证字段值是否可以转换为一个整数.param: min(int);max(int)<field name="yeaar"><field-validator type="int"><param name="min">1999</param><param name="max">2010</param><message>year:1999-2010</message></field-validator></field>date验证给定日期字段的值是否在一个给定的范围内.param:max(date);min(date)<field name="borthday"><field-validator type="int"><!-- 格式取决于当前地理时区 --><param name="min">1999-01-01</param><param name="max">2010-01-01</param><message>birthday:1999-2010</message> </field-validator></field>email给定的String值是否是一个电子邮件地址<field name="email"><field-validator type="email"><message>Invalid email</message></field-validator></field>url给定的String值是否是一个合法的URL(要有前缀)<field name="url"><field-validator type="url"><message>Invalid URL</message></field-validator></field>expression,fieldexpression验证给定字段是否满足一个OGNL表达式.区别:expression 不是一个字段验证程序,失败时将生成一个动作错误.(JSP中调用<actionerror></actionerror>才显示出错信息)fieldexpression 是一个字段验证程序,失败时将抛出一个字段错误.(对字段验证) param:expression(String)OGNL表达式expression:public class ExpressionTestAction{//属性生成get,setprivate int min;private int max;}<validator type="expression"><param name="expression">max > min</param><message>Maximum temperature must be greater than Minimum temperature </message></validator><!-- jsp --><s:actionerror/>fieldexpression:public class FieldExpressionTestAction{//属性生成get,setprivate int min;private int max;}<!--对字段验证--><field name="max"><field-validator type="fieldexpression"><param name="expression">max > min</param><message>Maximum temperature must be greater than Minimum temperature</message></field-validator></field>visitor把同一个验证程序配置文件用于多个动作(对一个Bean写验证文件,每个使用的Action只要引用)//UserBeanpublic class UserBean{//属性get,setprivate String name;private int age;}//UserBean-validation.xml(和UserBean放在同一个包中)<field name="name"><field-validator type="requiredstring"><message>用户名必须</message></field-validator></field><field name="age"><field-validator type="int"><param name="min">18</param><param name="max">99</param><message>Age must be between 18and99</message></field-validator></field>//Action的validation.xml<!-- userBean变量名--><field name="userBean"><field-validator type="visitor"><!-- message会和UserBean验证中的message一起显示--><message>用户:</message></field-validator></field>如果另一个Action对UserBean使用另一个标准的验证,可以创建新的验证文件//UserBean-specific-validation.xml<!--和之前的验证不同--><field name="age"><field-validator type="int"><param name="min">30</param><param name="max">50</param><message>Age must be between 30and50</message></field-validator></field>//另一个Action的validation.xml<field name="userBean"><field-validator type="visitor"><!-- xml中扩展的名字,执行UserBean-specific-validation.xml的验证--><param name="context">specific</param><message>用户1: </message></field-validator></field>conversion检查对某个属性进行类型转换是否会导致一个转换错误<field name="age"><field-validator type="conversion"><message>An age must be an integer.</message></field-validator></field>stringlength验证一个非空的字段值是不是足够的长度param:minLength(int);maxLength(int);trim(boolean)<field name="password"><field-validator type="requiredstring"><param name="minLength">6</param><param name="maxLength">14</param><message>length:6-14</message></field-validator></field>regex给定的值是否与一个给定的正则表达式匹配param:expression(String)正则表达式;caseSensitive(boolean)是否区别大小写,默认为true;trim(boolean)是否去除前后空格<field name="phone"><field-validator type="regex"><param name="expression"><![CDATA[\d\d\d\-\d\d\d\-\d\d\d\d]]></param><message>Invalid phone number or invalid format</message></field-validator></field>3.在action中验证利用Validateable接口实现验证,实现void validate()方法.ActionSupport类已经实现了这个接口//继承ActionSupportpublic class User extends ActionSupport{//属性get,setprivate String userName;private String password;private static List<String> userNames =new ArrayList<String>();static{userNames.add("harry");userNames.add("sally");}//验证方法public void validate(){if(userNames.contains(userName)){//添加出错信息addFieldError("userName","'"+ userName +"' has been taken.");}}}4.自定义验证类要创建一个普通的验证程序(非字段验证程序),扩展ValidatorSupport类.验证失败要从validate 方法调用addActionError方法.要创建一个字段验证程序,扩展FieldValidatorSupport类.验证失败要从validate方法调用addFieldError方法.如果要能接受参数,要在类中定义一个相应的属性,并生成get,set.编写类public class StrongPasswordValidator extends FieldValidatorSupport{ //属性private int minLength =-1;public void setMinLength(int minLength){this.minLength = minLength;}public int getMinLength(){return minLength;}//验证方法public void validate(Object object)throws ValidationException{ String fieldName = getFieldName();String value =(String) getFieldValue(fieldName,object);if(value ==null|| value.length()<=0){// use a required validator for thesereturn;}if((minLength >-1)&&(value.length()< minLength)){addFieldError(fieldName,object);}else if(!isPasswordStrong(value)){addFieldError(fieldName,object);}}private static final String GROUP_1 ="abcdefghijklmnopqrstuvwxyz";private static final String GROUP_2 ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";private static final String GROUP_3 ="0123456789";protected boolean isPasswordStrong(String password){boolean ok1 =false;boolean ok2 =false;boolean ok3 =false;int length = password.length();for(int i =0; i < length; i++){if(ok1 && ok2 && ok3){break;}String character = password.substring(i, i +1);System.out.println("character:"+ character);if(GROUP_1.contains(character)){ok1 =true;continue;}if(GROUP_2.contains(character)){ok2 =true;continue;}if(GROUP_3.contains(character)){ok3 =true;}}return(ok1 && ok2 && ok3);}}注册xml在src下创建validators.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator Config 1.0//EN" "/xwork/xwork-validator-config-1.0.dtd" ><validators><!-- 名称(type对应值),类路径 --><validatorname="strongpassword"class="com.validator.StrongPasswordValidator"/></validators>使用验证<field name="password"><field-validator type="strongpassword"><param name="minLength">8</param><message>Password must be at least 8 characters longand contains at least one lower case character,one upper case character, and a digit.</message></field-validator></field>。
struts2学习笔记

struts2 的处理流程: 核心控制器(StrutsPrepareAndExecuteFilter)--->Interceptor--->action---->业务逻辑层--->dao 层
一.struts2 核心文件 struts.xml 的配置
<package name="struts2" namespace="" extends="struts-default"> <action name="sum" class="com.alex.FirstAction"> <result name="positive">/positive.jsp</result> <result name="negative">/negative.jsp</result> </action> <constant name="struts.action.extension" value="jun,lu"/> <!--指定需要 Struts 2 处理的请求后缀,多个之间用逗号分开--> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> <!--关闭动态方法调用。--> <constant name="struts.custom.i18n.resources" value="message"/> </package> 说明:space 声明命名空间。这里和表单提交的要保持一致。例如: namespace="/mystruts" 那么在表单提交的时候应该<s:form action="mystruts/sum.action" > namespace="" 那么在表单提交的时候应该<s:form action="sum.action" > 2.<action name="sum" class="com.alex.FirstAction"> class 便是对应的 Action 类 name 对应 action 的唯一标识。和表单提交时保持一致。例如: name="yj" 那么在表单提交的时候应该<s:form action="yj" > 3.<result name="positive">/positive.jsp</result> 判断跳到哪一个页面,其中 name 是唯一标识。和"com.alex.FirstAction"的返回值进 行对比。相同就跳到相应的页面 4. <constant name="struts.custom.i18n.resources" value="message"/> 配置常量 资源文件--> 1.Action 范围:类名.properties (在国际化的时候,那么就应该是:类名_zh_CN.properties ) //配置一些类型转换错误信息和其他的信息 2.包范围:package.properties 需要放在包下面,只能被该包和子包访问 (在国际化的时候,那么就应该是:package_zh_CN.properties ) 3.全局范围:通过 struts.custom.i18n.resources 来定义全局资源文件,比如在 struts.xml 中配置: <constant name="struts.custom.i18n.resources" value="message"/> 那么全局资源文件就是 message.properties
通过代码实例跟我学Struts2框架从入门到精通——在Struts2框架中实现Web表单数据校验的相关应用技术
(7)查看在 vlidationUserLogi n.jsp中所产生的 Struts 2.0常用的 Javascript和CSS
8、使用校验框架实现对Web表单进行数据验证 (1)了解default.xml文件
(2)了解在default.xml文件中的各个内带的校验器
(3)校验框架提供了三种不同形式的验证实现
客户端纯JavaScript校验方式 普通的服务器端校验方式 基于Ajax方式的服务器端校验方式
9、使用校验框架进 行验证的实现示例 (1)添加一个 ValidationUserInf oManageAction类
7、也可以校验Action类中的某个自定义的方法 (1)在Action类中增加两个不同的逻辑方法 (2)在struts.xml中配置出这两个不同的逻辑 (3)在Action类中增加对这两个不同的逻辑方法的校验方 法 public void validateXXXX(){ }
其中的“XXX”代表Action类中的方法名称。因为
注意:添加上面的标签后,将产生出两个相同的错误输出。因为 Struts2的<s:form />标签默认具备输出校验错误的能力。因 此,最好不需要添加该标签。除非input视图的目标定义页面 中没有包含<s:form />标签。
(4)在UserInfoManageAction_en_US.properties的局部
本示例的验证字段是erName,验证的类型为 requiredstring(即不为空的验证要求),如果为空则返回 key="erName.required" 的错误提示信息。
(6)执行http://localhost:8080/Struts2Web/ vlidationUserLogin.jsp
通过代码实例跟我学Struts2框架从入门到精通——在Struts2框架中实现表单数据校验的应用技术
1.1通过代码实例跟我学Struts2框架从入门到精通——在Struts2框架中实现表单数据校验的应用技术1.1.1体验Web表单数据输入的“有效性”(不是逻辑性)的重要性的应用示例1、http://127.0.0.1:8080/sshwebcrm/userManage/userLoginI18n.jsp导致后台系统在做“无用功”!因此,必须要检查用户输入的数据是否满足系统中的“基本要求”(最低要求)。
2、利用JavaSript实现客户端的数据验证(1)编程JavaSript(2)在Mozilla Firefox和IE浏览器中都提供有禁用JavaScript语言的功能(3)再浏览该系统时,将屏蔽JavaScript语言1.1.2体验应用JavaScript实现客户端的数据验证所带来的“问题”的应用示例1、编程JavaScript<form onsubmit="return checkUserInfoForm(this);"action="${pageContext.request.contextPath}/i18nUserInfoManageActionMode l.action" method="post" ><script type="text/javascript">function checkUserInfoForm(thisForm){if(erName.value==""){window.alert("你的用户为空,请输入有效的用户名称!");return false;}else if(erPassWord.value==""){window.alert("你的密码为空,请输入有效的用户密码!");return false;}return true;}</script>3、应用客户端JavaScript脚本所带来的问题(1)如果用户在浏览器端禁用了JavaScript脚本(2)再执行上面的功能页面4、在IE中禁用的方法(1)在IE中禁用的方法打开IE的 internet选项--安全-自定义级别,往下翻找到脚本—活动脚本——禁用然后在IE浏览器中禁用JavaScript脚本(2)再执行前面的页面如果完全禁止此时将直接出现下面的登录的错误提示信息,说明页面中的JavaScript根本就没有执行。
通过实例跟我学Struts2框架从入门到精通——如何校验Struts2框架中的Action类中的某个自定义方法的应用实例
1.1通过代码实例跟我学Struts2框架从入门到精通——如何校验Struts2框架中的Action类中的某个自定义方法的应用实例1.1.1校验Struts2框架中的Action类中的某个自定义方法的应用实例如果我们重写了validate方法,则该方法会应用于此Action中的所有提供服务的业务方法。
Struts2也支持校验特定方法的validateXxx()方法。
其中的“XXX”代表Action类中的方法名称。
因为validate()方法会处理Action类中的所有逻辑方法。
而如果只需要对其中的单个或者部分逻辑方法进行验证,那么就需要重写validateXxx()方法。
validateXxx()使用了反射,相对来说性能稍差,而validate()则是通过接口com.opensymphony.xwork2.Validateable调用。
1、在Action类中增加另一个自定义的方法doUserLogin2、再添加doUserRegister方法,其中的代码与doUserLogin()代码相同public String doUserRegister(){ //在该方法中进行用户注册的功能实现boolean returnResult=getUserName().equals("yang1234")&&getUserPassWord().equals("12345678");if(returnResult){oneUserInfo=new UserInfoActionForm();oneUserInfo.setUserName(userName);oneUserInfo.setUserPassWord(userPassWord);HttpSession session=ServletActionContext.getRequest().getSession();session.setAttribute("oneUserInfo", oneUserInfo);resultMessage =getUserName()+" "+ this.getText("strutsweb.login.success");}else{resultMessage =getUserName()+" "+ this.getText("strutsweb.login.failure");// resultMessage =getUserName()+" "+ this.getText("strutsweb.login.actionpackage.failure");}return this.SUCCESS;}3、在userLoginI18n.jsp页面中指示该方法的名称<formaction="${pageContext.request.contextPath}/i18nUserInfoManageActionModel!doUse rLogin.action" method="post" >或者<formaction="${pageContext.request.contextPath}/i18nUserInfoManageActionModel! doUserRegister.action" method="post" >4、将Action类中的validate()方法改名为validate DoUserLogin()(注意:其中的doUserLogin中的“d”要大写)最终的代码如下:package com.px1987.sshwebcrm.action;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;import erInfoActionForm;public class I18nUserInfoManageActionModel extends ActionSupport { private String userName=null;private String userPassWord=null;private String verifyCodeDigit=null;private int type_User_Admin;private String resultMessage;private UserInfoActionForm oneUserInfo=null;public I18nUserInfoManageActionModel() {}public String getResultMessage() {return resultMessage;}public void setResultMessage(String resultMessage) {this.resultMessage = resultMessage;}public String execute(){ //在该方法中进行用户登陆的功能实现boolean returnResult=getUserName().equals("yang1234") &&getUserPassWord().equals("12345678");if(returnResult){oneUserInfo=new UserInfoActionForm();oneUserInfo.setUserName(userName);oneUserInfo.setUserPassWord(userPassWord);HttpSession session=ServletActionContext.getRequest().getSession();session.setAttribute("oneUserInfo", oneUserInfo);resultMessage =getUserName()+" "+ this.getText("strutsweb.login.success");}else{resultMessage =getUserName()+" "+ this.getText("strutsweb.login.failure");}return this.SUCCESS;}public String doUserLogin(){ //在该方法中进行用户登陆的功能实现boolean returnResult=getUserName().equals("yang1234") &&getUserPassWord().equals("12345678");if(returnResult){oneUserInfo=new UserInfoActionForm();oneUserInfo.setUserName(userName);oneUserInfo.setUserPassWord(userPassWord);HttpSession session=ServletActionContext.getRequest().getSession();session.setAttribute("oneUserInfo", oneUserInfo);resultMessage =getUserName()+" "+ this.getText("strutsweb.login.success");}else{resultMessage =getUserName()+" "+ this.getText("strutsweb.login.failure");}return this.SUCCESS;}public String doUserRegister(){ //在该方法中进行用户注册的功能实现boolean returnResult=getUserName().equals("yang1234") &&getUserPassWord().equals("12345678");if(returnResult){oneUserInfo=new UserInfoActionForm();oneUserInfo.setUserName(userName);oneUserInfo.setUserPassWord(userPassWord);HttpSession session=ServletActionContext.getRequest().getSession();session.setAttribute("oneUserInfo", oneUserInfo);resultMessage =getUserName()+" "+ this.getText("strutsweb.login.success");}else{resultMessage =getUserName()+" "+ this.getText("strutsweb.login.failure");}return this.SUCCESS;}public void validate DoUserLogin() { //它能够验证 doUserLogin() if(getUserName()==null||getUserName().equals("")){addFieldError("erName",getText("erName.required"));}if(getUserPassWord()==null||getUserPassWord().equals("")){addFieldError("erPassWord",getText("erPassWord.required"));}if(getUserPassWord().length() <4){addFieldError("userPassWord.length",getText("erPassWord.length"));}}public void validate DoUserRegister() { //它能够验证 doUserRegister() if(getUserName()==null||getUserName().equals("")){addFieldError("erName",getText("erName.required"));}if(getUserPassWord()==null||getUserPassWord().equals("")){ addFieldError("erPassWord",getText("erPassWord.required"));}if(getUserPassWord().length() <4){addFieldError("userPassWord.length",getText("erPassWord.length"));}}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getUserPassWord() {return userPassWord;}public void setUserPassWord(String userPassWord) {erPassWord = userPassWord;}public String getVerifyCodeDigit() {return verifyCodeDigit;}public void setVerifyCodeDigit(String verifyCodeDigit) {this.verifyCodeDigit = verifyCodeDigit;}public int getType_User_Admin() {return type_User_Admin;}public void setType_User_Admin(int type_User_Admin) {this.type_User_Admin = type_User_Admin;}}4、再测试其效果 http://127.0.0.1:8080/sshwebcrm/userManage/userLoginI18n.jsp保证其中的请求是向doUserLogin方法请求<formaction="${pageContext.request.contextPath}/i18nUserInfoManageActionModel!doUse rLogin.action" method="post" >也可以将execute方法删除仍然会出现上面的错误!模拟用户注册功能<formaction="${pageContext.request.contextPath}/userInfoAction!doUserRegister.actio n" method="post" >然后再进行测试该方法的主要缺点——不灵活!比如对验证的要求发生变化(增加对新的数据的检查),此时必须修改验证程序!使得“验证程序”和对应的“表单”紧密关联。
struts2面试题(自己总结)
Struts2面试题1、struts2工作流程Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。
核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理机制。
业务控制器Action和业务逻辑组件是需要用户来自己实现的。
用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。
Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2是WebWork的升级版本。
基本简要流程如下:1 、客户端初始化一个指向Servlet容器的请求;2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)3 、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。