BeanUtil使用例子:解析并转化HttpServletRequest到Bean的全面测试

在Web表单提交后解析表单时,一般框架都提供了某种方式可以自动从表单映射到我们的POJO类里面。属性会被自动填充的。

但如果我们在某个需求里,真的需要用程序来解析的话,那么如果有几百个属性,可就是一个噩梦了。

我们可以用java的反射机制来自己实现,也可以通过现成的辅助类库实现。

这里我介绍的是apache的 BeanUtil库的一个实现方式,我增强了默认的解析类,加上了日期的自定义解析。

1 先看解析类
ContractedBlock.gifExpandedBlockStart.gifCode
package com.laozizhu.util;

import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;

/**
 * 将HttpServletRequest解析并注入到Bean里面的辅助类。
 *
 * 
@author 老紫竹研究室(laozizhu.com)
 
*/
public class RequestToBean {
  
static {
    DateConverter d 
= new DateConverter();
    String[] datePattern 
= { "yyyy-mm-dd""yyyy/mm/dd""yyyy.mm.dd" };
    d.setPatterns(datePattern);
    ConvertUtils.register(d, java.util.Date.
class);
  }

  
public static void populate(HttpServletRequest request, Object obj) {
    Map map 
= request.getParameterMap();
    
try {
      BeanUtils.populate(obj, map);
    } 
catch (IllegalAccessException e) {
      e.printStackTrace();
    } 
catch (InvocationTargetException e) {
      e.printStackTrace();
    }
  }
}

2 测试用的基础类
ContractedBlock.gifExpandedBlockStart.gifCode
 1 package com.laozizhu.util.test;
 2 
 3 import java.util.Date;
 4 
 5 /**
 6  * 基础数据类,包括常见的数据类型。
 7  *
 8  * @author 老紫竹研究室(laozizhu.com)
 9  */
10 public class Base {
11   private long id;
12 
13   private String name;
14 
15   private float weight;
16 
17   private double height;
18 
19   private Date birthday;
20 
21   // 喜爱的数字
22   private int[] numberFavorite;
23 
24   private boolean married;
25 
26   public boolean isMarried() {
27     return married;
28   }
29 
30   public void setMarried(boolean married) {
31     this.married = married;
32   }
33 
34   public long getId() {
35     return id;
36   }
37 
38   public void setId(long id) {
39     this.id = id;
40   }
41 
42   public String getName() {
43     return name;
44   }
45 
46   public void setName(String name) {
47     this.name = name;
48   }
49 
50   public Date getBirthday() {
51     return birthday;
52   }
53 
54   public void setBirthday(Date birthday) {
55     this.birthday = birthday;
56   }
57 
58   public float getWeight() {
59     return weight;
60   }
61 
62   public void setWeight(float weight) {
63     this.weight = weight;
64   }
65 
66   public double getHeight() {
67     return height;
68   }
69 
70   public void setHeight(double height) {
71     this.height = height;
72   }
73 
74   public int[] getNumberFavorite() {
75     return numberFavorite;
76   }
77 
78   public void setNumberFavorite(int[] numberFavorite) {
79     this.numberFavorite = numberFavorite;
80   }
81 }



3 测试用的JSP代码
ContractedBlock.gifExpandedBlockStart.gifCode
 1 <%@page c%>
 2 <%@page import="com.laozizhu.util.*,com.laozizhu.util.test.*"%>
 3 <%
 4   String title = "老紫竹研究室类库演示程序-基础测试:整数、浮点数、字符串、日期、多选数字、布尔";
 5 %>
 6 <html>
 7 <head>
 8 <title><%=title%></title>
 9 </head>
