Java Web基础入门第二十六讲 JSP技术——JSP标签(下)
发布日期:2021-06-30 18:04:18 浏览次数:3 分类:技术文章

本文共 7104 字,大约阅读时间需要 23 分钟。

什么是JavaBean?

JavaBean是一个遵循特定写法的Java类,它通常具有如下特点:

  • 这个Java类必须具有一个无参的构造函数;
  • 属性必须私有化;
  • 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。

这里有一个JavaBean范例:

package cn.liayun.domain;import java.util.Date;public class Person {
//------------------Person类封装的私有属性--------------------------------------- private String name = "liayun"; //getClass() private int age; private Date birthday; //------------------Person类的无参数构造方法--------------------------------------- public Person() {
super(); // TODO Auto-generated constructor stub } //------------------Person类对外提供的用于访问私有属性的public方法--------------------------------------- public String getName() {
return name; } public void setName(String name) {
this.name = name; } public int getAge() {
return age; } public void setAge(int age) {
this.age = age; } public Date getBirthday() {
return birthday; } public void setBirthday(Date birthday) {
this.birthday = birthday; }}

虽然SUN公司在定义JavaBean规范时,允许Java开发人员把JavaBean设计得可以像Swing组件一样功能强大,但在实际的J2EE开发中,通常只使用到以上JavaBean最基本的特性。JavaBean在J2EE开发中,通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵守命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据。

JavaBean的属性

JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性。每个属性通常都需要具有相应的setter、getter方法,setter方法称为属性修改器,getter方法称为属性访问器。属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name属性的修改器名称为setName,password属性的修改器名称为setPassword;属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name属性的访问器名称为getName,password属性的访问器名称为getPassword。

一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。

在JSP中使用JavaBean

JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为:

在这里插入图片描述
下面我就来分别讲讲这3个标签。

<jsp:useBean>标签

<jsp:useBean>标签用于在指定的域范围内查找指定名称的JavaBean对象,如果存在则直接返回该JavaBean对象的引用;如果不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。常用语法如下:

  • id属性用于指定JavaBean实例对象的引用名称和其存储在域范围中的名称;
  • class属性用于指定JavaBean的完整类名(即必须带有包名);
  • scope属性用于指定JavaBean实例对象所存储的域范围,其取值只能是page、request、session和application等四个值中的一个,其默认值是page。

下面是一个<jsp:useBean>标签的使用范例。

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
jsp:usebean标签的使用
<%=person.getName() %>

在Google Chrome浏览器上访问以上页面,运行效果如下:

在这里插入图片描述

<jsp:useBean>标签的执行原理

上面我们在test.jsp中使用

实例化了一个cn.liayun.domain.Person类的对象,那么这个person对象是怎么实例化出来的呢?test.jsp在执行的过程中首先会翻译成一个Servlet,因此我们可以通过查看test.jsp页面生成的Servlet的Java代码来查看person对象的实例化过程。找到Tomcat服务器下的“work\Catalina\localhost\项目名称\org\apache\jsp”这个目录,就可以看到将test.jsp页面翻译成Servlet的Java源码了,如下所示:

在这里插入图片描述
打开test_jsp.java文件,在_jspService方法中可以看到person对象的创建过程,如下所示:
在这里插入图片描述
下面我们来分析一下上述生成的代码。
首先是定义一个person对象,值是null。

cn.liayun.domain.Person person = null; // 定义一个空的person对象

然后是使用pageContext对象的getAttribute方法获取存储在PageContext.PAGE_SCOPE域中的Person对象。

person = (cn.liayun.domain.Person) _jspx_page_context.getAttribute("person", javax.servlet.jsp.PageContext.PAGE_SCOPE);

如果在PageContext.PAGE_SCOPE域中的Person对象没有找到,那么就创建一个新的person对象,然后使用pageContext对象的setAttribute方法将新创建的person存储在PageContext.PAGE_SCOPE域中。

if (person == null){
person = new cn.liayun.domain.Person(); _jspx_page_context.setAttribute("person", person, javax.servlet.jsp.PageContext.PAGE_SCOPE);}

也就是说,在test.jsp中使用

来实例化person对象的过程实际上是执行了上述的Java代码来实例化person对象。这就是<jsp:useBean>标签的执行原理:首先在指定的域范围内查找指定名称的JavaBean对象,如果存在则直接返回该JavaBean对象的引用,如果不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。

温馨提示:<jsp:useBean>标签的标签体只在<jsp:useBean>标签实例化bean时才执行。如以下test.jsp页面内容:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
jsp:usebean标签的使用
jsp:usebean标签的标签体
<%=person.getName() %>

在Google Chrome浏览器上访问以上页面,运行效果如下:

在这里插入图片描述
若将以上test.jsp页面内容修改为:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
jsp:usebean标签的使用
jsp:usebean标签的标签体
<%=person.getName() %>

第一次访问结果仍不变,但第二次访问时结果如下图:

