<jsp:useBean>标签

  会调用java对象的无参构造方法,来创建实例。

   <jsp:useBean>标签是用来搭配JavaBean元件的标准标签,这里指的JavaBean是满足以下条件的Java对象:
     1、必须实现java.io.Serializable接口
     2、具有无参数的构造器
     3、没有公开(public)的类变量
     4、具有公开的设值方法(Setter)与取值方法(Getter)
   但是在实际的测试中没有实现序列化接口也没有问题。

Demo:

package com.test;

public class AddServiceImpl {
public String add() {
return "1 + 2 = 5";
}
}

Java Code

<%@page contentType="text/html" pageEncoding="UTF-8" %>
<jsp:useBean id="addService" class="com.test.AddServiceImpl"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<p><%= addService.add()%></p>
</body>
</html>

index.jsp

测试地址:http://127.0.0.1/index.jsp

运行结果:1 + 2 = 5

查看转译后的servlet源码有如下内容:

      com.test.AddServiceImpl addService = null;
addService = (com.test.AddServiceImpl) _jspx_page_context.getAttribute("addService", javax.servlet.jsp.PageContext.PAGE_SCOPE);
if (addService == null){
addService = new com.test.AddServiceImpl();
_jspx_page_context.setAttribute("addService", addService, javax.servlet.jsp.PageContext.PAGE_SCOPE);
} out.print( addService.add());

index_jsp.java

源码分析

  使用<jsp:useBean id="addService" class="com.test.AddServiceImpl"/>声明一个java对象后,servlet会去pageContext域里根据指定的id值去寻找这个java对象,如果找不到,使用无参的构造方法创建并且再把它设置到pageContext作用域里。
  接着就可以使用设定的id值或者说pageContext域的key——addService来直接使用这个对象。

  使用<jsp:useBean>时,还可以指定scope属性,可以指定的值有page(默认)、request、session与application。这样就先会到指定属性范围中寻找该实例,如果找到就直接使用;找不到也不会到其它作用域里去找,而是创建一个新对象并放入到指定的指定的作用域里。

  使用<jsp:useBean>时,还可以指定type属性。type属性的设置可以是一个抽象类,也可以是一个接口。如果只设置type而没有设置class属性,则必须确定在某个属性范围中已经存在所要的对象,否则会发生InstantiationException异常。比如:

<jsp:useBean id="user" type="com.test.UserBase" class="com.test.User" scope="session"/>

这样产生的 Servlet 中,將會有以下的片段:

    com.test.UserBase user = null;
synchronized (session) {
user = (com.test.UserBase) _jspx_page_context.getAttribute("user", javax.servlet.jsp.PageContext.SESSION_SCOPE);
if (user == null){
user = new com.test.User();
_jspx_page_context.setAttribute("user", user, javax.servlet.jsp.PageContext.SESSION_SCOPE);
}
}

 <jsp:setProperty>标签

  会调用java对象public的setter方法。

  1、获取客户端参数

Demo

package com.test;

public class User {

    private String name;

    private String age;

    public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}

Java Code

<%@page contentType="text/html" pageEncoding="UTF-8" %>
<jsp:useBean id="user" class="com.test.User"/>
<jsp:setProperty name="user" param="name" property="name"></jsp:setProperty>
<jsp:setProperty name="user" param="age" property="age"></jsp:setProperty>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<p>
姓名:<jsp:getProperty name="user" property="name"/><br>
年龄:<jsp:getProperty name="user" property="age"/>
</p>
</body>
</html>

index.jsp

测试地址:http://127.0.0.1/index.jsp?name=zs&age=18

响应结果:

姓名:zs
年龄:18

如果是获取客户端参数,有三种写法:

写法一:
  <jsp:setProperty name="user" param="name" property="name"></jsp:setProperty>
  <jsp:setProperty name="user" param="age" property="age"></jsp:setProperty>

写法二:
  <jsp:setProperty name="user" property="name"></jsp:setProperty>
  <jsp:setProperty name="user" property="age"></jsp:setProperty>
  如果不指定请求参数名称,JSP的自省机制会判断是否有相同名称的请求参数,有的话就找出并调用对应的setter方法。

写法三:
  <jsp:setProperty name="user" property="*"></jsp:setProperty>
  在property属性设置为“*”时,表示将自动寻找请求参数,如果请求参数名称为xxx,就将请求参数值使用setXxx()方法。

  自省机制可以自动转换请求参数字符串为对应属性的基本类型。

  2、直接赋值

  比如:<jsp:setProperty name="user" property="password" value="123456"/>

  3、<jsp:setProperty>的name属性说明

  在产生的Servlet代码中,会使用PageContext的findAttribute(),依次从page、request、session、application中查找看看有无name指定的属性名称,找到的话,再通过反射机制找出JavaBean上的setXxx()方法并执行。


<jsp:getProperty>标签

  <jsp:getProperty>基本上就只有一种用法:<jsp:getProperty name="user" property="name"/>。
  这会通过PageContext的findAttribute()从page、request、session、application中依序查找user属性,并通过getName()方法取得值。


两种不两只的写法

一、在使用<jsp:useBean>时可以一并设置属性值

<jsp:useBean id="user" class="com.test.User" scope="session">
<jsp:setProperty name="user" property="*" />
</jsp:useBean>

这样转译后产生以下代码:  

    synchronized (session) {
user = (com.test.User) _jspx_page_context.getAttribute("user", javax.servlet.jsp.PageContext.SESSION_SCOPE);
if (user == null){
user = new com.test.User();
_jspx_page_context.setAttribute("user", user, javax.servlet.jsp.PageContext.SESSION_SCOPE);
org.apache.jasper.runtime.JspRuntimeLibrary.introspect(_jspx_page_context.findAttribute("user"), request);
}
}

