Java实战之01Struts2-03属性封装、类型转换、数据验证
九、封装请求正文到对象中
1、静态参数封装
在struts.xml配置文件中,给动作类注入值。调用的是setter方法。

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


2、动态参数封装:开发时用到的
通过用户的表单封装请求正文参数。
2.1、动作类作为实体模型
实体模型:Entity,对应数据库中表的记录(注意类对应的是表结构,而对象对应的是一条记录)
public class Demo1Action extends ActionSupport {
private String name;
private int age;
public String demo1(){
System.out.println(name);
System.out.println(age);
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
<!-- 动态参数封装:使用表单提交数据,第一种方式 -->
<action name="action2" class="cn.itcast.web.action.Demo2Action" method="demo2">
<result name="success">/success.jsp</result>
</action>
<form action="${pageContext.request.contextPath}/action2" method="POST">
用户名:<input type="text" name="name"/><br/>
年龄:<input type="text" name="age"><br/>
<input type="submit" value="提交"/>
</form>
原因:是由params拦截器完成的。
2.2、动作类和实体模型分开

问题:
由于我们没有初始化user对象,默认为null,一调用setUser方法,就空指针异常了。但是框架却封装进去值了。
原因:
通过执行过程:
public class Demo3Action extends ActionSupport {
private User user = new User();
public String demo3(){
System.out.println(user.getName());
System.out.println(user.getAge());
return SUCCESS;
}
public User getUser() {
System.out.println("getUser");
return user;
}
public void setUser(User user) {
System.out.println("setUser");
this.user = user;
}
}
2.3、模型驱动:建立动作类和模型分开的前提下(开发中采用的方式)
此处的学习目标:目前先记住怎么写,要想理解,必须等讲完OGNL表达式之后。
public class Demo4Action extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public User getModel() {
return user;
}
public String demo4(){
System.out.println(user.getName());
System.out.println(user.getAge());
return SUCCESS;
}
}
原因:是由modelDriven拦截器和params拦截器配合做的。
十、数据类型的转换(明白原理,实际开发中几乎不用)
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,实现抽象方法)
public class MyTypeConverter extends StrutsTypeConverter {
private DateFormat format = new SimpleDateFormat("MM/dd/yyyy");
public Object convertFromString(Map context, String[] values, Class toClass) {
if(values == null || values.length == 0){
return null;
}
String date = values[0];
if(java.util.Date.class == toClass){
try {
return format.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
public String convertToString(Map context, Object o) {
if(o instanceof Date){
Date date = (Date)o;
return format.format(date);
}
return null;
}
}
4.3、注册类型转换器
局部类型转换器:只能指定javabean中的属性用
按照属性来注册。在属性所属的javabean的包下建立一个.properties文件。文件名称:javabean名称-conversion.properties

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

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

解决办法:配置回显结果视图
十一、数据验证
用户的输入验证,必须做,且工作量巨大。
1、验证的方式
客户端验证:javascript
服务端验证:逻辑验证(我们的代码)
注意:如果客户端和服务端二选一的话,服务器端的不能省。
实际开发中:客户端+服务端
2、Struts2的服务端验证
2.1、编程式验证
前提:
动作类必须继承ActionSupport
在代码中编写验证规则。
a、针对动作类中的所有动作方法进行验证:
在动作类中覆盖public void validate()方法。
public class StudentAction extends ActionSupport implements ModelDriven<Student> {
private Student student = new Student();
public Student getModel() {
return student;
}
public void validate(){
if(StringUtils.isBlank(student.getUsername())){
addFieldError("username", "用户名不能为空");
}
}
public void validateRegist(){
if(StringUtils.isBlank(student.getUsername())){
addFieldError("username", "用户名不能为空");
}
}
public String regist(){
System.out.println("用户名不能为空");
return SUCCESS;
}
public String update(){
System.out.println("用户名不能为空“);
return SUCCESS;
}
@SkipValidation
public String findAll(){
return SUCCESS;
}
}
由此可知,该验证方法会对动作类中的所有动作方法进行验证。
b、针对动作类中的某个动作方法进行验证
针对上面的问题,解决办法1:给不需要验证的动作方法添加一个@SkipValidation注解。
解决办法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、常用验证器示例

public class Student implements Serializable {
private String username;
private String password;
private Date birthday;
private String hobby;
private boolean married;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
public boolean isMarried() {
return married;
}
public void setMarried(boolean married) {
this.married = married;
}
}
<body>
<s:actionerror/>
<s:form action="saveUser">
<s:textfield name="username" label="用户名"/>
<s:textfield name="age" label="年龄"/>
<s:textfield name="email" label="邮箱"/>
<s:textfield name="password" label="密码" />
<s:textfield name="repassword" label="确认密码"/>
<s:textfield name="score" label="成绩" />
<s:textfield name="url" label="个人主页"/>
<%-- list中的内容:
相当于创建一个新的List集合
--%>
<s:radio list="{'男','女'}" name="gender" label="性别"/>
<%--
<input type="radio" name="gender" value="男"/>男
<input type="radio" name="gender" value="女"/>女
--%>
<s:submit value="注册"></s:submit>
</s:form>
</body>
Java实战之01Struts2-03属性封装、类型转换、数据验证的更多相关文章
- Java常用工具类---XML工具类、数据验证工具类
package com.jarvis.base.util; import java.io.File;import java.io.FileWriter;import java.io.IOExcepti ...
- java 属性封装
//封装性 //封装概念: //1.是面向对象思想的三大特征之一 //2.封装细节是隐藏的,仅对外提供访问接口 //3.封装分类: //属性封装 //方法封装 //类的封装 //组件的封装 //模块化 ...
- Struts2(二)之封装请求正文、数据类型转换、数据验证
一.封装请求正文到对象中(重点) 1.1.静态参数封装 在struts.xml文件中,给动作类注入值,使用的是setter方法 1.2.动态参数封装 通过用户表单封装请求正文参数 1.2.1.动作类作 ...
- JAVA面向对象初步知识总结:封装、继承、多态
1.封装 把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是是封装.其结果是一个同时带有特征和行为的数据类型.所谓具体实现的隐藏是通过访问权限控制实现的.JAVA 子类重写继承的方法时,不可以 ...
- Java基础-四要素之一《封装》
封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保 ...
- Java学习-029-JSON 之三 -- 模仿 cssSelector 封装读取 JSON 数据方法
前文简单介绍了如何通过 json-20141113.jar 提供的功能获取 JSON 的数据,敬请参阅:Java学习-028-JSON 之二 -- 数据读取. 了解学习过 JQuery 的朋友都知道, ...
- 《深入理解Java虚拟机:JVM高级属性与最佳实践》读书笔记(更新中)
第一章:走进Java 概述 Java技术体系 Java发展史 Java虚拟机发展史 1996年 JDK1.0,出现Sun Classic VM HotSpot VM, 它是 Sun JDK 和 Ope ...
- Java提高篇(1)封装
三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能 ...
- Java基础-面向对象第一特性之封装(Encapsulation)
Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...
随机推荐
- iptables/netfilter命令、实现及利用(转)
原文链接:http://blog.csdn.net/sealyao/article/details/5934268 一.Netfilter和Iptables概述 netfilter/iptables ...
- Golang项目目录结构组织
其实golang的工程管理还是挺简单的,完全使用目录结构还有package名来推导工程结构和构建顺序. 当然,首先要说的是环境变量$GOPATH,项目构建全靠它.这么说吧,想要构建一个项目,就要将这个 ...
- nyoj 678 最小K个数之和
最小K个数之和 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 输入n个整数,输出其中最小的K个数之和.例如输入4,5,1,1,6,2,7,3,3这9个数字,当k=4 ...
- 取正在运行的DLL或EXE的路径
function GetSelfPath: string;var ModuleName: string; i: Integer;begin SetLength(ModuleName, 255); ...
- oracle 日期字段的处理
a. oracle plsql 如何查询两个间隔日期之间的数据 1) 方法一:Select * from Tables where time >= to_date('2013-01-02 19: ...
- Dom4J对XML的创建、修改、删除等操作
Dom4j也可以很方便完成XML文档的创建.元素的修改.文档的查询遍历等,但dom4j稍比jdom复杂一点,不过在大片文档的情况下dom4j的性能要不jdom好. # 准备 首先,提供相关的jar包 ...
- Data Structure导论的导论
DataStructure是一组互相之间存在一种或多种特定关系的数据的组织方式和它们在计算机内的存储方式,以及定义在该数据上的一组操作. 从以上定义可知,数据结构是研究数据的组织.存储方式及其操作的学 ...
- Android Studio中使用Gradle打包
首先要注意一点,Android Studio中把proguard.txt已经命名为proguard-rules.pro,由此可见,採用Gradle打包,混淆规则文件的名称是不重要的.能够自己随便命名. ...
- (step6.3.4)hdu 1151(Air Raid——最小路径覆盖)
题意: 一个镇里所有的路都是单向路且不会组成回路. 派一些伞兵去那个镇里,要到达所有的路口,有一些或者没有伞兵可以不去那些路口,只要其他人能完成这个任务.每个在一个路口着陆了的伞兵可以沿着街去 ...
- Ubuntu jdk报Picked up JAVA_TOOL_OPTIONS信息解决
下面是摘自http://www.cnblogs.com/coderbean/p/4522182.html 以下是我在网上找了好久找到的: Ubuntu jdk报Picked up JAVA_TOOL_ ...