zoukankan      html  css  js  c++  java
  • JavaBean和内省

    JavaBean和内省
    JavaBean是一个遵循特定的写法的java类
        1. 必须有一个无参的构造方法
        2.属性私有化
        3.私有你给的属性必须通过public类型的方法暴露给其他程序,并且方法的命名也必须遵守一定的命名规范。
     
    访问JavaBean属性的两种方式
    1.直接调用bean的setXXX或getXXX
    2.通过内省技术访问(java bean包提供了内省的API)
       * 内省技术是基于反射技术的
       *通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后通过反射机制来调用这些方法。
        public class User(0
        {
        private String username;
        private String password;
        public void setUsername(){}   
        }
     < jsp:useBean id="user" class ="vo.user"></ jsp:useBean>
     < jsp:setProperty property ="name" name="user"/>
      < jsp:setProperty property ="password" name="user"/>
      < jsp:getProperty property ="name" name="user" />
        <jsp:getProperty property ="password" name="user" />
     
     
     
     
    自己写的使用内省的方式反射用户信息 javabean格式的用户信息
     
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
                // 获取输入的数据
               Map<String, String[]> map = request.getParameterMap();
               user usr = new user();
                try {
                    populate(map, usr);
               } catch (Exception e) {
                    e.printStackTrace();
               }
               response.getWriter().write(usr.getName());
               response.getWriter().write(usr.getPassword());
         }
     
          /**
          * 封装完整的数据 通过内省的方式封装数据
          *
          * @param map
          * @param usr
          * @throws IntrospectionException
          * @throws IllegalArgumentException
          * @throws IllegalAccessException
          * @throws InvocationTargetException
          */
          private void populate(Map<String, String[]> map, user usr)
                     throws IntrospectionException, IllegalArgumentException,
                    IllegalAccessException, InvocationTargetException {
                // 获取类的信息
               BeanInfo info = Introspector.getBeanInfo(usr.getClass());
                // 获取属性列表
               PropertyDescriptor[] pds = info.getPropertyDescriptors();
                for (PropertyDescriptor pd : pds) {
                     // 获取到属性名称
                    String name = pd.getName();
                     if (map.containsKey(name)) {
                          // 获取属性写的方法
                         Method m = pd.getWriteMethod();
                         m.invoke(usr, map.get(name)[0]);
                    }
               }
         }
     
     
    使用javabean的jar包如下:
     
     
     
     
    /**
     * 使用BeanUtils操作
     *
     * @author sunyb
     *
     */
    public class userBeanUtilServlet extends HttpServlet {
     
          public void doGet(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
                // 获取请求参数
               Map<String, String[]> map = request.getParameterMap();
                // 对象实例化
               user usr = new user();
     
                // 完成注册
               ConvertUtils. register((Converter) new MyDateConverter(), Date.class );
     
                // 完成封装
                try {
                    BeanUtils. populate(usr, map);
               } catch (Exception e) {
                    e.printStackTrace();
               }
               response.getWriter().write(usr.getName());
               response.getWriter().write(usr.getPassword());
         }
     
          public void doPost(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
     
               doGet(request, response);
     
         }
     
    }
     
     
     
     
    但是如果有日期时还要自己封闭一个 DateConvert处理类来用于javaBeanUtils注册当遇到 有日期格式的数据属性时,使用自己定义的类来处理
     
     
    自己的类要实现接口
    Converter
     
     
     
    package utils;
     
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
     
    import com.sun.org.apache.commons.beanutils.Converter;
     
    public class MyDateConverter implements Converter {
     
          @Override
          public Object convert (Class clazz, Object obj) {
                // 把传入对象转换成日期,返回
               String sDate = (String) obj;
               SimpleDateFormat sdf = new SimpleDateFormat();
               Date date = new Date();
                try {
                    date = (Date) sdf.parse(sDate);
               } catch (ParseException e) {
                     // TODO Auto-generated catch block
                    e.printStackTrace();
               }
                return date;
         }
     
    }
     
     
  • 相关阅读:
    ansible
    celery 计划任务使用
    11 session 使用
    10 模版继承和页面之间的调用
    9 模版语言 jinja2
    8 公共函数
    7 文件上传
    6 获取请求头和URL信息
    5 获取Form表单取值
    4 文件操作 支持图片 视频 mp3 文本等
  • 原文地址:https://www.cnblogs.com/haofaner/p/5632099.html
Copyright © 2011-2022 走看看