二、分别编写

<jsp:useBean id="user" class="com.test.User" scope="session"/>
<jsp:setProperty name="user" property="*" />

这样转译后产生以下代码:

    synchronized (session) {
user = (com.test.User) _jspx_page_context.getAttribute("user", javax.servlet.jsp.PageContext.SESSION_SCOPE);
if (user == null){
user = new com.test.User();
_jspx_page_context.setAttribute("user", user, javax.servlet.jsp.PageContext.SESSION_SCOPE);
}
}
org.apache.jasper.runtime.JspRuntimeLibrary.introspect(_jspx_page_context.findAttribute("user"), request);

如果使用后一种写法,则无论找到还是新建JavaBean对象,都一定会使用内省机制来设值。

<jsp:useBean>、<jsp:setProperty>与<jsp:getProperty>的更多相关文章

  1. button与input[type=”button”]的区别

    button与input[type="button"]的区别 特别感谢 @守护晴天 ,指出了博客中不细致不严谨的地方,也让我学到了更多,更多是觉得抱歉,由于自己的不细致可能误导了一 ...

  2. 关于<button> 没写 type='button' 导致点击时提交以及<button>和<input type="button">的区别

    这是我的第一篇博客,如果写的不好,请见谅 这是一个关于button按钮一个小问题 最近刚开学跟着老师一起写代码,在模仿JAVA web程序设计(慕课版) P61页第三章 Ajax处理XML的代码中发现 ...

  3. <button>和<input type="button"> 的区别

    <button>标签 定义和用法 <button> 标签定义一个按钮. 在 button 元素内部,您可以放置内容,比如文本或图像.这是该元素与使用 input 元素创建的按钮 ...

  4. <button>与<input type="button"> 的区别

    <button> button按钮点击会刷新整个页面 <input type="button">  不会刷新整个页面 本文为本人用来记录自己做的一些东西,如 ...

  5. <button>与<input type="button">的区别

    一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...

  6. 解析<button>和<input type="button"> 的区别

    一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...

  7. <button>与<input type="button">

    在做form表单,点击按钮随机生成两串密钥的时候 1.用第一种按钮的时候,会出现刷新form表单的现象.会把创建密钥前面的输入框中的字消失.虽然能生成密钥1和密钥2,但是会闪一下,随即消失.几个输入框 ...

  8. 解析button和input type=”button”的区别

    一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...

  9. 【转】解析<button>和<input type="button"> 的区别

    一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...

  10. button和input type=button的区别及注意事项

    <button>标签 定义和用法 <button>标签定义一个按钮. 在button元素内部,您可以放置内容,比如文本或图像.这是该元素与使用input元素创建的按钮之间的不同 ...

随机推荐

  1. Android单元测试之一:基本概念

    Android单元测试之一:基本概念 简单介绍 单元测试是应用程序测试策略中的基本测试,通过对代码进行单元测试,一方面可以轻松地验证单个单元的逻辑是否正确,另一方面在每次构建之后运行单元测试,可以快读 ...

  2. [Swift]LeetCode307. 区域和检索 - 数组可修改 | Range Sum Query - Mutable

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  3. SpringCloud(5)---Feign服务调用

    SpringCloud(5)---Feign服务调用 上一篇写了通过Ribbon进行服务调用,这篇其它都一样,唯一不一样的就是通过Feign进行服务调用. 注册中心和商品微服务不变,和上篇博客一样,具 ...

  4. Zabbix系列之八——安装agent监控windows

    一.下载zabbix-agent客户端 被监控的主机装在windows server 2012 64位操作系统,被监控端需要安装: http://www.zabbix.com/downloads/3. ...

  5. 通过LRU实现通用高效的超时连接探测

    编写网络通讯都要面对一个问题,就是要把很久不存活的死连接清除,如果不这样做那死连接最终会占用大量内存影响服务运作!在实现过程中一般都会使用ping,pong原理,通过ping,pong来更新连接的时效 ...

  6. Android下实现数据绑定功能

    在编写Android应用的时候经常需要做的事情就是对View的数据进行设置,在Android下设置控件相对.net来说是件麻烦的事情,首先根据ID从view把控件找出来然后才能设置相应属性值:如果数据 ...

  7. MongoDB添加secondary节点的两种方法

    前段时间维护的一个事业群的其中一条业务线的开发找到运维,提出来了一个MongoDB的优化问题,那段时间MongoDB正在从op管理移交给db进行维护,整个部门都对MongoDB的运维经验缺乏,Mong ...

  8. 自定义的jdbc连接工具类JDBCUtils【java 工具类】

    JDBCUtils 类设计: 1. 创建私有的属性*(连接数据库必要的四个变量):dreiver url user password 2. 将构造函数私有化 3.将注册驱动写入静态代码块 4.外界只能 ...

  9. Dockerfile 中的 COPY 与 ADD 命令

    Dockerfile 中提供了两个非常相似的命令 COPY 和 ADD,本文尝试解释这两个命令的基本功能,以及其异同点,然后总结其各自适合的应用场景. Build 上下文的概念 在使用 docker ...

  10. Web技术的发展 网络发展简介(三)

    在上一篇文章中,对TCP/IP通信协议进行了简单的介绍 通信协议是通信的理论基石,计算机.操作系统以及各种网络设备对通信的支持是计算机网络通信的物质基础 而web服务则是运行于应用层,借助于应用层的协 ...