JavaBean 基础概念、使用实例及代码分析

JavaBean的概念

  JavaBean是一种可重复使用的、且跨平台的软件组件。

  JavaBean可分为两种:一种是有用户界面的(有UI的);另一种是没有用户界面的(无UI的),无UI的JavaBean主要负责处理事务(如数据运算,操纵数据库)。

  JSP通常访问的是后一种JavaBean。

JSP与JavaBean搭配使用的优点

  使得HTML与Java程序分离,这样便于维护代码。

  如果把所有的程序代码都写到JSP网页中,会使得代码繁杂,难以维护。

  可以降低开发JSP网页人员对Java编程能力的要求。

  JSP侧重于生成动态网页,事务处理由JavaBean来完成,这样可以充分利用JavaBean组件的可重用性特点,提高开发网站的效率。

  MVC设计模式(Model View Controller)。

JavaBean的特征

  一个标准的JavaBean有以下几个特征:

  JavaBean是一个公共(public)的类。

  JavaBean有一个不带参数的构造方法。

  JavaBean通过setXXX方法设置属性,通过getXXX方法获取属性。

JSP访问JavaBean的语法

1.导入JavaBean类。

  通过<%@ page import>指令导入JavaBean类,

  例如:

<%@ page import="mypack.MyJavaBean" %>

2.声明JavaBean对象。

  <jsp:useBean>标签用来声明JavaBean对象,

  例如:

<jsp:useBean id="myBean" class="mypack.MyJavaBean" scope="session"/>

3.访问JavaBean属性。

  JSP提供了访问JavaBean属性的标签,如果要将JavaBean的某个属性输出到网页上,可以用<jsp:getProperty>标签。

  例如:

<jsp:getProperty name="myBean" property="count"/>

  如果要给JavaBean的某个属性赋值,可以用<jsp:setProperty>标签,

  例如:

<jsp:setProperty name="myBean" property="count" value="0"/>

  使用指定的值来设置Bean的属性,这个值可以使字符串,也可以是表达式。

  如果是字符串,那么它就会被转换成Bean属性的类型。

  如果是一个表达式,那么它的类型就必须和将要设定的属性值的类型一致。

  不能在同一个<jsp:setProperty>中使用valueparam参数。

  其中param是指通过请求参数的值来给属性赋值。

一个JavaBean使用的例子

  写一个Person类(JavaBean):

package com.shengqishiwind.bean;

public class Person
{
private String name = "zhangsan";
private int age = 24;
private String address = "beijing";
public Person()
{ }
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 String getAddress()
{
return address;
}
public void setAddress(String address)
{
this.address = address;
} }

  然后在JSP中导入这个类,并且声明该类的对象,然后获取其属性或者更改属性:

  导入:

<%@ page language="java" import="java.util.*,com.shengqishiwind.bean.Person" pageEncoding="UTF-8"%>

  声明:

      <!-- 声明JavaBean对象 -->
<jsp:useBean id="person" class="com.shengqishiwind.bean.Person" scope="session"/>

  获取对象属性:

    <!-- 获取对象属性 -->
name: <jsp:getProperty name="person" property="name" /><br>
age: <jsp:getProperty name="person" property="age" /><br>
address: <jsp:getProperty name="person" property="address" /><br>

  设置对象属性:

    <!-- 设置对象姓名属性 -->
<jsp:setProperty name="person" property="name" value="lisi"/>
<!-- 设置对象年龄属性 -->
<jsp:setProperty name="person" property="age" value="30"/> <!-- 这里有自动的类型转换:String2int-->
<jsp:setProperty name="person" property="age" value="<%=20+20 %>"/> <!-- value值还可以用表达式 -->
<jsp:setProperty name="person" property="address" param="hello"/> <!-- 可以通过请求参数的值来赋值,如果不传递这个参数,则该属性仍是原值 -->

  

  关于声明对象,也可以用脚本段来声明,其作用是一样的:

    <!-- 脚本段声明对象 -->
<br>another person:
<% Person person2 = new Person();//这里不能把对象叫做person,提示重复的局部变量,进一步说明这种方法和上面的方法,本质上是一样的
out.println(person2.getName());
%>

  所以输出属性时也可以直接用表达式:

    <!-- 用表达式输出对象属性 -->