在这里插入图片描述
原因是第一次访问时,JavaBean对象不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围session中;第二次访问时,在指定的域范围session内就已经查找到指定名称的JavaBean对象了,所以不会再创建一个新的JavaBean对象,即<jsp:useBean>标签的标签体只在<jsp:useBean>标签实例化bean时才执行。

带标签体的<jsp:useBean>标签

其语法为:

Body

Body部分的内容只在<jsp:useBean>标签创建JavaBean的实例对象时才执行。以上例子已证明过。

<jsp:setProperty>标签

<jsp:setProperty>标签用于设置JavaBean对象的属性。

在这里插入图片描述

  • name属性用于指定JavaBean对象的名称;
  • property属性用于指定JavaBean实例对象的属性名;
  • value属性用于指定JavaBean对象的某个属性的值,value的值可以是字符串,也可以是表达式。为字符串时,该值会自动转化为JavaBean属性相应的类型;如果value的值是一个表达式,那么该表达式的计算结果必须与所要设置的JavaBean属性的类型一致。param属性用于将JavaBean实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的JavaBean属性的类型。

<jsp:setProperty>标签使用范例一

使用<jsp:setProperty>标签设置person对象的属性值,即手工为bean属性赋值。

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
jsp:setProperty标签使用范例
<%-- 使用jsp:setProperty标签设置person对象的属性值。 jsp:setProperty在设置对象的属性值时会自动把字符串转换成8种基本数据类型, 但是jsp:setProperty对于复合数据类型无法自动转换。 --%>
<%-- birthday属性是一个Date类型,这个属于复合数据类型,因此无法将字符串自动转换成Date,用下面这种写法是会报错的
--%>
<%-- 使用getXxx()方法获取对象的属性值 --%>

姓名:<%=person.getName() %>

年龄:<%=person.getAge() %>

生日:<%=person.getBirthday() %>

在Google Chrome浏览器上访问以上页面,运行效果如下:

在这里插入图片描述

<jsp:setProperty>标签使用范例二

使用请求参数为bean的属性赋值。

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
jsp:setProperty标签使用范例
<%-- jsp:setProperty标签可以使用请求参数为bean的属性赋值。 param="name"用于接收参数名为name的参数值,然后将接收到的值赋给name属性 --%>
<%-- 使用getXxx()方法获取对象的属性值 --%>

姓名:<%=person.getName() %>

在Google Chrome浏览器上访问以上页面,运行效果如下:

在这里插入图片描述
又如:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
jsp:setProperty标签使用范例
<%-- jsp:setProperty标签可以使用请求参数为bean的属性赋值 --%>
<%-- 支持8种基本数据类型的转换(把客户机提交的字符串,转成相应的8种基本数据类型,赋到bean的属性上) --%> <%-- 使用getXxx()方法获取对象的属性值 --%>

姓名:<%=person.getName() %>

年龄:<%=person.getAge() %>

在Google Chrome浏览器上访问以上页面,运行效果如下:

在这里插入图片描述

<jsp:setProperty>标签使用范例三

用所有的请求参数为bean的属性赋值。

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
jsp:setProperty标签使用范例
<%-- jsp:setProperty标签用所有的请求参数为bean的属性赋值, property="*"代表bean的所有属性 --%>
<%-- 使用getXxx()方法获取对象的属性值 --%>

姓名:<%=person.getName() %>

年龄:<%=person.getAge() %>

在Google Chrome浏览器上访问以上页面,运行效果如下:

在这里插入图片描述
注意:请求参数的名称和bean的属性名称一定要一致,内部用的是反射技术。

<jsp:getProperty>标签

<jsp:getProperty>标签用于读取JavaBean对象的属性,也就是调用JavaBean对象的getter方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中。其语法为:

  • name属性用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性值相同;
  • property属性用于指定JavaBean实例对象的属性名。

如果一个JavaBean实例对象的某个属性的值为null,那么,使用<jsp:getProperty>标签输出该属性的结果将是一个内容为“null”的字符串。

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
jsp:getProperty标签使用范例
<%-- 使用jsp:setProperty标签设置person对象的属性值。 jsp:setProperty在设置对象的属性值时会自动把字符串转换成8种基本数据类型, 但是jsp:setProperty对于复合数据类型无法自动转换。 --%>
<%-- birthday属性是一个Date类型,这个属于复合数据类型,因此无法将字符串自动转换成Date ,用下面这种写法是会报错的
--%>
<%-- 使用jsp:getProperty标签获取对象的属性值 --%>

姓名:

年龄:

生日:

在Google Chrome浏览器上访问以上页面,运行效果如下:

在这里插入图片描述
关于JavaBean方面的内容基本上就这么多了,只需要掌握JavaBean的写法,以及掌握<jsp:useBean>标签,<jsp:setProperty>标签,<jsp:getProperty>标签的使用!

转载地址:https://liayun.blog.csdn.net/article/details/89785423 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java Web基础入门第二十七讲 JSP技术——EL表达式和JSTL标签快速入门
下一篇:如何在浏览器中禁用和启用Cookie?

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月24日 20时30分16秒