10 <body>
11 <%
12   request.setCharacterEncoding("UTF-8");
13   Base b = new Base();
14   RequestToBean.populate(request, b);
15 %>
16 <%=title%>
17 <br />
18 编号:<%=b.getId()%><br />
19 名字:<%=b.getName()%><br />
20 身高:<%=b.getHeight()%><br />
21 体重:<%=b.getWeight()%><br />
22 生日:<%=b.getBirthday()%><br />
23 婚否:<%=b.isMarried()%><br />
24 数字:<%
25   if (b.getNumberFavorite() != null)
26     for (int num : b.getNumberFavorite()) {
27       out.print(num + ",");
28     }
29 %>
30 <form method="post"><br />
31 编号:<input type="text" name="id" value="1" /><br />
32 名字:<input type="text" name="name" value="老紫竹" /><br />
33 身高:<input type="text" name="height" value="173.5" /><br />
34 体重:<input type="text" name="weight" value="90.3" /><br />
35 生日:<input type="text" name="birthday" value="2009-01-23" /><br />
36 婚否:<input type="radio" name="married" value="1" checked />已婚,& lt;input type="radio" name="married" value="0" />未婚<br />
37 数字:<br />
38 <%
39   for (int i = 0; i <= 9; i++) {
40 %> <input type="checkbox" name="numberFavorite" value="<%=i %>" <%=i%3==0?" checked":"" %> /><%=i%><br />
41 <%
42   }
43 %> <input type="submit" value="提交测试" /><br />
44 </form>
45 </body>
46 </html>


4 运行结果
老紫竹研究室类库演示程序-基础测试:整数、浮点数、字符串、日期、多选数字
编号:1
名字:老紫竹
身高:173.5
体重:90.3
生日:Fri Jan 23 00:01:00 CST 2009
婚否:true
数字:0,3,6,9,

转载于:https://www.cnblogs.com/laozizhu/archive/2009/03/27/1422813.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【vue开发】vue导出Excel表格教程demo

前端工作量最多的就是需求&#xff0c;需求就是一直在变&#xff0c;比如当前端数据写完之后&#xff0c;需要用Excel把数据下载出来&#xff1b;再比如前端在没有数据库想写些demo玩时&#xff0c;也是很好的选择。 第一步安装依赖包,修改配置 1、装依赖&#xff1a; cnpm ins…

git学习(10):Git的使用--如何将本地项目上传到Github(两种简单、方便的方法)

将本地项目上传到Github&#xff08;两种简单、方便的方法&#xff09; 一、第一种方法&#xff1a; 首先你需要一个github账号&#xff0c;所有还没有的话先去注册吧&#xff01; https://github.com/ 我们使用git需要先安装git工具&#xff0c;这里给出下载地址&#xff0…

.NET中栈和堆的比较1

原文出处&#xff1a; http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx 尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection)&#xff0c;但是我们还是应该了解它们&#xff0c;以优化我们的…

前端学习(1):HTML和CSS导学

最近为什么捡起前端&#xff0c;主要工作太忙&#xff0c;有时间就会抓一下后端&#xff0c;前端是我以前啃得比较多的 再来一次呢&#xff0c;工作在忙也不能停止学习勒 第一部分 第二部分 第三部分 第四部分 如何学习

Spring Boot----Dubbo原理分析

环境&#xff1a;需要创建一个dubbo.xml 通过ImportResource()导入xml&#xff1a; 1、首先spring启动解析配置文件的每一个标签的总接口是 org.springframework.beans.factory.xml.BeanDefinitionParser 2、DubboBeanDefinitionParser是它的一个实现类&#xff0c;通过调用par…

前端学习(2):什么是html和css

什么是HTML&#xff1f; W3C&#xff1a;万维网联盟&#xff0c;是目前web技术领域最具权威和影响力的标准机构&#xff0c;目前为止&#xff0c;W3C已发布了200多项影响深远的web技术标准及实施指南。 Hypertext markup language:超文本标记语言&#xff0c;该语言书写的代码通…

基于小程序·云开发构建高考查分小程序丨实战

2019高考报名人数达到了 1031 万的新高&#xff0c;作为一名三年前参考高考的准程序猿&#xff0c;赶在高考前&#xff0c;加班加点从零开始做了一款高考查分小程序&#xff0c;算是一名老学长送给学弟学妹们的高考礼。上线仅 1 个月&#xff0c;用户数就突破了 1k&#xff0c;…

前端学习(3):vs code编辑器

下载地址 https://code.visualstudio.com 下载安装教程 变成中文 在编辑器中运行我们的网页 open in browser view in browser 选中文件----首选项----设置 常用快捷键

QuickPart应用系列

在上一篇解决方案包部署与收回篇章中&#xff0c;我只是稍微提了下QuickPart.也许刚接触这块内容的朋友&#xff0c;可能还不是很清楚&#xff0c;QuickPart具体的功能能实现什么。首先要告诉你的是QuickPart的人性化之处&#xff0c;那就是给开发人员开发webpart提供更简洁的方…

