九、封装请求正文到对象中

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属性封装、类型转换、数据验证的更多相关文章

  1. Java常用工具类---XML工具类、数据验证工具类

    package com.jarvis.base.util; import java.io.File;import java.io.FileWriter;import java.io.IOExcepti ...

  2. java 属性封装

    //封装性 //封装概念: //1.是面向对象思想的三大特征之一 //2.封装细节是隐藏的,仅对外提供访问接口 //3.封装分类: //属性封装 //方法封装 //类的封装 //组件的封装 //模块化 ...

  3. Struts2(二)之封装请求正文、数据类型转换、数据验证

    一.封装请求正文到对象中(重点) 1.1.静态参数封装 在struts.xml文件中,给动作类注入值,使用的是setter方法 1.2.动态参数封装 通过用户表单封装请求正文参数 1.2.1.动作类作 ...

  4. JAVA面向对象初步知识总结:封装、继承、多态

    1.封装 把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是是封装.其结果是一个同时带有特征和行为的数据类型.所谓具体实现的隐藏是通过访问权限控制实现的.JAVA 子类重写继承的方法时,不可以 ...

  5. Java基础-四要素之一《封装》

    封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保 ...

  6. Java学习-029-JSON 之三 -- 模仿 cssSelector 封装读取 JSON 数据方法

    前文简单介绍了如何通过 json-20141113.jar 提供的功能获取 JSON 的数据,敬请参阅:Java学习-028-JSON 之二 -- 数据读取. 了解学习过 JQuery 的朋友都知道, ...

  7. 《深入理解Java虚拟机:JVM高级属性与最佳实践》读书笔记(更新中)

    第一章:走进Java 概述 Java技术体系 Java发展史 Java虚拟机发展史 1996年 JDK1.0,出现Sun Classic VM HotSpot VM, 它是 Sun JDK 和 Ope ...

  8. Java提高篇(1)封装

    三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能 ...

  9. Java基础-面向对象第一特性之封装(Encapsulation)

    Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...

随机推荐

  1. 电脑IP改变后oracle em无法登陆的解决办法(亲测)

    以下方法为本人亲测 情况:假设电脑初次安装oracle时的ip是192.168.133.110 那么进入em的地址就是http://192.168.133.110:1158/em/console/lo ...

  2. Spark0.8.0的安装配置

    1.profile export SCALA_HOME=/home/hadoop/scala-2.9.3SPARK_080=/home/hadoop/spark-0.8.0export SPARK_H ...

  3. SignalR Supported Platforms -摘自网络

    SignalR is supported under a variety of server and client configurations. In addition, each transpor ...

  4. .NET Compact Framework Data Provider for SQL Server CE

    .NET Compact Framework Data Provider for SQL Server Mobile Standard Data Source=MyData.sdf;Persist S ...

  5. 北京Uber优步司机奖励政策(2月6日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. 关于.net的一些基础知识(一)

    一.GC工作原理: GC如其名,就是垃圾收集,当然这里仅就内存而言.Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础,遍历应用程序在Heap上 ...

  7. SQL注入专题

    SQL注入专题--整理帖 SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别, 所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被 ...

  8. iOS从生成证书到打包上架-02(详细2016-10最新)

    由于篇幅的限制,这篇接着上一篇(关于证书)写的,有需要的小伙伴可以先阅读上一篇 2.在App Store创建应用 1.回到Account,点击iTunes Connect 2.点击我的App 3.点击 ...

  9. android_自定义布局

    1.需要实现view类 2.如果需要实现自定义属性则: 1.定义资源文件attrs---->values 2. <?xml version="1.0" encoding ...

  10. mysql_config_editor

    加入账号: [root@server-mysql bin]# ./mysql_config_editor set --login-path=client --user=root --password ...