避免使用beanutils进行属性的copy_聚散球的使用方法

避免使用beanutils进行属性的copy_聚散球的使用方法使用BeanUtils的原因因为setProperty是JSP中的标签,因此使用model2模式JSP+Servlet+JavaBean的时候,JSP将form提交给Servlet程序,而Servlet程序无法像JSP一样使用setProperty对数据进行封装,

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

使用BeanUtils的原因

这里写图片描述

因为setProperty是JSP中的标签,因此使用model 2模式JSP+Servlet+JavaBean的时候,JSP将form提交给Servlet程序,而Servlet程序无法像JSP一样使用setProperty对数据进行封装,

<jsp:useBean id="calculator" class="cn.megustas.javabean.Calculator" scope="page"/>
<jsp:setProperty property="*" name="calculator"/>

但是可以通过内省技术进行数据的封装,但是每一次写内省程序是一件很麻烦的事情,并且内省匹配也会有问题(例如一侧是String,一侧是int,还需要进行数据转化),因此,内省(基于反射,方便操作javabean的API)封装form数据到javabean的代码,一般不自己编写,使用已经编写好的工具开发包BeanUtils开发包。

注意:如果想自动封装数据,表单form中元素的name需要与JavaBean中的属性一致。

什么是BeanUtils

BeanUtils一套开发包,Apache公司提供 ,专门进行javabean操作,在web层各种框架中被使用,例如:struts 使用BeanUtils操作JavaBean 。

实例
1、下载BeanUtils的jar :commons-beanutils 、commons-logging,需要同时下载两个jar包。(BeanUtils依赖Logging的jar包 )
2、将beanutils和logging的 jar包复制 工程/WebContent/WEB-INF/lib
这里写图片描述

JavaBean

package cn.megustas.javabean;



/** * 必须满足 三个条件 :必须满足 三个条件 :无参数构造器(不创建有参数构造器,即会有系统默认的无参构造器)、private成员,public get/set * * @author Megustas * */
public class Person { 
   
    private String name;
    private String city;
    private String hobby;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public String getHobby() {
        return hobby;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }



}

JSP页面

<body>
<!-- 使用BeanUtils将form参数封装到 JavaBean Person对象中 -->
<!-- "/megustas/demo"为封装数据的Servlet的url -->
<form action="/megustas/demo" method="post">
    姓名 <input type="text" name="name" /> <br/>
    城市 <input type="text" name="city" /> <br/>
    爱好 <input type="text" name="hobby" /> <br/>
    年龄 <input type="text" name="age" /><br/>
    <input type="submit" value="提交" /><!-- 点击提交,提交的数据即是类中需要的属性 -->
</form>
</body>

通过action将form表单提交给servlet程序,对数据进行封装,封装到Person对象中
Servlet程序(映射中的url为/megustas/demo):

package cn.megustas.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;

import cn.itcast.javabean.Person;

/** * 获得form数据 ,将form数据封装 Person对象中 * * @author Megustas * */
public class DemoServlet extends HttpServlet { 
   

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");// 处理乱码