前端学习(4):chome浏览器

一、认识浏览器 浏览器是网页显示、运行的平台&#xff0c;常用的浏览器有IE、火狐&#xff08;Firefox&#xff09;、谷歌&#xff08;Chrome&#xff09;、Safari和Opera等。我们平时称为五大浏览器。IE最新版为Edge。 常用浏览器 二、浏览器市场份额 可以通过百度的统计网…

实战 IE8 开发人员工具

今天整理我收藏的漫画的时候发现 风云3 少了两集&#xff08;486、487&#xff09;&#xff0c;这对于收藏者来说基本是不可忍受的&#xff1b; 从风云一到三&#xff0c;应该一集也不能少的&#xff1b; 决定上网去找找&#xff0c;不过溜达一圈常去的分享论坛&#xff0c;由于…

前端学习(6):javascript简介

我们需要思考以下六个问题&#xff1a; 1、javaScript是什么&#xff1f; 2、javaScript的用途是什么&#xff1f; 3、javaScript和ECMAScript的关系是什么&#xff1f; 4、javaScript由哪几部分组成&#xff1f; 5、javaScript的执行原理是怎样的&#xff1f; 6、在页面…

前端学习(7):web的三大技术

HTML(5) 是一门标记型语言&#xff0c;主要由一些具备特殊含义的标签构成&#xff08;建筑物结构&#xff09; 所谓HTML是“超文本标记语言”的英文缩写。我们上网所看到网页&#xff0c;多数都是由HTML写成的。“超文本”是指页面内可以包含图片、链接&#xff0c;甚至音乐、…

scala的foreach和for

一句印象深刻的话&#xff0c;Alan Kay&#xff08;Smalltalk发明者&#xff09;说得一句话&#xff1a;“I’m not against types, but I dont know of any typesystems that arent a complete pain, so I still like dynamic typing”。 并不是静态类型不好&#xff0c;只是静…

前端学习(8):HTML的基本属性和结构

一、HTML文档结构 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>css样式优先级</title> </head> <body> </body> </html> <!DOCTYPE html>声明为HTML5文…

借助云开发轻松实现后台数据批量导出丨实战

小程序导出数据到excel表&#xff0c;借助云开发后台实现excel数据的保存 我们在开发小程序的过程中&#xff0c;可能会有这样的需求&#xff1a;如何将云数据库里的数据批量导出到excel表里&#xff1f; 这个需求可以用强大的云开发轻松实现&#xff01; 这里需要用到云函数&a…

Storm的ack机制在项目应用中的坑

正在学习storm的大兄弟们&#xff0c;我又来传道授业解惑了&#xff0c;是不是觉得自己会用ack了。好吧&#xff0c;那就让我开始啪啪打你们脸吧。 先说一下ACK机制&#xff1a; 为了保证数据能正确的被处理, 对于spout产生的每一个tuple, storm都会进行跟踪。 这里面涉及到ac…

云开发数据库VS传统数据库丨云开发101

云开发数据库与传统数据库的不同 在小程序云开发中&#xff0c;最核心的便是三大组件&#xff1a;数据库、云存储和云函数&#xff0c;从今天开始&#xff0c;我们将开始隔日更的专栏文章&#xff0c;云开发101&#xff0c;在第一周&#xff0c;我们将从最最核心的数据库开始说…

前端学习(10):HTML语义化

我理解的HTML语义化 经过查看别人博文中的一些描述&#xff0c;我将HTML的语义化总结为&#xff1a; 用最恰当的标签来标记内容。 该如何理解呢&#xff1f;比如需要加入一个标题&#xff0c;这个标题的字体比正文的要大写&#xff0c;还要加粗。能够实现这种效果的方法有很多…

博客中gitalk最新评论的获取 github api使用

博客中&#xff0c;对于网友的评论以及每篇文章的评论数还是很重要的。但是基于静态的页面想要存储动态的评论数据是比较难的&#xff0c;一般博客主题中都内置了评论插件&#xff0c;但是博客主题中对于最新评论的支持显示还是很少的&#xff0c;至少目前我是没怎么发现。博客…