struts2学习笔记二
一、分文件编写框架配置文件
1、不分文件开发可能产生的问题
就类似于我们在写java类时,所有代码都写在一个类里,甚至写在一个方法里。


当3个人都checkout了struts.xml文件时,第一个人提交了,后面的人在没有更新就提交时,第一个人写的可能就白写了。
2、分文件编写Struts2的配置文件

二、封装请求正文到对象中(非常重要)
1、静态参数封装
在struts.xml配置文件中,给动作类注入值。调用的是setter方法。

原因:是由一个staticParams的拦截器完成注入的。

2、动态参数封装:开发时用到的
通过用户的表单封装请求正文参数。
2.1、动作类作为实体模型
实体模型:Entity,对应数据库中表的记录(注意类对应的是表结构,而对象对应的是一条记录)


原因:是由params拦截器完成的。
2.2、动作类和实体模型分开

问题:
由于我们没有初始化user对象,默认为null,一调用setUser方法,就空指针异常了。但是框架却封装进去值了。
原因:
通过执行过程:


2.3、模型驱动:建立动作类和模型分开的前提下(开发中采用的方式)
此处的学习目标:目前先记住怎么写,要想理解,必须等讲完OGNL表达式之后。

原因:是由一个modelDriven拦截器做的。
三、用户注册案例(重点)
1、数据建模(实体模型和数据库)

2、建立业务层接口

3、建立持久层接口

4、数据源工具类


5、表现层使用Struts2框架实现
5.1、动作类:

5.2、配置文件

5.3、注册界面和结果视图
注册界面:

结果视图:

四、数据类型的转换(明白原理,实际开发中几乎不用)
1、开发中的情况:
实际开发中用户通过浏览器输入的数据都是String或者String[]。
String/String[]————填充模型(set方法)————>POJO(plain old java object) pojo中有java的数据类型。
POJO————————获取(get方法)————>页面展示:String
2、类型转换情况
写数据:(增,删,改)都是String或String[]数组转换为其他类型。
读数据:(查)其他类型转换为String。
3、Struts2提供的常用类型转换
a.基本数据类型自动转换。
b.日期类型:默认按照本地日期格式转换(yyyy-MM-dd)。
c.字符串数组:默认用逗号+空格,连接成一个字符串。
4、自定义类型转换器(知道)
示例:把日期格式按照 MM/dd/yyyy的格式转换
4.1、Struts2中的类型转换器结构:


4.2、编写类型转换器(编写一个类继承StrutsTypeConverter,实现抽象方法)

4.3、注册类型转换器
局部类型转换器:只能指定javabean中的属性用
按照属性来注册。在属性所属的javabean的包下建立一个.properties文件。文件名称:javabean名称-conversion.properties


全局类型转换器:(推荐)
按照要转换的数据类型来注册。
at the top op classpath,建立一个固定名称xwork-conversion.properties的属性文件。


5、转换失败后的处理(需要掌握)
当转换失败后,页面提示:

解决办法:配置回显结果视图

问题:
配置了回显视图后,当转换失败时,可以回到请求页面,但是表单数据都没了?


显示错误提示:借助Struts2的标签库。

回显数据:使用struts2的标签库生成表单。(建议使用)


错误信息中文提示:使用的是struts2的国际化。


问题:
类型转换器当转换失败后,如何进入input视图的?
原因:
是由一个叫做conversionError的拦截器完成的。
注意:
要想使用类型转换中的错误处理,在定义Action时必须继承ActionSupport
五、数据验证
用户的输入验证,必须做,且工作量巨大。
1、验证的方式
客户端验证:javascript
服务端验证:逻辑验证(我们的代码)
注意:如果客户端和服务端二选一的话,服务器端的不能省。
实际开发中:客户端+服务端
2、Struts2的服务端验证
2.1、编程式验证
前提:
动作类必须继承ActionSupport
在代码中编写验证规则。
a、针对动作类中的所有动作方法进行验证:
在动作类中覆盖public void validate()方法。



但是当我们再写一个动作方法时:




