字符编码的处理和BeanUtils组件使用详解

目录
  • 1、字符编码问题解决方案
    • 1.1、字符编码处理的实现
  • 2、字符和谐的问题
    • 在过滤器中设置脏数据
    • 在处理完字符编码问题的时候进行和谐(在处理完编码之后进行调用)
  • 3、BeanUtils组件的使用
    • Beanutils组件是啥?
    • BeanUtils组件能干啥?
    • BeanUtils组件的使用?
      • 使用BeanUtils组件的API
  • 4、Servlet请求参数的自动封装
  • 5、源数据使用
    • 5.1、数据库的元数据的使用
    • 5.2、请求参数的元数据
    • 5.3、结果集元数据
    • 5.4、封装一个通用的JDBC的增删改的方法
    • 5.5、封装一个根据条件查询返回集合的方法

1、字符编码问题解决方案

原理:过滤器技术拦截所有的controll的请求、在controll请求中使用了动态代理的设计模式监听了HttpServletRequest这个接口中getParameter方法的执行、在getParameter执行的时候、我们首先去获取这个数据、再通过判断当前的请求是GET还是POST、如果是GET那么先使用IOS-8859-1进行转码 然后使用UTF-8从新进行编码、如果是POST那么直接使用request.setCharacterEncoding(“UTF-8”)来进行处理

1.1、字符编码处理的实现

      public class CharacterFilter implements Filter{
@Override
public void init(FilterConfig arg0) throws ServletException {
}
    /**
     * 拦截的这个方法
     */
@Override
public void doFilter(ServletRequest request, ServletResponse response,
final FilterChain chain) throws IOException, ServletException {
    final HttpServletRequest req=(HttpServletRequest) request;
    final HttpServletResponse resp=(HttpServletResponse) response;
    //第一步:将返回数据的编码问题给处理了
    resp.setContentType("text/html;charset=utf-8");
    //POST的解决方案
    req.setCharacterEncoding("UTF-8");
    //第二步:监听httpServletRequest中 getParameter方法的执行
    HttpServletRequest req1= (HttpServletRequest) Proxy.newProxyInstance(HttpServletRequest.class.getClassLoader(),
     new Class[]{HttpServletRequest.class},
     new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
   //监听当前执行的方法是不是 getParameter
   String methodName=method.getName();
   if("getParameter".equals(methodName)){ //说明执行的是getParameter
  //判断当前执行的是POST呢?还是GET呢?
  String reqName=req.getMethod();
  //通过key获取这个值
  String val= (String) method.invoke(req, args);
  if("GET".equalsIgnoreCase(reqName)){ //说明是GET方法
  //执行这个方法获取这个值
  val=new String(val.getBytes("ISO-8859-1"),"UTF-8");
  }else if("POST".equalsIgnoreCase(reqName)){ //说明是POST方法
  }
  //返回这个方法执行的结果
  return val;
   }else{
  return  method.invoke(req, args);
   }
   }
});
   //最终要进行放行
   chain.doFilter(req1, resp);
}
@Override
public void destroy() {
}
}

2、字符和谐的问题

明白一个问题:什么是字符和谐:类似于博客网站上行 比如你骂人了一句话这句话并不会直接显示出来、而是显示成****等这种现象就称为字符的和谐

要实现字符和谐首先要解决编码问题(上面已经解决了)

在过滤器中设置脏数据

    //需要和谐的脏数据
private String[] dirtyData={"MMD","NND","杀人","CTM"};

在处理完字符编码问题的时候进行和谐(在处理完编码之后进行调用)

     protected String handleDirtyData(String val) {
for (int i = 0; i < dirtyData.length; i++) {
if(val.contains(dirtyData[i])){
val=val.replaceAll(dirtyData[i],"***");
}
}
return val;
}

3、BeanUtils组件的使用

Beanutils组件是啥?

