在Struts中非常典型的特点就是使用了ActionForm来搜集表单数据,可是搜集到的表单数据所有都是String类型的。假设我们直接拿来使用我们会面临一个非常麻烦的问题就是频繁的类型装换。

Struts中使用了BeanUtils来使我们从繁重的体力劳动中解脱出来。

BeanUtils的工作原理:

我们通过一个简单的样例来了解一下他最主要的使用,首先建立一个实体类Student

package com.tgb.struts;
import java.sql.Date;
public class Student {
//姓名
private String name;
//年龄
private int age;
//生日
private Date birth;
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;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}

编写測试类

package com.tgb.struts;
import org.apache.commons.beanutils.BeanUtils;
import junit.framework.TestCase;
public class Demo2Test extends TestCase {
public void test01() throws Exception {
// 1.载入类
Class clss = Class.forName("com.tgb.struts.Student");
// 2.创建Bean对象
Student st = (Student) clss.newInstance();
// 3.通过BeanUtils给对象属性赋值
BeanUtils.setProperty(st, "name", "L。");
// 4.输出对象属性值
String str = BeanUtils.getProperty(st, "name");
System.out.println(str);
}
}
    执行測试类我们会发如今控制台上的输入结果为“L。”也就是我们想要的结果。

这个好像看上去非常easy。BeanUtils帮我们做了什么呢:

BeanUtils的setProperty(object,name,value)方法须要的參数各自是

Object=载入类的对象

Name=类属性的名称

Value=所赋的值;

BeanUtils的getProperty(object,name)方法的返回值是String类型。所以能够直接输出。

    假设我们自己写我们怎样做,首先我们须要知道Student类的属性,以及属性的类型。

然后把我们想要赋值到相应属性的数据强转为可用的类型并赋值,而使用BeanUtils我们仅仅须要知道他的属性名就能够了。

数据的强转它已经帮我们做好了。

    BeanUtils还有一个经常使用的方法就是copyProperties()
       假设你有两个具有非常多同样属性的JavaBean,一个非经常见的情况就是Struts里的PO对象(持久对象)和相应的ActionForm。比如Teacher和TeacherForm。我们通常会在Action里从ActionForm构造一个PO对象,传统的方式是使用类似以下的语句对属性逐个赋值:
//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
teacher.setName(teacherForm.getName());
teacher.setAge(teacherForm.getAge());
teacher.setGender(teacherForm.getGender());
teacher.setMajor(teacherForm.getMajor());
teacher.setDepartment(teacherForm.getDepartment()); //持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);

而使用BeanUtils后,代码就大大改观了,例如以下所看到的:

//得到TeacherForm
TeacherForm teacherForm=(TeacherForm)form;
//构造Teacher对象
Teacher teacher=new Teacher();
//赋值
BeanUtils.copyProperties(teacher,teacherForm);
//持久化Teacher对象到数据库
HibernateDAO=;
HibernateDAO.save(teacher);

假设Teacher和TeacherForm间存在名称不同样的属性,则BeanUtils不正确这些属性进行处理,须要程序猿手动处理。比如Teacher包括modifyDate(该属性记录最后改动日期。不须要用户在界面中输入)属性而TeacherForm无此属性,那么在上面代码的copyProperties()后还要加上一句:

teacher.setModifyDate(new Date());
    当然以上是BeanUtils的最主要的使用,但究竟他是怎样工作的呢。

    我们首先看一下用于装换Integer的IntegerConverter类的convert方法:
public Object convert(Class type, Object value) {
//首先推断是否为空,为空抛出异常
if (value == null) {
if (useDefault) {
return (defaultValue);
} else {
throw new ConversionException("No value specified");
}
}
//推断是否为Integer的类型,假设是直接返回,可是对于我们从表单获取的数据,总是String类型的。
//这个功能往往是在实体间赋值的时候使用。 //假设不是实体类型的就装换为实体返回。
if (value instanceof Integer) {
return (value);
}
try {
return (new Integer(value.toString()));
} catch (Exception e) {
if (useDefault) {
return (defaultValue);
} else {
throw new ConversionException(e);
}
}
}

事实上代码非常好理解。其它的类型装换也都基本上相似。事实上就是对我们繁杂工作的一个简单的封装。在一般的写bean组件的时候,都必需要写setter和getter方法,当然假如我们事先已经知道bean的相关属性和方法,写bean是比較简单的,可是组件太多的时候,反复编写常常是枯燥乏味令人厌烦的。但当有些时候我么需要调用动态对象的属性的时候。我们应该怎么来设定和获取对象的属性呢?BeanUtils就能够帮助我们为了解决这个问题。


版权声明:本文博主原创文章,博客,未经同意不得转载。

