当前位置 : 主页 > 编程语言 > java >

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

来源:互联网 收集:自由互联 发布时间:2023-01-30
目录 1、字符编码问题解决方案 1.1、字符编码处理的实现 2、字符和谐的问题 在过滤器中设置脏数据 在处理完字符编码问题的时候进行和谐(在处理完编码之后进行调用) 3、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组件的资料请关注自由互联其它相关文章!

              上一篇:Spring注解驱动之ApplicationListener用法解读
              下一篇:没有了
              网友评论