<br>name again: <%= person.getName()%><br>

  完整JSP代码如下:

<%@ page language="java" import="java.util.*,com.shengqishiwind.bean.Person" 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 'JavaBeanTest.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>
<!-- 声明JavaBean对象 -->
<jsp:useBean id="person" class="com.shengqishiwind.bean.Person" scope="session"/>
<!-- 获取对象属性 -->
name: <jsp:getProperty name="person" property="name" /><br>
age: <jsp:getProperty name="person" property="age" /><br>
address: <jsp:getProperty name="person" property="address" /><br> <!-- 设置对象姓名属性 -->
<jsp:setProperty name="person" property="name" value="lisi"/>
<!-- 设置对象年龄属性 -->
<jsp:setProperty name="person" property="age" value="30"/> <!-- 这里有自动的类型转换:String2int-->
<jsp:setProperty name="person" property="age" value="<%=20+20 %>"/> <!-- value值还可以用表达式 -->
<jsp:setProperty name="person" property="address" param="hello"/> <!-- 可以通过请求参数的值来赋值,如果不传递这个参数,则该属性仍是原值 --> <!-- 再次获取对象属性 -->
name after change: <jsp:getProperty name="person" property="name" /><br>
age after change: <jsp:getProperty name="person" property="age" /><br>
address after change: <jsp:getProperty name="person" property="address" /><br> <!-- 用表达式输出对象属性 -->
<br>name again: <%= person.getName()%><br> <!-- 脚本段声明对象 -->
<br>another person:
<% Person person2 = new Person();//这里不能把对象叫做person,提示重复的局部变量,进一步说明这种方法和上面的方法,本质上是一样的
out.println(person2.getName());
%> <!-- 再声明一个Person类对象,注意id必须和前面的不同,声明的是同一个类的不同的对象-->
<jsp:useBean id="person3" class="com.shengqishiwind.bean.Person" scope="session"/> </body>
</html>

JavaBeanTest.jsp

  运行时输入地址(注意加上请求参数):http://localhost:8080/HelloWeb/JavaBeanTest.jsp?hello=shanghai

  运行后如图:

生成的Java源文件

  查看Tomcat work路径下该项目路径生成的源文件:(JSP会转化成Servlet):

