JavaBean定义:JavaBean是一种可重复使用,且跨平台的软件组件
一个标准的JavaBean有以下几个特性:
1) JavaBean是一个公共的(public)类
2) JavaBean有一个不带参数的构造方法,方法体中不一定要为空
3) JavaBean通过setXXX方法设置属性,通过getXXX方法获取属性
标准的JavaBean
Student.java
package com.javabean;
public class Student {
private String name ;
private int age ;
private float height;
public Student()
{
name = "zhangshan" ;
age = 20 ;
height = 175 ;
}
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 float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
}
JSP访问JavaBean步骤:
1) 导入JavaBean类
<%@ page language="java" import="com.javabean.*" pageEncoding="UTF-8"%>
2)声明JavaBean对象
<jsp:useBean id="student" class="com.javabean.Student" scope="session" />
解释:id的值是该Student对象的引用,
scope是一个作用域,属性有:page(默认), request, session,application
3)访问JavaBean属性
获取属性:
<jsp:getProperty property="name" name="student" />
<jsp:getProperty property="age" name="student" />
<jsp:getProperty property="height" name="student" />
设置属性:
<jsp:setProperty property="name" name="student" value="lisi" />
案例一:javabean1.jsp
<%@ page language="java" import="java.util.*,com.javabean.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'javabean1.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<!-- id 的值是Student对象的引用 scope="request"把生成的对象放到request域中 -->
<jsp:useBean id="student" class="com.javabean.Student" scope="request" />
<jsp:getProperty property="name" name="student" />
<jsp:getProperty property="age" name="student" />
<jsp:getProperty property="height" name="student" />
<jsp:setProperty property="name" name="student" value="lisi" />
<jsp:getProperty property="name" name="student" />
<!-- 转发 -->
<jsp:forward page="javabean2.jsp"></jsp:forward>
</body>
</html>
javabean2.jsp
<%@ page language="java" import="com.javabean.*" pageEncoding="UTF-8"%> <html> <body> <% Student stu = (Student)request.getAttribute("student") ; out.println(stu.getName()) ; %> </body> </html>
解释:在javabean2.jsp中为什么调用 request.getAttribute("student")能获取到对象呢,还有student代表了什么?其实这个student只是一个别名,不是对象的引用,只是这个别名和对象的引用取了相同的名字而已
来看看tomcat生成的源码:
com.javabean.Student student = null; synchronized (request) { student = (com.javabean.Student) _jspx_page_context.getAttribute("student", PageContext.REQUEST_SCOPE);
//第一次访问的话,会执行if语句,因为student是空的,直接new一个对象,放到request域中
if (student == null){ student = new com.javabean.Student(); _jspx_page_context.setAttribute("student", student, PageContext.REQUEST_SCOPE); } }
案例二:javabean3.jsp
<%@ page language="java" import="java.util.*,com.javabean.*" pageEncoding="UTF-8"%> <html> <body> <!-- id 的值是Student对象的引用 --> <jsp:useBean id="student" class="com.javabean.Student" scope="application" /> <%= student.getName() %> <!-- 这行第一次打印的是zhangshan,而不是 123 --> <% student.setName("123"); %> <jsp:getProperty property="name" name="student" /> <jsp:getProperty property="age" name="student" /> <jsp:getProperty property="height" name="student" /> <!-- 也可以用以下方式操纵 --> <%= student.getName() %> </body> </html>
解释:通过案例二,主要体现在 scope="application" 属性的变化,当scope="request",每次访问页面打印的是一样的结果,因为request是在一次请求中有效,而ssesion是在一次会话中有效,application是全局的