<jsp:useBean>、<jsp:setProperty>与<jsp:getProperty>
<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>的更多相关文章
- button与input[type=”button”]的区别
button与input[type="button"]的区别 特别感谢 @守护晴天 ,指出了博客中不细致不严谨的地方,也让我学到了更多,更多是觉得抱歉,由于自己的不细致可能误导了一 ...
- 关于<button> 没写 type='button' 导致点击时提交以及<button>和<input type="button">的区别
这是我的第一篇博客,如果写的不好,请见谅 这是一个关于button按钮一个小问题 最近刚开学跟着老师一起写代码,在模仿JAVA web程序设计(慕课版) P61页第三章 Ajax处理XML的代码中发现 ...
- <button>和<input type="button"> 的区别
<button>标签 定义和用法 <button> 标签定义一个按钮. 在 button 元素内部,您可以放置内容,比如文本或图像.这是该元素与使用 input 元素创建的按钮 ...
- <button>与<input type="button"> 的区别
<button> button按钮点击会刷新整个页面 <input type="button"> 不会刷新整个页面 本文为本人用来记录自己做的一些东西,如 ...
- <button>与<input type="button">的区别
一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...
- 解析<button>和<input type="button"> 的区别
一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...
- <button>与<input type="button">
在做form表单,点击按钮随机生成两串密钥的时候 1.用第一种按钮的时候,会出现刷新form表单的现象.会把创建密钥前面的输入框中的字消失.虽然能生成密钥1和密钥2,但是会闪一下,随即消失.几个输入框 ...
- 解析button和input type=”button”的区别
一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...
- 【转】解析<button>和<input type="button"> 的区别
一.定义和用法 <button> 标签定义的是一个按钮. 在 button 元素内部,可以放置文本或图像.这是<button>与使用 input 元素创建的按钮的不同之处. 二 ...
- button和input type=button的区别及注意事项
<button>标签 定义和用法 <button>标签定义一个按钮. 在button元素内部,您可以放置内容,比如文本或图像.这是该元素与使用input元素创建的按钮之间的不同 ...
随机推荐
- [Swift]LeetCode786. 第 K 个最小的素数分数 | K-th Smallest Prime Fraction
A sorted list A contains 1, plus some number of primes. Then, for every p < q in the list, we co ...
- [Swift]LeetCode1010. 总持续时间可被 60 整除的歌曲 | Pairs of Songs With Total Durations Divisible by 60
In a list of songs, the i-th song has a duration of time[i] seconds. Return the number of pairs of s ...
- IDEA 配置远程debug
1. 启动远程服务配置debug参数 远程服务启动时配置如下debug相关参数 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address= ...
- 一张图看懂STM32芯片型号的命名规则
意法半导体已经推出STM32基本型系列.增强型系列.USB基本型系列.增强型系列:新系列产品沿用增强型系列的72MHz处理频率.内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM.新 ...
- Python数据挖掘(爬虫强化)
(我喜欢雨天,因为雨天我可以回到童年踩水花!哈!) 2018年 --7月--12日 : 多云又暴雨 T—T 前言 我要把爬虫的终极利器介绍一下,这个只要是我们肉眼能看到的,就算在源码中或者在json中 ...
- Python——day14 三目运算、推导式、递归、匿名、内置函数
一.三目(元)运算符 定义:就是 if...else...语法糖前提:简化if...else...结构,且两个分支有且只有一条语句注:三元运算符的结果不一定要与条件直接性关系 cmd = input ...
- 【Spark篇】---Spark中资源和任务调度源码分析与资源配置参数应用
一.前述 Spark中资源调度是一个非常核心的模块,尤其对于我们提交参数来说,需要具体到某些配置,所以提交配置的参数于源码一一对应,掌握此节对于Spark在任务执行过程中的资源分配会更上一层楼.由于源 ...
- 深入并发包 ConcurrentHashMap 源码解析
以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容 ...
- Ocelot统一权限验证
Ocelot作为网关,可以用来作统一验证,接上一篇博客,我们继续 前一篇,我们创建了OcelotGateway网关项目,DemoAAPI项目,DemoBAPI项目,为了验证用户并分发Token,现在还 ...
- Python爬虫实例:爬取豆瓣Top250
入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...