/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.40
* Generated at: 2013-06-23 14:41:47 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp; import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
import com.shengqishiwind.bean.Person; public final class JavaBeanTest_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
} public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
} public void _jspDestroy() {
} public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException { final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null; try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out; out.write('\r');
out.write('\n'); String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; out.write("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <base href=\"");
out.print(basePath);
out.write("\"> \r\n");
out.write(" \r\n");
out.write(" <title>My JSP 'JavaBeanTest.jsp' starting page</title>\r\n");
out.write(" \r\n");
out.write("\t<meta http-equiv=\"pragma\" content=\"no-cache\">\r\n");
out.write("\t<meta http-equiv=\"cache-control\" content=\"no-cache\">\r\n");
out.write("\t<meta http-equiv=\"expires\" content=\"0\"> \r\n");
out.write("\t<meta http-equiv=\"keywords\" content=\"keyword1,keyword2,keyword3\">\r\n");
out.write("\t<meta http-equiv=\"description\" content=\"This is my page\">\r\n");
out.write("\t<!--\r\n");
out.write("\t<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\">\r\n");
out.write("\t-->\r\n");
out.write("\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" \t<!-- 声明JavaBean对象 -->\r\n");
out.write(" ");
com.shengqishiwind.bean.Person person = null;
synchronized (session) {
person = (com.shengqishiwind.bean.Person) _jspx_page_context.getAttribute("person", javax.servlet.jsp.PageContext.SESSION_SCOPE);
if (person == null){
person = new com.shengqishiwind.bean.Person();
_jspx_page_context.setAttribute("person", person, javax.servlet.jsp.PageContext.SESSION_SCOPE);
}
}
out.write("\r\n");
out.write(" <!-- 获取对象属性 -->\r\n");
out.write("\tname: ");
out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((com.shengqishiwind.bean.Person)_jspx_page_context.findAttribute("person")).getName())));
out.write("<br>\r\n");
out.write("\tage: ");
out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((com.shengqishiwind.bean.Person)_jspx_page_context.findAttribute("person")).getAge())));
out.write("<br>\r\n");
out.write("\taddress: ");
out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((com.shengqishiwind.bean.Person)_jspx_page_context.findAttribute("person")).getAddress())));
out.write("<br>\r\n");
out.write("\t\r\n");
out.write("\t<!-- 设置对象姓名属性 -->\r\n");
out.write("\t");
org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("person"), "name", "lisi", null, null, false);
out.write("\r\n");
out.write("\t<!-- 设置对象年龄属性 -->\r\n");
out.write("\t");
org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("person"), "age", "30", null, null, false);
out.write("\t<!-- 这里有自动的类型转换:String2int-->\r\n");
out.write("\t");
org.apache.jasper.runtime.JspRuntimeLibrary.handleSetProperty(_jspx_page_context.findAttribute("person"), "age",
20+20 );
out.write("\t<!-- value值还可以用表达式 -->\r\n");
out.write("\t");
org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("person"), "address", request.getParameter("hello"), request, "hello", false);
out.write("\t<!-- 可以通过请求参数的值来赋值,如果不传递这个参数,则该属性仍是原值 -->\r\n");
out.write("\t\r\n");
out.write("\t<!-- 再次获取对象属性 -->\r\n");
out.write("\tname after change: ");
out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((com.shengqishiwind.bean.Person)_jspx_page_context.findAttribute("person")).getName())));
out.write("<br>\r\n");
out.write("\tage after change: ");
out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((com.shengqishiwind.bean.Person)_jspx_page_context.findAttribute("person")).getAge())));
out.write("<br>\r\n");
out.write("\taddress after change: ");
out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((com.shengqishiwind.bean.Person)_jspx_page_context.findAttribute("person")).getAddress())));
out.write("<br>\r\n");
out.write("\t\r\n");
out.write("\t<!-- 用表达式输出对象属性 -->\r\n");
out.write("\t<br>name again: ");
out.print( person.getName());
out.write("<br>\r\n");
out.write("\t\r\n");
out.write("\t<!-- 脚本段声明对象 -->\r\n");
out.write("\t<br>another person:\r\n");
out.write("\t");
Person person2 = new Person();//这里不能把对象叫做person,提示重复的局部变量,进一步说明这种方法和上面的方法,本质上是一样的
out.println(person2.getName()); out.write("\r\n");
out.write("\t\r\n");
out.write("\t<!-- 再声明一个Person类对象,注意id必须和前面的不同,声明的是同一个类的不同的对象-->\r\n");
out.write(" ");
com.shengqishiwind.bean.Person person3 = null;
synchronized (session) {
person3 = (com.shengqishiwind.bean.Person) _jspx_page_context.getAttribute("person3", javax.servlet.jsp.PageContext.SESSION_SCOPE);
if (person3 == null){
person3 = new com.shengqishiwind.bean.Person();
_jspx_page_context.setAttribute("person3", person3, javax.servlet.jsp.PageContext.SESSION_SCOPE);
}
}
out.write("\r\n");
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}

JavaBeanTest_jsp.java

  其中,关键代码对应如下:

  导入语句对应:

import com.shengqishiwind.bean.Person;

  生成对象的语句对应:

 com.shengqishiwind.bean.Person person = null;
synchronized (session) {
person = (com.shengqishiwind.bean.Person) _jspx_page_context.getAttribute("person", javax.servlet.jsp.PageContext.SESSION_SCOPE);
if (person == null){
person = new com.shengqishiwind.bean.Person();
_jspx_page_context.setAttribute("person", person, javax.servlet.jsp.PageContext.SESSION_SCOPE);
}
}

  获取name属性:

 out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((com.shengqishiwind.bean.Person)_jspx_page_context.findAttribute("person")).getName())));

  设置name属性:

  org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("person"), "name", "lisi", null, null, false);

参考资料

  圣思园张龙老师Java Web视频教程。

