struts2请求参数处理

今天总结一下struts2中有关action处理请求参数的两部分核心内容,第一:请求参数的封装,第二:请求参数的校验。

Action处理请求参数

struts2 和 MVC 定义关系

StrutsPrepareAndExecuteFilter: 控制器

JSP : 视图

Action : 可以作为模型,也可以是控制器

 

struts2 Action 接受请求参数 :属性驱动 和 模型驱动

Action处理请求参数三种方式

第一种:Action 本身作为model对象,通过成员setter封装 (属性驱动 )

       页面:

              用户名 <input type="text" name="username" /><br/>

       Action:

              publicclass RegistAction1 extends ActionSupport {

                     privateString username;

                     publicvoid setUsername(String username) {

                            this.username= username;

                     }

              }

问题一: Action封装数据,会不会有线程问题 ?

  *struts2 Action 是多实例 ,为了在Action封装数据  (struts1 Action 是单例的 )

问题二: 在使用第一种数据封装方式,数据封装到Action属性中,不可能将Action对象传递给 业务层

  * 需要再定义单独JavaBean ,将Action属性封装到 JavaBean

 

             

第二种:创建独立model对象,页面通过ognl表达式封装 (属性驱动)

       页面:

              用户名 <input type="text" name="user.username" /><br/>  ----- 基于OGNL表达式的写法

       Action:

              publicclass RegistAction2 extends ActionSupport {

                     private User user;

                     publicvoid setUser(User user) {

                            this.user= user;

                     }

 

                     publicUser getUser() {

                            returnuser;

                     }

              }

             

问题: 谁来完成的参数封装

       <interceptor

name="params"class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

 

第三种 :使用ModelDriven接口,对请求数据进行封装 (模型驱动 ) ----- 主流

       页面:

              用户名 <input type="text" name="username" /><br/> 

       Action:

              publicclass RegistAction3 extends ActionSupport implements ModelDriven<User> {

                     privateUser user = new User(); // 必须手动实例化

                     publicUser getModel() {

                            returnuser;

                     }

              }

* struts2 有很多围绕模型驱动的特性

* <interceptorname="modelDriven"class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>为模型驱动提供了更多特性

 

对比第二种、第三种 : 第三种只能在Action中指定一个model对象,第二种可以在Action中定义多个model对象

       <inputtype="text" name="user.username" />

       <inputtype="text" name="product.info" />

封装数据到Collection和Map

1封装数据到Collection对象

       页面:

              产品名称 <input type="text"name="products[0].name" /><br/>

       Action:

              publicclass ProductAction extends ActionSupport {

                     privateList<Product> products;

                    

                     publicList<Product> getProducts() {

                            returnproducts;

                     }

 

                     publicvoid setProducts(List<Product> products) {

                            this.products= products;

                     }

              }

2封装数据到Map对象

       页面:

              产品名称

<inputtype="text" name="map['one'].name" />

<br/> =======  one是map的键值

       Action:

              publicclass ProductAction2 extends ActionSupport {

                     private Map<String,Product> map;

 

                     publicMap<String, Product> getMap() {

                            returnmap;

                     }

 

                     publicvoid setMap(Map<String, Product> map) {

                            this.map= map;

                     }

              }    

Struts2类型转换(了解)

1、 struts2 内部提供大量类型转换器,用来完成数据类型转换问题

boolean 和 Boolean

char和 Character

int 和 Integer

long 和 Long

float 和 Float

double 和 Double

Date 可以接收 yyyy-MM-dd格式字符串

数组  可以将多个同名参数,转换到数组中

集合  支持将数据保存到 List 或者 Map 集合

案例: 输入合法年龄和生日可以自动转换

当输入abc 转换为 int类型 age时

              Causedby:    java.lang.NoSuchMethodException:

cn.xxxx.struts2.demo3.CustomerAction.setAge([Ljava.lang.String;

       分析: 输入20 ,转换 int类型20 --- setAge(int)

             输入abc,转换int 出错 ---- setAge(String) ----- 报错方法不存在异常

 

Jsp中接受异常信息

<%@ taglib uri="/struts-tags"prefix="s"%>

<s:fielderror/>

 

请求参数校验

校验的分类 :客户端数据校验 和 服务器端数据校验

客户端数据校验 ,通过JavaScript 完成校验 (改善用户体验,使用户减少出错 )

服务器数据校验 ,使用框架内置校验功能(struts2 内置校验功能 ) ----- 必须的

 

struts2 支持校验方式

代码校验 :在服务器端通过编写java代码,完成数据校验

配置校验 :XML配置校验(主流) 和 注解配置校验

手工代码校验请求参数

步骤一: 封装数据

       步骤二: 实现校验Action ,必须继承ActionSupport 类

       步骤三: 覆盖validate方法,完成对Action的业务方法数据校

              通过代码逻辑判断参数是否有效,如果参数非法 , this.addFieldError (ActionSupport提供)

              workflow拦截器 跳转回 input页面

       步骤四: 在jsp中 通过 <s:fieldError/> 显示错误信息

 

* validate方法会对Action中所有业务方法进行校验,如果只想校验某一个方法   validate方法名()

 

比如执行action里面的名称是add的方法,只想对add方法进行校验

 validateAdd()

 

Xml配置方式数据校验

XML配置方式数据校验 (企业主流校验)

       代码校验 不适用于 大型项目, 流程数据复杂时,开发量和维护量都会很大

 

xml配置校验原理: 将很多校验规则代码已经写好,只需要在xml中定义数据所使用校验规则就可以了

 

       步骤一 :编写jsp

       步骤二 :编写Action 继承ActionSupport 或者 实现 Validateable 接口

       步骤三 :封装请求参数

                     *使用xml校验 必须提供get方法

       步骤四 :编写校验规则xml文件

              Action所在包编写 Action类名-validation.xmlAction所有业务方法进行校验

       引入DTD

              ------xwork-core-2.3.7.jar 中 xwork-validator-1.0.3.dtd

              <!DOCTYPEvalidators PUBLIC

             "-//Apache Struts//XWorkValidator 1.0.3//EN"

             "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

       内置校验器定义文件

              xwork-core-2.3.7.jar中/com/opensymphony/xwork2/validator/validators/default.xml

<validators>

<!-- name:要校验的字段名 -->

<fieldname="username">

     <field-validatortype="requiredstring">

         <message>用户名不能为空!(XML)</message>

     </field-validator>

</field>

 

内建校验器

* required (必填校验器,要求被校验的属性值不能为null)

* requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去前后空格)

* stringlength (字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)

* regex (正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)

* int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)