Beanutils不是一个框架、就相当于是一个帮助类、这个帮助类的作用就是专门用来操作我们java Bean

BeanUtils组件能干啥?

能够将一个实体的值赋值给另外一个实体、也可以将map类型的值赋值给实体、也可以将实体进行拷贝

BeanUtils组件的使用?

导入beanUtils的包

使用BeanUtils组件的API

public void testbeanUtils() throws Exception {
User user=new User(1,"小波波","123");
//使用BeanUtils来操作这个是实体
//API:表示的是给那个对象的那个属性设置什么值
//BeanUtils.setProperty(user,"uName","小波波");
//BeanUtils.copyProperty(user,"uPwd","123");
//API:拷贝一个实体 返回值就是copy生成的新的实体
//User user2=(User) BeanUtils.cloneBean(user);
User user2=new User();
//把一个实体里面的属性copy给另外一个实体的属性
//BeanUtils.copyProperties(user2, user);
//将实体转换成map
//Map<Object,Object> maps=BeanUtils.describe(user);
//获取实体的属性值 并转换成String类型的数组
//String[] strVal=BeanUtils.getArrayProperty(user,"uName");
//将Map中的数据直接赋值给JAVA的对象
Map<String,Object> maps=new HashMap<String, Object>();
maps.put("uId",123);
maps.put("uName","小波波");
maps.put("uPwd","110");
//将map中的数据直接赋值给JAVA对象
BeanUtils.populate(user2, maps);
System.out.println(user2);
}

4、Servlet请求参数的自动封装

public static<T> T getObject(HttpServletRequest request,Class clazz) throws Exception{
//反射得到这个数据类型
T t=(T) clazz.newInstance();
//使用beanUtils组件来设置这个值
BeanUtils.populate(t,request.getParameterMap());
return t;
 }

5、源数据使用

源数据分类:数据库的源数据 、请求参数的元数据、结果集的元数据

数据库的元数据:能够获取当前访问数据库的一些信息(数据库的名字、连接的URL、连接的用户名、数据库的版本信息)

请求参数的元数据:能够精确的知道当前的SQL语句中有多少个占位符

结果集元数据:就能清楚的知道当前访问的这个数据库的列名是什么

5.1、数据库的元数据的使用

     public void testDatabaseMetaData() throws Exception {
//第一步:加载驱动
Class.forName("com.mysql.jdbc.Driver");
//第二步:创建连接
Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
//获取数据库的元数据
DatabaseMetaData data=conn.getMetaData();
//获取数据库的相关信息
System.out.println("数据库的名字:"+data.getDatabaseProductName());
System.out.println("数据库的版本:"+data.getDatabaseProductVersion());
System.out.println("数据库的URL:"+data.getURL());
System.out.println("访问的用户名:"+data.getUserName());
System.out.println("---------------------------------------");
//第三步:创建操作数据库的对象
PreparedStatement state=conn.prepareStatement("select * from msgstateinfo");
//第四步:操作
ResultSet set=state.executeQuery();
//遍历....
while (set.next()) {
String str=set.getString("msgstate");
System.out.println("获取到的数据是:"+str);
}
conn.close();
}

5.2、请求参数的元数据

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void testRequestParameMetaData() throws Exception {
//第一步:加载驱动
Class.forName("com.mysql.jdbc.Driver");
//第二步:创建连接
Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("---------------------------------------");
//第三步:创建操作数据库的对象
PreparedStatement state=conn.prepareStatement("select * from msgstateinfo where id &lt; ? and msgobj = ? and aa=?");
//第四步:玩下请求参数的元数据
ParameterMetaData data=state.getParameterMetaData();
//现在你就可以知道当前的SQL语句中有多少个占位符了
System.out.println("占位符的个数:"+data.getParameterCount());
conn.close();
}