JavaBean 基础概念、使用实例及代码分析的更多相关文章

  1. 快速入门系列--WCF--01基础概念

    转眼微软的WCF已走过十个年头,它是微软通信框架的集大成者,将之前微软所有的通信框架进行了整合,提供了统一的应用方式.记得从自己最开始做MFC时,就使用过Named Pipe命名管道,之后做Winfo ...

  2. kubernetes基础概念知多少

    kubernetes(简称k8s)是一种用于在一组主机上运行和协同容器化应用程序的管理平台,皆在提供高可用.高扩展性和可预测性的方式来管理容器应用的生命周期.通过k8s,用户可以定义程序运行方式.部署 ...

  3. RocketMQ基础概念剖析,并分析一下Producer的底层源码

    由于篇幅原因,本次的源码分析只限于Producer侧的发送消息的核心逻辑,我会通过流程图.代码注释.文字讲解的方式来对源码进行解释,后续应该会专门开几篇文章来做源码分析. 这篇博客聊聊关于Rocket ...

  4. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

    关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 —— IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...

  5. 基础概念:Oracle数据库、实例、用户、表空间、表之间的关系

    基础概念:Oracle数据库.实例.用户.表空间.表之间的关系 数据库: Oracle数据库是数据的物理存储.这就包括(数据文件ORA或者DBF.控制文件.联机日志.参数文件).其实Oracle数据库 ...

  6. Hadoop基础-HDFS数据清理过程之校验过程代码分析

    Hadoop基础-HDFS数据清理过程之校验过程代码分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想称为一名高级大数据开发工程师,不但需要了解hadoop内部的运行机制,还需 ...

  7. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  8. Java面试题精选(一)基础概念和面向对象

    --   基础概念和面向对象   --      全程将为大家剖析几大部分内容,由于学习经验有限,望大家谅解并接受宝贵的意见: 基础概念部分     ★★   : 常出现的高频率单词的区别理解(异常. ...

  9. JavaWeb开发技术基础概念回顾篇

    JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...

随机推荐

  1. sqlserver 存储过程中使用临时表到底会不会导致重编译

    曾经在网络上看到过一种说法,SqlServer的存储过程中使用临时表,会导致重编译,以至于执行计划无法重用, 运行时候会导致重编译的这么一个说法,自己私底下去做测试的时候,根据profile的跟踪结果 ...

  2. C# Socket系列一 简单的创建socket的监听

    socket的应用场景,在快速,稳定,保持长连接的数据传输代码.Http也是socket封装出来的,基于一次请求一次回复,然后断开的socket连接封装. 比如我们常见的游戏服务器,目前的很火的物联网 ...

  3. Hyperledger智能合约Hello World示例程序

    简介 Hyperledger是Linux 基金会主导的一个开源的区块链(BlockChain)项目. 本文介绍了一个简单的Hyperledger智能合约的开发过程. 开发环境 本文使用Docker作为 ...

  4. 让我们开启数据库无Linq、零sql时代

    让我们开启数据库无Linq.零sql时代 Moon.Orm 5.0总论 第一部分 MQL Moon.Orm 5.0 (MQL版) 版本维护及下载 (跟踪发布)  Moon.Orm 5.0系列文章 1. ...

  5. Android Studio快捷键每日一练(3)

    原文地址:http://www.developerphil.com/android-studio-tips-of-the-day-roundup-3/ 23.启停用断点 苹果:Cmd+F8    Wi ...

  6. jQuery Ajax实现下拉框无刷新联动

    HTML代码: @{ Layout = null; } @using DAL; @using System.Data; @{ AreaDal areaDal = new AreaDal(); stri ...

  7. easyui的window插件再次封装

    easyui的window插件再次封装 说明:该插件弹出的弹出框在最顶层的页面中,而不是在当前页面所在的iframe中,它的可拖动范围是整个浏览器窗口:所以不能用JS的parent对象获取弹出它的父页 ...

  8. [水煮 ASP.NET Web API2 方法论](3-6)万能路由

    问题 定义什么样的路由,可以不会受请求参数类型和数量的限制,而被全部捕获? 解决方案 在路由模板中,给参数添加一个"*"前缀,例如 {*param},只要请求的 URL 能够和路由 ...

  9. flask-cors

    https://github.com/corydolphin/flask-cors/blob/master/examples/app_based_example.py ""&quo ...

  10. SNAT,是源地址转换,其作用是将ip数据包的源地址转换成另外一个地址

    SNAT,可能有人觉得奇怪,好好的为什么要进行ip地址转换啊,为了弄懂这个问题,我们要看一下局域网用户上公网的原理,假设内网主机A(192.168.2.8)要和外网主机B(61.132.62.131) ...