由此可知,该验证方法会对动作类中的所有动作方法进行验证。
b、针对动作类中的某个动作方法进行验证
针对上面的问题,解决办法1:给不需要验证的动作方法添加一个@SkipValidation注解。


解决办法2:validation方法遵守书写规范。


解决办法1和解决办法2的使用时机:需要验证的动作方法少,用解决办法2。需要验证的方法多,用解决方式1。(简单一点:挑少的写)
所有编程式验证的弊端:硬编码。
2.2、声明式验证(推荐)
通过编写验证规则的xml文件。需要验证时,编写xml文件,不要验证,就不写。
优势:解决了2.1编程式验证的弊端
a、针对动作类中的所有动作进行验证:在动作类所在的包中,建立一个ActionClassName-validation.xml的文件,内容如下:

注意:它是针对动作类中的所有动作方法。


b、针对动作类中的某个动作进行验证:在动作类所在的包中建立一个xml文件,名称为ActionClassName-ActionName-validation.xml。内容如下:

它是针对指定动作方法进行验证:


2.3、Struts2内置的常用声明式验证器
2.3.1位置:
xwork-core-2.3.15.3.jar\com\opensymphony\xwork2\validator\validator\default.xml

2.3.2、验证器注入参数
例如:我们使用requiredstring,默认是去空格,当我们不想去空格时,就可以给验证器注入参数。
基于字段的:

另一种基于验证器的:

3、常用验证器示例






运行结果:
struts2学习笔记二的更多相关文章
- Struts2学习笔记(二):第一个Struts2应用
一.创建Action类. 创建工程Struts2Demo struts 2中的Action类并不需要继承struts 2中的某个父类,普遍的java类就可以. 在org.sunny.user.acti ...
- Struts2学习笔记二 配置详解
Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的name ...
- Struts2学习笔记二:开发流程
一:创建项目,添加依赖包 二:在web.xml配置核心控制器 <filter> <filter-name>struts2</filter-name> <fil ...
- Struts2学习笔记(二)——配置详解
1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin. ...
- Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)
Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
随机推荐
- redis外网连接的一些坑
前言 在使用阿里云和腾讯云的redis 可以减少很大的维护量.但是在我们的业务场景中遇到了一个情况,阿里和腾讯的redis均不支持外网访问.因此,正好帮人解决一个问题,就拿出来分享一下. 阿呆的故事 ...
- yii2.0查询关联数据以及widgets小部件
怎样去查询关联数据呢,接下来整理一个简单的代码:
- IE 浏览器中英文切换
Oracle相关产品浏览器中可以调节显示中英文
- July 19th 2017 Week 29th Wednesday
Rather than envy others, it is better to speed up their own pace. 与其羡慕他人,不如加快自己的脚步. The envy of othe ...
- [EffectiveC++]item35:考虑virtual函数以外的其他选择
本质上是说了: Template Pattern & Strategy Pattern 详细见<C++设计模式 23种设计模式.pdf 55页> 宁可要组合 不要继承. ——— ...
- 移动端开发 rem 案例
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- java动态代理的实现以及原理
1.前言 之前对动态代理的技术只是表面上理解,没有形成一个体系,这里总结一下,整个动态代理的实现以及实现原理,以表述的更清楚一些. 2.动态代理的实现应用到的技术 1.动态编译技术,可以使用Java自 ...
- 请求是如何传递给StandardEngine的?
将请求的传递过程分解学习. CoyoteAdapter将中持有Connector的引用,所以在Coyote这个类中Connector查找它所属的StandardService,而StandardSer ...
- 在一个应用中如果同一个Spring 的IOC容器被实例化两次就会出现 CannotAcquireResourceException 异常
现象描述:我在一个Junit 的测试类中实例化IOC容器 : ac = new ClassPathXmlApplicationContext("applicationContext.xml& ...
- CRT公钥登录
1.实现原理: 通过CRT生成的密钥对,把公钥上传到Linux服务器指定用户下的.ssh目录中,在客户端上只需输入秘钥的密码即可登陆,而且验证一次以后可以免密码登陆 2.具体过程: 转自:http:/ ...