5.3、结果集元数据

    public void testResultSetMetaData() throws Exception {
//第一步:加载驱动
Class.forName("com.mysql.jdbc.Driver");
//第二步:创建连接
Connection conn= DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println("---------------------------------------");
//第三步:创建操作数据库的对象
PreparedStatement state=conn.prepareStatement("select * from t_user");
ResultSet set=state.executeQuery();
//下面就可以获取结果集的元数据了
ResultSetMetaData resultSetMetaData=set.getMetaData();
while (set.next()) {   //相当于是遍历的是行
//我们还可以遍历列
int columnNum=resultSetMetaData.getColumnCount();
//通过列的下标来知道列的名字
for (int i = 0; i < columnNum; i++) {
//通过列的下标来找到列的名字
String columnName=resultSetMetaData.getColumnName(i+1);
//知道了列的名字也就能找到这个列的值了
Object val=set.getObject(columnName);
System.out.println(val);
}
}
conn.close();
}

5.4、封装一个通用的JDBC的增删改的方法

    public void update(String sql, Object... parames) throws Exception {
// 获取连接
Connection conn = getConnection();
// 第二步:获取操作数据库的对象
PreparedStatement state = conn.prepareStatement(sql);
// 第三步:将传递过来的参数直接赋值给占位符
// 获取占位符的个数
ParameterMetaData parameterMetaData = state.getParameterMetaData();
// 获取占位符的个数
int num = parameterMetaData.getParameterCount();
if (parames.length < num) {
throw new RuntimeException("参数不对应没法玩....");
}
// 说明参数是对的
for (int i = 0; i < num; i++) {
// 设置参数了
state.setObject(i + 1, parames[i]);
}
// 执行这个SQL语句
state.executeUpdate();
close();
}

5.5、封装一个根据条件查询返回集合的方法

