<jsp:javabean>动作标签实例
之后补齐基础知识
- scope属性
该属性指定了所创建Bean实例的存取范围,省略该属性时的值为page.<jsp:useBean>标识被执行时,首先会在scope属性指定的范围来查找指定的Bean实例,如果该实例已经存在,则引用这个Bean,否则重新创建,并将其存储在scope属性指定的范围内。
scope属性可选值如下
- page:(当前页面范围)
制定了所创建的Bean实例只能够在当前的JSP文件中使用,包括在通过include指令静态包含(实际上是一个页面)的页面中有效
- request: (请求范围[^1] )
指定了所创建的Bean实例可以在请求范围内进行存取。在请求被转发至的目标页面中可通过request对象的getAttribute("id属性值") 方法获取创建的Bean实例。一个请求的生命周期是 从客户端向服务器发出一个请求到服务器响应这个请求给用户后 结束,所以请求结束后,存储在其中的Bean的实例也就是失效了。
- session:(一个用户,多个页面)
指定了所创建的Bean实例的有效范围为session.
session是当用户访问Web应用时,服务器为用户创建的一个对象,服务器通过session的ID值 来区分其他的用户。针对某一个用户而言, 在该范围中的对象可被多个页面共享。(购物车应用)
可以使用session对象的getAttribute("id属性值")方法获取存储在session中的Bean实例,也可以使用session对象的getValue("id属性值")来获取,但该方法不建议使用。
- application:(多个用户,多个页面)
该值指定了所创建的Bean实例的有效范围从服务器启动开始到服务器关闭结束。 application对象是在服务器启动时创建的,它被多个用户共享。所以访问该application对象的所有用户共享存储于该对象中的Bean实例。 (浏览人数)
可以使用application对象的getAttribute(“id属性值”)方法获取在application中的Bean实例
- page:(当前页面范围)
先放上本次实例
本次实例主要解决了 :
如果在session范围和request范围都存在名为car的ShopCar实例,而存储在session范围内的ShopCar实例是通过<jsp:useBean>标识创建的。那么代码中的<jsp:setProperty>标识会为哪个范围中的ShopCar实例赋值呢?
实例工程架构如下
存在一个javaBean,关键代码如下:
package com.bean;
public class ShopCar {
private String name;
private String maker;
public ShopCar() {
name = "noname";
maker="noplace";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMaker() {
return maker;
}
public void setMaker(String maker) {
this.maker = maker;
}
}
JavaBean:简单说,它就是一个Java类,这个类可以重复地使用。
它必须遵循以下规定:
- 是一个公有类。
- 具有一个公有的不带参数构造方法。
- 每个属性必须定义一组getXXX()和setXXX()方法, 以便读取和存储其属性值。
- 符合上述规定的JavaBean,将拥有:事件处理、自省机制、永续储存等特性。
新建javabean1.jsp 文件:
<!-- 导入ShopCar类 -->
<%@page import="com.bean.ShopCar"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>第一种方法实例化javaBean</h2>
<%
ShopCar car = new ShopCar(); //创建一个javaBean ShopCar的实例
session.setAttribute("car",car); //将创建的JavaBean实例存在session范围内
%>
<h2>第二种方法实例化javaBean</h2>
<%-- 这里的id就是javaBean实例的名字 相当于ShopCar car = new ShopCar()
两种方法作用一致 --%>
<%--<jsp:useBean id="car" class="com.bean.ShopCar" scope="session"/> --%>
<jsp:setProperty name="car" property="*"/>
<%
ShopCar r_car = new ShopCar();
request.setAttribute("car", r_car); //作用域范围是request
%>
<jsp:setProperty name="car" property="name" value="Panax"/>
<jsp:setProperty name="car" property="maker" value="JiLin"/>
Request范围内:<br>
车名: <%=r_car.getName() %>
地址:<%=r_car.getMaker() %>
<br>
Session范围内:<br>
车名: <%=car.getName() %>
地址: <%=car.getMaker() %>
</body>
</html>
- id指的是实例化的对象,class就是Java类。这一行相当于
ShopCar car = new ShopCar();
- name是对象,property是属性,value是属性的值。
==实验结果==:
从结果得知:
<jsp:setProperty>标识被执行时,会按照page、request、session和application的顺序来查找由name属性指定的Bean实例,并且返回第一个被找到的实例;若任何范围内不存在这个Bean实例,就会抛出异常
[^1]:客户端和服务器的一次通信就是一次请求(发送请求或得到相应)
原文地址:https://www.cnblogs.com/janeqin/p/10225575.html