* double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)

* fieldexpression (字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)

* email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)

* url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)

* date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)

             

案例

required 必填校验器

<field-validatortype="required">

      <message>性别不能为空!</message>

</field-validator>

 

requiredstring  必填字符串校验器

<field-validatortype="requiredstring">

      <param name="trim">true</param>

      <message>用户名不能为空!</message>

</field-validator>

 

stringlength:字符串长度校验器

<field-validatortype="stringlength">

       <paramname="maxLength">10</param>

       <paramname="minLength">2</param>

       <paramname="trim">true</param>

       <message><![CDATA[产品名称应在2-10个字符之间]]></message>

</field-validator>

 

int:整数校验器

<field-validatortype="int">

       <paramname="min">1</param>

       <paramname="max">150</param>

       <message>年龄必须在1-150之间</message>

</field-validator>

 

date: 日期校验器

<field-validatortype="date">

       <paramname="min">1900-01-01</param>

       <paramname="max">2050-02-21</param>

       <message>生日必须在${min}到${max}之间</message>

</field-validator>

 

url: 网络路径校验器

<field-validatortype="url">

       <message>xxxx播客的主页地址必须是一个有效网址</message>

</field-validator>

 

email:邮件地址校验器

<field-validatortype="email">

       <message>电子邮件地址无效</message>

</field-validator>

 

regex:正则表达式校验器

<field-validator type="regex">

     <paramname="expression"><![CDATA[^13\d{9}$]]></param>

     <message>手机号格式不正确!</message>

</field-validator>

 

fieldexpression : 字段表达式校验

<field-validatortype="fieldexpression">

      <param name="expression"><![CDATA[(password==repassword)]]></param>

      <message>两次密码输入不一致</message>

</field-validator>

 

=============================

如何对指定的方法校验

格式 Action类名-ActionName(<action>元素name属性)-validation.xml

       例如 : 校验AddCustomerAction中execute方法 配置 <action

name="addcustomer".../> 校验文件名字:

 AddCusotmerAction-addcustomer-validation.xml

自定义校验规则(了解)

步骤一: 自定义校验器必须实现 Validator  接口

              通常自定义校验器 继承 ValidatorSupport 和 FieldValidatorSupport 

              *ValidatorSupport 针对不是一个输入字段 (两个密码一致)

              *FieldValidatorSupport 针对是一个输入字段  (用户名非空)

       步骤二: 注册校验器

              在工程的src下新建validators.xml文件

              引入 xwork-core-2.3.7.jar中xwork-validator-config-1.0.dtd 

       步骤三 :使用校验器

              在Action所在包 创建Action类名-validation.xml

 

编写一个类继承FieldValidatorSupport :

public class MyAgeValidator extends FieldValidatorSupport {

 

public void validate(Objectobj) throws ValidationException {

     // 获得字段名称:

     String name =this.getFieldName();

     // 获得字段的值:

     Object value =  this.getFieldValue(name, obj);

    

     if(value instanceofInteger){

         int age = (Integer)value;

         if(age < 0){

             this.addFieldError(name,obj);

         }

     }

}

 

}

 

*注册校验规则:

* 在src下创建一个validators.xml

* 引入一个DTD:

* xwork-core-2.3.7.jar下的xwork-validator-config-1.0.dtd

* 配置:

 

<!DOCTYPE validators PUBLIC "-//Apache Struts//XWorkValidator Config 1.0//EN"

 "http://struts.apache.org/dtds/xwork-validator-config-1.0.dtd">

 

<validators>

<validator name="aaa" class="cn.xxxx.action.demo6.MyAgeValidator"></validator>

</validators>

 

* 使用校验规则:

<validators>

<fieldname="age">

     <field-validatortype="aaa">

         <message>年龄不能为负数!</message>

     </field-validator>

</field>

</validators>

 

**** 实际开发中很少用到自定义校验器

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值