public <T> List<T> findAll(String sql, Class<T> clazz,Object...parames) throws Exception {
//确定返回的这个容器
        List<T> lists=new ArrayList<T>();
// 获取连接
Connection conn = getConnection();
// 第二步:获取操作数据库的对象
PreparedStatement state = conn.prepareStatement(sql);
// 第三步:将传递过来的参数直接赋值给占位符
// 获取占位符的个数
ParameterMetaData parameterMetaData = state.getParameterMetaData();
// 获取占位符的个数
int num = parameterMetaData.getParameterCount();
if (parames.length < num) {
throw new RuntimeException("参数不对应没法玩....");
}
//判断:假设这个SQL语句根本就没有占位符呢?
if(num!=0){   //说明有占位符
// 说明参数是对的
for (int i = 0; i < num; i++) {
// 设置参数了
state.setObject(i + 1, parames[i]);
}
}
// 执行这个SQL语句
ResultSet set=state.executeQuery();
//下面移动游标遍历这个行
//获取这个列的数量
ResultSetMetaData metadata=set.getMetaData();
//可以获取这个列的数量
int columnCount=metadata.getColumnCount();
while (set.next()) {
T t=clazz.newInstance();
//遍历每一个列
for (int i = 0; i <columnCount; i++) {
//获取每一个列的列名
String columnName=metadata.getColumnName(i+1);
//获取这个列的值
Object columnVal= set.getObject(columnName);
//把上面的属性和值 放到这个JAVA对象中去
BeanUtils.copyProperty(t, columnName, columnVal);
}
//将t放到List集合中去
lists.add(t);
}
close();
return lists;
}
``` 

以上就是字符编码的处理和BeanUtils组件的使用的详细内容,更多关于字符编码处理BeanUtils组件的资料请关注我们其它相关文章!

(0)

相关推荐

  • java开发BeanUtils类解决实体对象间赋值

    实体对象之间相互传值,如:VO对象的值赋给Entity对象,是代码中常用功能,如果通过get.set相互赋值,则很麻烦,借助工具类BeanUtils可以轻松地完成操作. BeanUtils依赖包导入 BeanUtils 是 Apache commons组件的成员之一,主要用于简化JavaBean封装数据的操作.使用BeanUtils必须导入相应的jar包,BeanUtils的maven坐标为 <dependency> <groupId>commons-beanutils</g

  • BeanUtils.copyProperties复制对象结果为空的原因分析

    目录 BeanUtils.copyProperties复制对象结果为空原因 正确的包 错误的包 两个类的区别 BeanUtils.copyProperties拷贝没成功的坑,记录解决原因 具体如下 BeanUtils.copyProperties复制对象结果为空原因 细心比对,发现原来是导错了包导致的 正确的包 import org.springframework.beans.BeanUtils; 错误的包 import org.apache.commons.beanutils.BeanUtil

  • springboot全局字符编码设置解决乱码问题

    有时候我们会发现这种问题,明明已经设置了字符编码过滤器但是还会有乱码的情况出现,这个问题令我们很是头疼,我之前也遇到过这种情况.那怎么解决呢? springboot编码格式设置有三种方式,不管使用哪种方式,总有一款适合你. 1.在application.properties中设置 #编码格式 spring.http.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true se

  • Spring深入分析讲解BeanUtils的实现

    目录 背景 DO BO DTO VO 数据实体转换 使用方式 原理&源码分析 属性赋值类型擦除 总结 背景 DO DO是Data Object的简写,叫做数据实体,既然是数据实体,那么也就是和存储层打交道的实体类,应用从存储层拿到的数据是以行为单位的数据,不具备java特性,那么如果要和java属性结合起来或者说在业务中流转,那么一定要转换成java对象(反过来java要和持久层打交道也要把java对象转换成行数据),那么就需要DO作为行数据的一个载体,把行的每一个列属性映射到java对象的每一

  • 详解Spring中BeanUtils工具类的使用

    目录 简介 Spring的BeanUtils方法 Spring的BeanUtils与Apache的BeanUtils区别 实例 简介 说明 本文介绍Spring的BeanUtils工具类的用法. 我们经常需要将不同的两个对象实例进行属性复制,比如将DO对象进行属性复制到DTO,这种转换最原始的方式就是手动编写大量的 get/set代码,很繁琐.为了解决这一痛点,就诞生了一些方便的类库,常用的有 Apache的 BeanUtils,Spring的 BeanUtils, Dozer,Orika等拷贝

  • springmvc字符编码过滤器CharacterEncodingFilter的使用

    字符编码过滤器CharacterEncodingFilter 一.在web.xml中的配置 <!-- characterEncodingFilter字符编码过滤器 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter

  • 字符编码的处理和BeanUtils组件使用详解

    目录 1.字符编码问题解决方案 1.1.字符编码处理的实现 2.字符和谐的问题 在过滤器中设置脏数据 在处理完字符编码问题的时候进行和谐(在处理完编码之后进行调用) 3.BeanUtils组件的使用 Beanutils组件是啥? BeanUtils组件能干啥? BeanUtils组件的使用? 使用BeanUtils组件的API 4.Servlet请求参数的自动封装 5.源数据使用 5.1.数据库的元数据的使用 5.2.请求参数的元数据 5.3.结果集元数据 5.4.封装一个通用的JDBC的增删改

  • BootStrap实现树形目录组件代码详解

    需求描述 产品添加页面,需要选择车型.在bootStrap的modal上弹出子modal来使用. 车型一共有4级目录.要使用目录树. 然后分活动和商品两种,需要能够通过不通参数来调用该组件. 车型品牌要使用字母导航. 技术实现 数据都是后端传json过来,我们ajax获取然后操作. 由于车型总数据有几万条以上,不可能一次性请求过来.这里我们使用异步的方式,每点击一次目录节点,加载它的下一级. 这里我们用两个参数来控制活动和商品的不同加载._showPrice和opened 后端传过来的第一级数据

  • Java编程swing组件JLabel详解以及使用示例

    JLabel 对象可以显示文本.图像或同时显示二者.可以通过设置垂直和水平对齐方式,指定标签显示区中标签内容在何处对齐.默认情况下,标签在其显示区内垂直居中对齐.默认情况下,只显示文本的标签是开始边对齐:而只显示图像的标签则水平居中对齐. 还可以指定文本相对于图像的位置.默认情况下,文本位于图像的结尾边上,文本和图像都垂直对齐. 构造方法介绍: JLabel() 创建无图像并且其标题为空字符串的 JLabel. JLabel(Icon image) 创建具有指定图像的 JLabel 实例. JL

  • Vue的事件响应式进度条组件实例详解

    写在前面 找了很多vue进度条组件,都不包含拖拽和点击事件,input range倒是原生包含input和change事件,但是直接基于input range做进度条的话,样式部分需要做大量调整和兼容性处理.即使做好了,将来需要修改外观,又是一番折腾. 基于以上两个原因,做了一个可以响应input和change事件(即一个是拖动进度条到某处,一个是在进度条某位置点击使其值变为该位置)的div实现的Vue组件,这样既满足了对进度条事件的需求,也带来了如有需求变动,样式修改很方便的好处. 效果图 以

  • 对Python中TKinter模块中的Label组件实例详解

    Python2.7.4 OS-W7x86 1. 简介 Label用于在指定的窗口中显示文本和图像.最终呈现出的Label是由背景和前景叠加构成的内容. Label组件定义函数:Label(master=None, cnf={}, **kw) 其中,kw参数是用来自定义lable组件的键值对. 2. 背景自定义 背景的话,有三部分构成:内容区+填充区+边框 <1>内容区参数有:width,length用于指定区域大小,如果显示前景内容是文本,则以单个字符大小为单位:如果显示的是图像,则以像素为单

  • python tkinter组件使用详解

    这篇文章主要介绍了python tkinter组件使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.按钮 # 按钮 # bg设置背景色 btn = tkinter.Button(root,text = '按钮',bg = 'red') btn.pack() # fg设置前景色(文字颜色) btn1 = tkinter.Button(root,text = '按钮',fg = 'blue') btn1.pack() # font设置字体

  • vue的toast弹窗组件实例详解

    相信普通的vue组件大家都会写, 定义 -> 引入 -> 注册 -> 使用 ,行云流水,一气呵成,但是如果我们今天是要自定义一个弹窗组件呢? 首先,我们来分析一下弹窗组件的特性(需求): 0. 轻量 --一个组件小于 1Kib (实际打包完不到0.8k) 1.一般都是多处使用 --需要解决每个页面重复引用+注册 1.一般都是跟js交互的 --无需 在 <template> 里面写 <toast :show="true" text="弹窗消息

  • Django中的forms组件实例详解

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确.如果用户输入的内容有错误就需要在页面上相应的位置显示对应的错误信息.. Django form组件就实现了上面所述的功能. 总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 先在应用目录下my_for

  • django中的ajax组件教程详解

    Ajax(Asynchronous Javascript And XML)翻译成英文就是"异步Javascript和XML".即用Javascript语言与服务器进行异步交互,传输的数据为XML,(现在使用更多的是json数据). 向服务器发送请求的途径 1.浏览器地址栏 http://www.baidu.com 默认是get请求 2.form表单发送请求: GET请求 POST请求 3.a标签 href属性 默认是get请求 4.ajax() Ajax的特点 异步交互:客户端发送一个

  • react component function组件使用详解

    目录 不可改变性 虚拟dom与真实dom 函数组件 组件复用 纯函数 组件组合--组件树 组件抽离 不可改变性 1.jsx- 2.component(function)-component(class)-components(函数组件组合)-component tree(redux)-app(项目开发) 在react中,创建了js对象(react元素)就是不可更改的(immutable).就像是用相机拍照,相当于在此时间点已经定位了时间节点,只能拍下一张照片. 例如,使用底层react写一个时钟

随机推荐