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属性值

  

JSP基础--javaBean的更多相关文章

  1. Servlet&jsp基础:第五部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. JavaEE系列之(一)JSP基础知识详解

    一.JSP基础语法     1.JSP简介        JSP(Java Server Pages),其根本是一个简化的Servlet设计,它实现了在Java中使用HTML标签.JSP是一种动态网页 ...

  3. 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)

    在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...

  4. JavaWeb基础-Jsp基础语法

    jsp基础语法 JSP的组成 静态内容.指令.表达式.小脚本.声明.注释 JSP的生命周期 用户发出index.jsp ,服务端判断是否是第一次请求,若是第一次请求,则tomcat中的JSP引擎中的文 ...

  5. java jsp基础介绍

    1         Jsp基础 1.1           Jsp介绍 JSP(全称Java Server Pages)是一种web动态网页开发技术,通过标签和指令完成用户界面开发和交互操作.它使用J ...

  6. jsp基础、el技术、jstl标签、javaEE的开发模式

    一.jsp技术基础 1.jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%=java变量或表达式> ...

  7. jsp 以及javabean内省技术

    l JSP l JavaBean及内省 l EL表达式 1.1 上次课内容回顾 会话技术: Cookie:客户端技术.将数据保存在客户端浏览器上.Cookie是有大小和个数的限制. Session:服 ...

  8. JSP+Servlet+javabean+oracle实现页面多条件模糊查询

    之前写过一篇JSP+Servlet+javabean+mysql实现页面多条件模糊查询 使用的是mysql进行的分页查询,mysql用limit控制,而oracle则是用rownum,今天第一次写or ...

  9. jsp学习---使用jsp和JavaBean实现超简单网页计算器

    一.需求 如题,用jsp实现一个超简单的网页计算器. 二.实现 1.效果图 1)初始界面: 2)随便输入两个数进行相乘: 3)当除数为零时提示报错: 2.代码 Calculator.java pack ...

随机推荐

  1. Add JWT Bearer Authorization to Swagger and ASP.NET Core

    Add JWT Bearer Authorization to Swagger and ASP.NET Core     If you have an ASP.NET Core web applica ...

  2. day02-css

    技术分析 HTML的块标签: div标签: 默认占一行,自动换行 span标签: 内容显示在同一行 CSS概述: Cascading Style Sheets : 层叠样式表 主要用作用: 用来美化我 ...

  3. Jupyter Notebook 安装与使用

    Ref: https://jupyter.org/install Installing Jupyter Notebook with pip python -m pip install --upgrad ...

  4. LA 3263 That Nice Euler Circuit(欧拉定理)

    That Nice Euler Circuit Little Joey invented a scrabble machine that he called Euler, after the grea ...

  5. alert(1) to win 14

    <!--<script></script>之间的内容会被当作js处理,所以,//we'll use this later </script>被注释了.最终 i ...

  6. [python 学习] IO操作之读写文件

    一.读取全部文件: # -*- coding: utf-8 -*- f = open('qq_url.txt','r'); print f.read(); f.close(); 二.读取规定长度文件 ...

  7. Sublime-Text macOS 编译运行armadillo

    { "cmd" : ["g++ -std=c++14 -Wall -larmadillo -framework Accelerate ${file_name} -o ${ ...

  8. fast

    # connect timeout in seconds# default value is 30sconnect_timeout=30 # network timeout in seconds# d ...

  9. js事件循环机制

    本文参考链接:https://www.jianshu.com/p/cf47bc0bf2ab 一.先搞懂两个东西:堆和栈 栈由操作系统自动分配释放,用于存放函数的参数值.局部变量等一些基本的数据类型,其 ...

  10. linux运维、架构之路-keepalived高可用

    一.Keepalived介绍          Keepalived起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能,Ke ...