        // 将form参数 自动封装 Person对象
        Person person = new Person();
        try {
            BeanUtils.populate(person, request.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //检验是否封装到person对象中
        System.out.println(person.getName());
        System.out.println(person.getCity());
        System.out.println(person.getHobby());
        System.out.println(person.getAge());
        System.out.println(person.getBirthday());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

注意:

  • 引BeanUtils包时要引org.apache.commons.beanutils

BeanUtils原理

常用方法:

//将请求的Map封装为Person对象(JavaBean)
BeanUtils.populate(Object bean,Map properties);

(注:因为需要为Map类型,因此需要通过request.getParameterMap()方法将form表单中的数据变为Map类型)

这里写图片描述

实际上是通过JavaBean中的setName等方法,将form表单中的属性的值封装到person对象中去。对于类型转换,我们可以看下如下的这个例子,我们在JavaBean中添加一个属性Date(对应set/get方法也需要添加):

public class Person {
    private String name;
    private String city;
    private String hobby;
    private int age;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public String getHobby() {
        return hobby;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Date getBirthday() {
        return birthday;
    }

}

JSP页面中增加:

    生日 <input type="text" name="birthday" /><br/>

Servlet程序中增加一个输出

System.out.println(person.getBirthday());

则将会报错,因为服务器端为Date类型,从输入的form表单的数据无法转换过去,即如果在Person类添加特殊类型Date类型,对于特殊类型如何封装 ?因此,需要了解一下BeanUtils的封装原理

这里写图片描述

即任何的类型转换都是通过转换器来实现的。例如我们之前的例子,String类型的提交数据是通过IntegerConverter转换器转换为person对象中的int类型的。可以总结为如下:

1、如果form参数是String类型,javabean属性String类型 —- 调用BeanUtils.populate 将form数据封装 javabean
2、如果JavaBean属性类型不是String —- 将form数据封装javabean 需要转换器 —– 在BeanUtils API 提供很多默认转换器(完成常见转换)
3、如果需要转换类型非常特殊,可以通过自定义转换器完成 定义类实现Converter接口,实现convert方法 ,在populate调用之前通过ConvertUtils.register注册转换器

因此,如果出现上种情况,即需要将String类型转换为java.util.Date类型,我们可以自定义转换器

自定义转换器(或者在已有转换器,但是不知道如何使用的情况也可以通过自定义转换器来进行类型转换)
1.需要实现Converter接口

class MyDateConverter implements Converter { 
   

    @Override
    // 需要 将value数据转换 c的类型
    // value 是 String类型,将String转换Date类型
    public Object convert(Class c, Object value) { 
   
        String s = (String) value; // 代表用户输入生日
        //定义格式
        DateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日");
        try {
            Object result = dateFormat.parse(s); // 将String解析为 Date,将日期变为字符串使用format方法
            return result;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

}

因为在转换器中定义了“yyyy年MM月dd日”的格式,因此在jsp页面的form表单需要输入信息为“1998年2月12日”这类的格式的字符串,才可以通过我们自定义的转换器进行转换,转换为Date类型并之后进行存储。
2.注册转换器

ConvertUtils.register(转换器, 目标类型.class);

修改之后的Servlet程序:

public class Demo4Servlet extends HttpServlet { 
   

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");// 处理乱码

        // 将form参数 自动封装 Person对象
        Person person = new Person();

        // 将String类型 转换 java.util.Date类型 --- 自定义转换器
        // 在封装数据之前 ,注册转换器
        ConvertUtils.register(new MyDateConverter(), Date.class);

        try {
            BeanUtils.populate(person, request.getParameterMap());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //检验是否封装到person对象中
        System.out.println(person.getName());
        System.out.println(person.getCity());
        System.out.println(person.getHobby());
        System.out.println(person.getAge());
        System.out.println(person.getBirthday());
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

BeanUtils结论

  1. BeanUtils.populate(Object bean, Map properties)方法进行数据封装
  2. 一般其实不需要自定义转换器,只有在特殊情况下才会自定义转换器
    1、如果form参数是String类型,javabean属性String类型 —- 调用BeanUtils.populate 将form数据封装 javabean
    2、如果JavaBean属性类型不是String —- 将form数据封装javabean 需要转换器 —– 在BeanUtils API 提供很多默认转换器(完成常见转换)
    3、如果需要转换类型非常特殊,可以通过自定义转换器完成 定义类实现Converter接口,实现convert方法 ,在populate调用之前通过ConvertUtils.register注册转换器

最通俗的说法,JavaBean就是一个存数据的地方,要么
(1)通过JSP页面中的标签去存储form表单中的数据(action跳转到JSP页面,之后“useBean”,“setProperty”进行数据存储),再在JSP界面中通过“getProperty”显示数据。
(2)在JSP页面中通过action跳转到Servlet程序的url,在Servlet程序中通过BeanUtils工具类的相关方法对JSP页面中的表单信息进行存储。

JSP+Servlet+JavaBean模式示意图:

这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/194955.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 哪个游戏盒子里有JAVA_关于点和盒子游戏的Java minimax

    哪个游戏盒子里有JAVA_关于点和盒子游戏的Java minimax我想建议您完全重新考虑代码.查看代码的问题(以及为什么这里没有很多响应)是很难遵循并且很难调试.例如,什么是gs.getRemainingLines,它究竟做了什么?(为什么剩下的线而不是所有合法的线?)但是,通过一些简化,可以更容易地弄清楚发生了什么并修复它.在抽象层面,minimax只是这个过程:floatminimax_max(GameStateg){if(gisterminal…

  • java.nio.heapbytebuffer_javastringbuffer和string区别

    java.nio.heapbytebuffer_javastringbuffer和string区别文章目录简介初始化向ByteBuffer写数据手动写入数据从SocketChannel中读入数据至ByteBuffer从ByteBuffer中读数据复位position读取数据字节序处理简介在Java的Socket编程中,若使用阻塞式(BIO),则往往通过ServerSocket的accept()方法获取到客户端Socket之后,再使用客户端Socket的InputStream和OutputS…

  • ODrive配置云台电机GIMBLE_TYPE

    文章目录0.前言1.硬件介绍1.1.硬件1.2.接线2.配置参数2.1.基本配置2.2.电机配置2.5.保存配置3.校准工作3.1.校准电机3.2.编码器校准3.3.保存校准结果4.切换电机类型5.控制电机运行6.重新启动自动进入闭环控制7.PID参数调节7.1.官网教程7.2.云台电机自己调参总结8.总结8.1.遇到的错误1.MOTOR_ERROR_PHASE_RESISTANCE_OUT_OF_RANGE2.ENCODER_ERROR_CPR_POLEPAIRS_MISMATCH3.CONTROLLE

  • EasyDSS流媒体服务器软件-正式环境安装部署攻略

    EasyDSS流媒体服务器软件-正式环境安装部署攻略EasyDSS流媒体服务器软件,提供一站式的转码、点播、直播、时移回放服务,极大地简化了开发和集成的工作。其中,点播功能主要包含:上传、转码、分发。直播功能主要包含:直播、录像,直播支持RTMP输入,RTMP/HLS/HTTP-FLV的分发输出;录像支持自定义保存时长、检索及下载。提供丰富的二次开发接口,基于JSON的封装及HTTP调用。提供播放鉴权、推流鉴权等安全保证。提供用户及相关权限管理…

  • PGN详解_PGN行情

    PGN详解_PGN行情

  • 基于Deep Learning 的视频识别技术「建议收藏」

    基于Deep Learning 的视频识别技术「建议收藏」深度学习在最近十来年特别火,几乎是带动AI浪潮的最大贡献者。互联网视频在最近几年也特别火,短视频、视频直播等各种新型UGC模式牢牢抓住了用户的消费心里,成为互联网吸金的又一利器。当这两个火碰在一起,会产生什么样的化学反应呢?不说具体的技术,先上一张福利图,该图展示了机器对一个视频的认知效果。其总红色的字表示objects,蓝色的字表示scen…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号