• JSP基础--javaBean


    JavaBean

    1 JavaBean概述

    1.1 什么是JavaBean

    JavaBean是一种规范,也就是对类的要求。它要求Java类的成员变量提供getter/setter方法,这样的成员变量被称之为JavaBean属性。

    JavaBean还要求类必须提供仅有的无参构造器,例如:public User() {…}

    User.java

    package cn.itcast.domain;

     

    public class User {

        private String username;

        private String password;

     

        public String getUsername() {

           return username;

        }

        public void setUsername(String username) {

           this.username = username;

        }

        public String getPassword() {

           return password;

        }

        public void setPassword(String password) {

           this.password = password;

        }

    }

    1.2 JavaBean属性

    JavaBean属性是具有getter/setter方法的成员变量。

    l  也可以只提供getter方法,这样的属性叫只读属性;

    l  也可以只提供setter方法,这样的属性叫只写属性;

    l  如果属性类型为boolean类型,那么读方法的格式可以是get或is。例如名为abc的boolean类型的属性,它的读方法可以是getAbc(),也可以是isAbc();

    JavaBean属性名要求:前两个字母要么都大写,要么都小写:

    public class User {

        private String iD;[崔1] 

        private String ID;

        private String qQ;[崔2] 

        private String QQ;

        …

    }

    JavaBean可能存在属性,但不存在这个成员变量,例如:

    public class User {

        public String getUsername() {

           return "zhangSan";

        }

    }

      上例中User类有一个名为username的只读属性!但User类并没有username这个成员变量!

    还可以并变态一点:

    public class User {

        private String hello;

       

        public String getUsername() {

           return hello;

        }

       

        public void setUsername(String username) {

           this.hello = username;

        }

    }

      上例中User类中有一个名为username的属性,它是可读可写的属性!而Use类的成员变量名为hello!也就是说JavaBean的属性名取决与方法名称,而不是成员变量的名称。但通常没有人做这么变态的事情。


     [崔1]错误的JavaBean属性

     [崔2]错误的JavaBean属性

    JavaBean
    
    javaBean的规范:
      1. 必须要有一个默认构造器
      2. 提供get/set方法,如果只有get方法,那么这个属性是只读属性!
      3. 属性:有get/set方法的成员,还可以没有成员,只有get/set方法。属性名称由get/set方法来决定!而不是成员名称!
      4. 方法名称满足一定的规范,那么它就是属性!boolean类型的属性,它的读方法可以是is开头,也可以是get开头!
    

      

    2 内省(了解)

    内省的目标是得到JavaBean属性的读、写方法的反射对象,通过反射对JavaBean属性进行操作的一组API。例如User类有名为username的JavaBean属性,通过两个Method对象(一个是getUsenrmae(),一个是setUsername())来操作User对象。

    如果你还不能理解内省是什么,那么我们通过一个问题来了解内省的作用。现在我们有一个Map,内容如下:

           Map<String,String> map = new HashMap<String,String>();

           map.put("username", "admin");

           map.put("password", "admin123");

    public class User {

        private String username;

        private String password;

     

        public User(String username, String password) {

           this.username = username;

           this.password = password;

        }

        public User() {

        }

        public String getUsername() {

           return username;

        }

        public void setUsername(String username) {

           this.username = username;

        }

        public String getPassword() {

           return password;

        }

        public void setPassword(String password) {

           this.password = password;

        }

        public String toString() {

           return "User [username=" + username + ", password=" + password + "]";

        }

    }

    现在需要把map的数据封装到一个User对象中!User类有两个JavaBean属性,一个叫username,另一个叫password。

    你可能想到的是反射,通过map的key来查找User类的Field!这么做是没有问题的,但我们要知道类的成员变量是私有的,虽然也可以通过反射去访问类的私有的成员变量,但我们也要清楚反射访问私有的东西是有“危险”的,所以还是建议通过getUsername和setUsername来访问JavaBean属性。

    2.1 内省之获取BeanInfo

    我们这里不想去对JavaBean规范做过多的介绍,所以也就不在多介绍BeanInfo的“出身”了。你只需要知道如何得到它,以及BeanInfo有什么。

    通过java.beans.Introspector的getBeanInfo()方法来获取java.beans.BeanInfo实例。

    BeanInfo beanInfo = Introspector.getBeanInfo(User.class);

    2.2 得到所有属性描述符(PropertyDescriptor)

    通过BeanInfo可以得到这个类的所有JavaBean属性的PropertyDescriptor对象。然后就可以通过PropertyDescriptor对象得到这个属性的getter/setter方法的Method对象了。

    PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();

    每个PropertyDescriptor对象对应一个JavaBean属性:

    l  String getName():获取JavaBean属性名称;

    l  Method getReadMethod:获取属性的读方法;

    l  Method getWriteMethod:获取属性的写方法。

    2.3 完成Map数据封装到User对象中

        public void fun1() throws Exception {

           Map<String,String> map = new HashMap<String,String>();

           map.put("username", "admin");

           map.put("password", "admin123");

          

           BeanInfo beanInfo = Introspector.getBeanInfo(User.class);[崔1] 

          

           PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();[崔2] 

          

           User user = new User();[崔3] 

           for(PropertyDescriptor pd : pds)[崔4]  {

               String name = pd.getName();[崔5] 

               String value = map.get(name);[崔6] 

               if(value != null)[崔7]  {

                  Method writeMethod = pd.getWriteMethod();[崔8] 

                  writeMethod.invoke(user, value);[崔9] 

               }

           }

          

           System.out.println(user);

        }

    3 commons-beanutils

    提到内省,不能不提commons-beanutils这个工具。它底层使用了内省,对内省进行了大量的简化!

    使用beanutils需要的jar包:

    l  commons-beanutils.jar;

    l  commons-logging.jar;

    3.1 设置JavaBean属性

           User user = new User();

          

           BeanUtils.setProperty(user, "username", "admin");[崔10] 

           BeanUtils.setProperty(user, "password", "admin123");[崔11] 

          

           System.out.println(user);

    3.2 获取JavaBean属性

           User user = new User("admin", "admin123");

          

           String username = BeanUtils.getProperty(user, "username");[崔12] 

           String password = BeanUtils.getProperty(user, "password");[崔13] 

          

           System.out.println("username=" + username + ", password=" + password);

    3.3 封装Map数据到JavaBean对象中

           Map<String,String> map = new HashMap<String,String>();

           map.put("username", "admin");

           map.put("password", "admin123");

          

           User user = new User();

     

           BeanUtils.populate(user, map);[崔14] 

          

           System.out.println(user);

    4 JSP与JavaBean相关的动作标签

    在JSP中与JavaBean相关的标签有:

    l  <jsp:useBean>:创建JavaBean对象;

    l  <jsp:setProperty>:设置JavaBean属性;

    l  <jsp:getProperty>:获取JavaBean属性;

    我们需要先创建一个JavaBean类:

    User.java

    package cn.itcast.domain;

     

    public class User {

        private String username;

        private String password;

     

        public User(String username, String password) {

           this.username = username;

           this.password = password;

        }

        public User() {

        }

        public String getUsername() {

           return username;

        }

        public void setUsername(String username) {

           this.username = username;

        }

        public String getPassword() {

           return password;

        }

        public void setPassword(String password) {

           this.password = password;

        }

        public String toString() {

           return "User [username=" + username + ", password=" + password + "]";

        }

    }

    4.1 <jsp:useBean>

    <jsp:useBean>标签的作用是创建JavaBean对象:

    l  在当前JSP页面创建JavaBean对象;

    l  把创建的JavaBean对象保存到域对象中;

    <jsp:useBean id="user1" class="cn.itcast.domain.User" />

    上面代码表示在当前JSP页面中创建User类型的对象,并且把它保存到page域中了。下面我们把<jsp:useBean>标签翻译成Java代码:

    <%

    cn.itcast.domain.User user1 = new cn.itcast.domain.User();

    pageContext.setAttribute("user1", user1);

    %>

    这说明我们可以在JSP页面中完成下面的操作:

    <jsp:useBean id="user1" class="cn.itcast.domain.User" />

    <%=user1 %>

    <%

        out.println(pageContext.getAttribute("user1"));

    %>

    <jsp:useBean>标签默认是把JavaBean对象保存到page域,还可以通过scope标签属性来指定保存的范围:

    <jsp:useBean id="user1" class="cn.itcast.domain.User" scope="page"/>

    <jsp:useBean id="user2" class="cn.itcast.domain.User" scope="request"/>

    <jsp:useBean id="user3" class="cn.itcast.domain.User" scope="session"/>

    <jsp:useBean id="user4" class="cn.itcast.domain.User" scope="applicatioin"/>

    <jsp:useBean>标签其实不一定会创建对象!!!其实它会先在指定范围中查找这个对象,如果对象不存在才会创建,我们需要重新对它进行翻译:

    <jsp:useBean id="user4" class="cn.itcast.domain.User" scope="applicatioin"/>

    <%

        cn.itcast.domain.User user4 = (cn.itcast.domain.User)application.getAttribute("user4");

        if(user4 == null) {

           user4 = new cn.itcast.domain.User();

           application.setAttribute("user4", user4);

        }

    %>

    4.2 <jsp:setProperty>和<jsp:getProperty>

    <jsp:setProperty>标签的作用是给JavaBean设置属性值,而<jsp:getProperty>是用来获取属性值。在使用它们之前需要先创建JavaBean:

    <jsp:useBean id="user1" class="cn.itcast.domain.User" />

    <jsp:setProperty property="username" name="user1" value="admin"/>

    <jsp:setProperty property="password" name="user1" value="admin123"/>

     

    用户名:<jsp:getProperty property="username" name="user1"/><br/>

    密 码:<jsp:getProperty property="password" name="user1"/><br/>


     [崔1]获取User类型的BeanInfo实例

     [崔2]获取User类型的所有JavaBean属性的属性描述符对象

     [崔3]创建User实例

     [崔4]循环遍历每个属性描述符对象

     [崔5]获取JavaBean属性名

     [崔6]获取Map中对应属性的值

     [崔7]如果在Map中存在这个属性的值

     [崔8]获取该属性的写方法

     [崔9]把Map中的值写入到user对象的对应属性中

     [崔10]设置user对象的username属性为admin

     [崔11]设置user对象的password属性为admin123

     [崔12]获取user对象的username属性值

     [崔13]获取user对象的password属性值

     [崔14]把map中的数据封装到user对象中,要求user的属性名要与map的key一致。

    内省:
      内省类 --> Bean信息 --> 属性描述符 --> 属性的get/set对应的Method! --- > 可以反射了!
    
    -----------------------
    
    commons-beanutils,它是依赖内省完成!
      * 导包:
        > commons-beanutils.jar
        > commons-logging.jar
    
    BeanUtils.getProperty(Object bean, String propertyName)
    BeanUtils.setProperty(Object bean, String propertyName, String propertyValue)
    BeanUtils.populate(Map map, Object bean)
    
    CommontUtils.toBean(Map map, Class class)
    
    -----------------------
    
    jsp中与javaBean相关的标签!
    
    * <jsp:useBean> --> 创建或查询bean
      * <jsp:useBean id="user1" class="cn.itcast.domain.User" scope="session"/> 在session域中查找名为user1的bean,如果不存在,创建之
      * <jsp:useBean id="user1" class="cn.itcast.domain.User" scope="session"/>
    * <jsp:setProperty>
      * <jsp:setProperty property="username" name="user1" value="admin"/> 设置名为user1的这个javabean的username属性值为admin
    * <jsp:getProperty>
      * <jsp:getProperty property="username" name="user1"/> 获取名为user1的javabean的名为username属性值
    

      

  • 相关阅读:
    团队项目——技术规格说明书
    Scrum Meeting 11.1
    Scrum Meeting 10.31
    Scrum Meeting 10.30
    Scrum Meeting 10.29
    Scrum Meeting 10.28
    Scrum Meeting 10.27
    Scrum Meeting 10.26
    团队作业Week5
    Boost C++: 数据结构---tuple
  • 原文地址:https://www.cnblogs.com/eadela/p/11327701.html
Copyright © 2020-2023  润新知