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属性值
JSP基础--javaBean的更多相关文章
- Servlet&jsp基础:第五部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- JavaEE系列之(一)JSP基础知识详解
一.JSP基础语法 1.JSP简介 JSP(Java Server Pages),其根本是一个简化的Servlet设计,它实现了在Java中使用HTML标签.JSP是一种动态网页 ...
- 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)
在DRP中终于接触到了MVC,感触是确实这样的架构系统灵活性不少,现在感触最深的就是使用tomcat作为服务器发布比IIS好多了,起码发布很简单,使用起来方便. 首先来简单的学习一下MVC的基础知识, ...
- JavaWeb基础-Jsp基础语法
jsp基础语法 JSP的组成 静态内容.指令.表达式.小脚本.声明.注释 JSP的生命周期 用户发出index.jsp ,服务端判断是否是第一次请求,若是第一次请求,则tomcat中的JSP引擎中的文 ...
- java jsp基础介绍
1 Jsp基础 1.1 Jsp介绍 JSP(全称Java Server Pages)是一种web动态网页开发技术,通过标签和指令完成用户界面开发和交互操作.它使用J ...
- jsp基础、el技术、jstl标签、javaEE的开发模式
一.jsp技术基础 1.jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%=java变量或表达式> ...
- jsp 以及javabean内省技术
l JSP l JavaBean及内省 l EL表达式 1.1 上次课内容回顾 会话技术: Cookie:客户端技术.将数据保存在客户端浏览器上.Cookie是有大小和个数的限制. Session:服 ...
- JSP+Servlet+javabean+oracle实现页面多条件模糊查询
之前写过一篇JSP+Servlet+javabean+mysql实现页面多条件模糊查询 使用的是mysql进行的分页查询,mysql用limit控制,而oracle则是用rownum,今天第一次写or ...
- jsp学习---使用jsp和JavaBean实现超简单网页计算器
一.需求 如题,用jsp实现一个超简单的网页计算器. 二.实现 1.效果图 1)初始界面: 2)随便输入两个数进行相乘: 3)当除数为零时提示报错: 2.代码 Calculator.java pack ...
随机推荐
- 将地址转成blob格式(服务器下运行)
<div id="forAppend" class="demo"></div> <script> var eleAppend ...
- 媒介查询demo
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- RMAN备份与恢复 —— 参数文件还原
在RMAN用语中,“还原”与“恢复”具有不同的含义,还原(restore)是指访问先前生成的备份集,从中得到一个或多个对象,然后再磁盘上的某个位置还原这些对象.还原与恢复时分离的.恢复(re ...
- C# Xml.Serialization 节点重命名
XmlElement 节点重命名 XmlRoot 根节点重名称 XmlArray List集合添加根节点 XmlArrayItem List集合中子节点重命名 [Serializable] 将该类标记 ...
- 处理键盘事件 禁止后退键(Backspace)密码或单行、多行文本框除外
//处理键盘事件 禁止后退键(Backspace)密码或单行.多行文本框除外 function forbidBackSpace(e) { var ev = e || window.event; //获 ...
- .NET Core _linux sdk安装
根据官方介绍页面的步骤: 步骤1. sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/do ...
- AOP记录日志
1.自定义注解 @Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上 @Retention(RetentionPolicy.RUNTIME) ...
- ubuntu下载地址
http://mirrors.aliyun.com/ubuntu-releases/16.04/
- uboot中Kconfig架构的理解
1./u-boot-2019.07/Kconfig 是顶层Kconfig mainmenu "U-Boot $UBOOTVERSION Configuration" #这是总me ...
- ThreadPoolExecutor线程池原理
参考: https://www.cnblogs.com/liuzhihu/p/8177371.html