Struts1——离BeanUtils看struts其原理1的更多相关文章

  1. Struts1——从BeanUtils看struts的实现原理2

        上一篇博客中我们简单的介绍了BeanUtils的使用.以及其最主要的原理,今天我们进一步的理解这个类在Struts1中的使用.     首先我们先回想一下搭建一个简单的基于Struts1框架的 ...

  2. struts1,struts2,hibernate,spring的运行原理结构图

    一.struts1运行原理 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...

  3. struts工作原理不错的解释___

    Struts 使用 Model 2 架构.Struts 的ActionServlet 控制导航流.其他Struts 类,比如Action, 用来访问业务逻辑类.当 ActionServlet 从容器接 ...

  4. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  5. [JavaEE,MVC] Struts工作原理

    基本概念 Struts是Apache 基金会Jakarta 项目组的一个Open Source 项目,它采用MVC模式,能够很好地帮助java 开发者利用J2EE开发Web应用.和其他的java架构一 ...

  6. Struts1基础、使用Struts实现登录、使用Struts HTML标签简化开发

    Struts 1基础 为什么重拾Struts 1 曾经是最主流的MVC框架 市场份额依然很大 很多遗留系统中依旧使用 维护和升级都需要熟悉Struts 1 与Struts 2相比 编码.配置繁琐 侵入 ...

  7. 从JDK源码角度看线程池原理

    "池"技术对我们来说是非常熟悉的一个概念,它的引入是为了在某些场景下提高系统某些关键节点性能,最典型的例子就是数据库连接池,JDBC是一种服务供应接口(SPI),具体的数据库连接实 ...

  8. struts工作原理(图解)

    Struts2框架的工作原理: 1.服务器启动,会加载我们的xml配置文件中的内容. 2.服务器启动之后,过来一个servlet请求,如user类中的save方法.请求过来先过过滤器(strutsPr ...

  9. 源代码看CoordinatorLayout.Behavior原理

    在上一篇博客CoordinatorLayout高级使用方法-自己定义Behavior中,我们介绍了怎样去自己定义一个CoordinatorLayout的Behavior.通过文章也能够看出Behavi ...

随机推荐

  1. Cocos2d-x学习笔记(六) 定时器Schedule的简单应用

     Cocos2d-x中的定时器使用非常easy,共同拥有3种:schedule.scheduleUpdate和scheduleOnce.简介一下三种的差别: schedule,每隔指定时间运行某个 ...

  2. POJ 3422 Kaka's Matrix Travels(费用流)

    POJ 3422 Kaka's Matrix Travels 题目链接 题意:一个矩阵.从左上角往右下角走k趟,每次走过数字就变成0,而且获得这个数字,要求走完之后,所获得数字之和最大 思路:有点类似 ...

  3. 【C语言】推断一个数的奇偶(位操作)

    //推断一个数的奇偶 #include <stdio.h> int is_signal(int num) { if (num & 1) return 1; else return ...

  4. Razor基础语法

    原文:Razor基础语法 一.介绍      Razor是ASP.NET MVC视图引擎的代号,支持.cshtml和.vbhtml两种模板文件,符号@标记服务端代码的开始,比以前asp.net的< ...

  5. maven插件的生命周期的详细说明(两)

    插件配置 定义解释:插件目标 当我们了解了maven插件之后.我们发现假设为每个功能编写一个独立的插件显然是不可取的,由于这些任务背后有非常多能够复用的代码.因此,把这些功能聚集在一个插件里,每个功能 ...

  6. Webuploader 大文件分片上传

    百度Webuploader 大文件分片上传(.net接收)   前阵子要做个大文件上传的功能,找来找去发现Webuploader还不错,关于她的介绍我就不再赘述. 动手前,在园子里找到了一篇不错的分片 ...

  7. 玩转Web之servlet(二)---servlet常见错误

    1>403:tomcat发生错误 2> 404 :意思是服务器依据请求资源路径,找不到对应的资源        解决:1.依据http://localhost:8080/Web工程名/ur ...

  8. ssh远程登录报错REMOTE HOST IDENTIFICATION HAS CHANGED!解决方式及原因

    注意,文档中的ip和指纹已经替换为了ip.ip.ip.ip 和aa:... ,以免引起不必要的误会. icode@test:~/lab/dir/sadf$ ssh remote_name@ip.ip. ...

  9. 原代码,反码,解释和具体的补充 Java在&gt;&gt;和&gt;&gt;&gt;差异

    前两天分析 HashMap 的 hash 算法的时间,会见 >> 和 >>> 这两个符号.然后检查以下信息,我脑子里在某一时刻.今天遇到,我没想到居然忘  0-0.... ...

  10. Spark第一个研究笔记1一片 - Spark一个简短的引论

    该公司推出的在线项目Spark拥有近1随着时间的推移.有效,Spark事实上,优秀的分布式计算平台,以提高生产力. 开始本篇笔记.此前的研究会Spark研究报告共享出来(由于篇幅的限制,它将被划分成制 ...