Java 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、常用验证器示例





运行结果:

Java Struts2 (二)的更多相关文章
- java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器
实例1:实现客户端IP地址和访问方式输出到浏览器. IpAction.java package com.amos.web.action; import javax.servlet.http.HttpS ...
- Java EE : 二、图解 Cookie(小甜饼)
目录 Java EE : 一.图解Http协议 Java EE : 二.图解 Cookie(小甜饼) Java EE : 三.图解Session(会话) 概述 一.概述 二.详细介绍Cookie 传输 ...
- 利用JAVA生成二维码
本文章整理于慕课网的学习视频<JAVA生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...
- Java Struts2 POI创建Excel文件并实现文件下载
Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...
- 小兵眼中的Java Struts2
老魏终于可以回园子了,但是这次要慢慢的回来,不能一下子回来,这段时间除了要照顾刚出生的小女儿,还要做项目.说实在的老魏时间真是有限,不能照顾到园子的文章了,所以只能慢慢的回来写文章了.抱歉! ...
- java实现二维码
说起二维码,微信好像最先启用,随后各类二维码就开始流行起来了.那什么是二维码呢. 1.什么是二维码?百度一下即可 http://baike.baidu.com/view/132241.htm?fr=a ...
- Java 设计模式(二)-六大原则
Java 设计模式(二)-六大原则 单一职责原则(Single Responsibility Principle) 定义: 不要存在多余一个原因导致类变更,既一个类只负责一项职责. 问题由来: 当类A ...
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- 20175212童皓桢 Java实验二-面向对象程序设计实验报告
20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...
- java 多线程二
java 多线程一 java 多线程二 java 多线程三 java 多线程四 线程中断: /** * Created by root on 17-9-30. */ public class Test ...
随机推荐
- IDEA通过Maven WebApp archetype 创建Spring boot项目骨架
springboot项目资源: GitHub地址:https://github.com/TisFreedom/springbootdome.git 码云地址:https://gitee.com/Tis ...
- six
团队序号:6组 团队名称:拯救地球小分队 团队项目的码云地址:https://gitee.com/lwj5950/seflash 此次博客撰写人姓名:刘威骏 学号:2017*****7168 团队中的 ...
- Java学习笔记01
1.原型设计: 将页面的模块.元素.人机交互的形式,利用线框描述的方法,将产品脱离皮肤状态下更加具体跟生动的进行表达. 2.下面的是使用PowerDesigner进行设计的持久层的层次结构图: 虚线三 ...
- [Alpha]Scrum Meeting#6
github 本次会议项目由PM召开,时间为4月8日晚上10点30分 时长25分钟 任务表格 人员 昨日工作 下一步工作 木鬼 整理开会记录 撰写并发布之前因为清明耽误的博客 SiMrua 寻找方法捕 ...
- 利用java实现一个简单的链表结构
*博客搬家:初版发布于 2014/07/04 定义: 所谓链表就是指在某节点存储数据的过程中还要有一个属性用来指向下一个链表节点,这样的数据存储方式叫做链表 链表优缺点: 优点:易于存储和删除 缺点: ...
- Angular material mat-icon 资源参考_Navigation
ul,li>ol { margin-bottom: 0 } dt { font-weight: 700 } dd { margin: 0 1.5em 1.5em } img { height: ...
- &与&& ,|与||的区别
&&和||是短路运算符,&和|是非短路运算符 &&与& 区别:两者都表示“与”运算,但是&&运算符第一个表达式不成立的话,后面的表达式不 ...
- 2019.4.2 HTML相关
HTML页面的基本结构 html标签 页面的设置和文件的导入(页面标题) 要显示在页面上的标签 标签 h1---h6:一到六级标题 hr:分割线 br:换行 p:段落 em:斜体 strong:加粗 ...
- 10g 升级到11g 失效对象2则
########SAMPLE 0 Invalid X_$ Views & Synonyms After Upgrading to 11g (文档 ID 878623.1) Those view ...
- 04-oracle时间函数
add_months(sysdate,x)x月之后的日期:last_day(sysdate)指定日期所在月份的最后一天:next_day(sysdate,'星期x')当前日期后的下一个星期x: mon ...