JavaBean

news2024/11/19 10:26:54

一、JavaBean的概念

1、JavaBean就是MVC设计模式中的model层

2、种类:数据bean(pojo),逻辑bean

数据bean分为:

  • 表单bean

封装表单里的参数,属性名字、个数和类型要和表单的参数的名字、个数和类型一致。

  • 结果bean

封装外部的信息,主要是封装数据库的记录。要求属性名字、个数、类型 和数据库里的字段名字、个数、类型一致。又叫实体类

逻辑bean分为:

  • 业务bean

又叫业务层,作用是完成对请求的操作

  • 持久bean

又叫dao或数据访问层。作用是完成对外部数据操作的封装

3、Javabean优点

  • 提高代码的可复用性

对于通用的事务处理逻辑,数据库操作等都可以封装在JavaBean中,通过调用JavaBean的属性和方法可以快速进行程序设计

  • 程序易于开发维护

实现逻辑的封装,使事务处理和显示互不干扰

  • 支持分布式应用

4、bean的语法要求

表单bean:自动完成对表单数据的收集 。如我们做的银行系统中的 userBean,就是一个表单bean。

public class SimpleBean{
  private String name;
  private String password;
  public SimpleBean(){
  }
  public void getName(){
    
  }
  public void setName(){
    
  }
}
  • 必须放在包对应的目录结构下—所有的JavaBean必须放在一个包里
  • 是一个主类public。类名和文件名一样。和任何接口、类没有联系
  • 属性要隐藏,要和表单里的参数名、类型一样或者或数据里的字段名、类型一致
  • 属性是private ,不能允许外部直接访问,对每一个属性设定get、set方法。外部需要通过相应的方法来操作属性
  • 要显式的写无参构造方法 。通过有参构造的方式去设定属性值往往比较麻烦,所以用无参构造出bean的对象,然后通过调用set方法来设定属性值

二、JavaBean的使用

2.1、创建JavaBean

1、创建JavaBean

  • 通过java代码创建bean对象
<%@page contentType="text/html;charset=gb2312"%>
<%@page import="cn.zte.pxb.*"%>
<%
	// 实例化对象
	SimpleBean zs = new SimpleBean() ;
	zs.setName ("lisa");
	zs.setPassword("123456") ; 
%>
<h1>姓名:<%=zs.getName()%></h1>
<h1>密码:<%=zs.getPassword()%></h1>
  • 通过标签创建bean对象

<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="zs" scope="page" 
class="cn.zte.pxb.SimpleBean"/>

<%
	zs.setName("tom") ;
	zs.setPassword("123") ; 
%>
<h1>姓名:<%=zs.getName()%></h1>
<h1>密码:<%=zs.getPassword()%></h1>

< jsp:useBean id=“zs” scope=“page” class=“cn.zte.pxb.SimpleBean”/>这个标签的意思是:

  • 发送请求

  • scope=“page”,创建page内置对象

  • 执行这个jsp,先会在page内置对象中找有没有zs这个属性名的值 page.getAttribute(“zs”)

  • page.getAttribute(“zs”)==null,如果没有,就会去web-inf下的class下找到对应包的字节码文件(class=“cn.zte.pxb.SimpleBean”),加载到虚内存的方法区的类代码区

  • 在堆里创建出SimpleBean对象—属性名开辟属性空间,方法名开辟方法空间(SimpleBean zs=(SimpleBean)page.getAttribute(“zs”);)。调用SimpleBean类的无参构造方法来初始化对象

  • 将对象地址交给page内置对象管理

会先判断有没有zs这个bean对象,如果有就不创建,如果没有,就会创建一个新的new SimpleBean对象,命名为zs

<%--
if (page.getAttribute("zs")==null)
page.setAttribute("zs",new SimpleBean());  
SimpleBean zs=(SimpleBean)page.getAttribute("zs");
--%>
  • EL表达式自动收集表单数据到Bean里
<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="zs"  scope="page" class="cn.zte.pxb.SimpleBean"/>
 
<jsp:setProperty name="zs" property="*"/>
 
 
 ${zs.name}<br>
 ${zs.password} 

< jsp:useBean id=“zs” scope=“page” class=“cn.zte.pxb.SimpleBean”/>

userBean标签

完成Bean对象的创建 ----如果没有属性名为zs的属性值,就新建一个属性名为zs的SimpleBean对象

< jsp:setProperty name=“zs” property=“*”/>

setProperty标签

完成bean数据的收集 ----在内置对象里找属性名为“zs”的属性值,给simpleBean所指的所有属性设值 (表单里提交的姓名和密码,从request里拿到),自动设值,相当于下面:

zs.setName(request.getParameter(“name”));

zs.setPassword(request.getParameter(“password”))

z s . n a m e ∗ ∗ ∗ ∗ {zs.name}** ** zs.name{zs.password}

完成将结果渲染到页面 -----取值。zs.name,zs是内置对象里的属性名,name代表的不是属性,而是getName()方法名 ,name在bean中是私有的,不能直接调用属性。

通过标签/框架自动收集表单数据到Bean中,数据在外部是以表单数据存在,在内部是以bean对象存在,通过bean来传递数据。

在这里插入图片描述

2、一些异常情况

  • 表单里参数类型和Bean里类型不一致----会自动转换数据类型

zs.setAge(request.getParameter(“age”))----setAge的参数类型是int,而request里获取的参数类型是String,**标签会自动将request里获取到的字符串类型的年龄值转化为int类型的年龄值 **

标签不仅能够自动收集,还能够自动转换

  • 表单里参数个数和Bean里不一致。—找的到属性名的就set值,找不到就set原型

表单,两个参数

<form action="JBDemo04.jsp" method="get">
用户名:<input type="text" name="name"><br>
密&nbsp;&nbsp;码:<input type="text" name="password"><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>

Bean,三个参数

public class SimpleBean{
  private String name;
  private String password;
  private int age;
  public SimpleBean(){
    sout();
  }
  public void getName(){
    
  }
  public void setName(String name){
    
  }
   public void getPassword(){
    
  }
  public void setPassword(String password){
    
  }
  public int getAge(){
    return 
}
  public void setAge(int age){
}
}

jsp

<%@page contentType="text/html;charset=gb2312"%>
 <jsp:useBean id="ls" scope="page" class="cn.mldn.lxh.SimpleBean"/>
<jsp:setProperty name="ls" property="*"/>
<%--<jsp:setProperty name="ls" property="age" value="20"/> --%>

<h1>姓名:<%=request.getParameter("name")%></h1><br>  //lisi
<h1>密码:<%=request.getParameter("password")%></h1><br>  //123
<h1>年龄:<%=request.getParameter("age")%></h1><br> //null

<h1>姓名:<jsp:getProperty name="ls" property="name"/></h1> //lisi
<h1>密码:<jsp:getProperty name="ls" property="password"/></h1> //123
<h1>年龄:<jsp:getProperty name="ls"  property="age"/></h1>  //0

ls.setAge(request.getParameter(“age”)) ; // request.getParameter(“age”)为null,没有数据,set原型,0

当表单里参数个数比bean里个数少时,标签自动设值时会给bean里多的属性设置原型(int类型是0

有一个漏洞:当表单里name和password输入为空时,如果按照set原型的话,应该给name和passwprd属性set空字符串,但是标签set的是null—这样很容易引发空指针异常

在这里插入图片描述

<%--<jsp:setProperty name="ls" property="name" param="password"/>--%> 
<%--<jsp:setProperty name="ls" property="name"
value="password"/>--%>
<jsp:setProperty name="ls" property="age" value="20"/> 
  • 通过param,直接给name属性set表单里参数名为“password” 的值
  • 通过value,直接给name属性set值为“password”
  • 通过value,还可以给表单中没有的属性age,直接设值为“20”

标签收集还不够健壮。框架相比更优化, 找的到的属性就设置属性值,找不到的就设置原型。

2.2、Bean的传递

1、创建一个JavaBean类

CountBean.java


 package cn.mldn.lxh ;

 public class CountBean
  {
	private int coun=0;

	public CountBean()
	{
		System.out.println("** CountBean() ...") ;
		System.out.println("¤ --------------------------------- ¤") ;
	}

	public void setCoun(int coun)
	{
		this.coun = coun ;
	}

	public int getCoun()
	{
	 return ++this.coun ;
	}
  }

2、request内置对象传递JavaBean

requestJBDemo01.jsp

<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="cb" scope="request" class="cn.mldn.lxh.CountBean"/>
访问第
<font color="red" size="15">
<jsp:getProperty name="cb" property="coun"/>
</font>
<jsp:forward page="requestJBDemo02.jsp"/>
<%--<a href="requestJBDemo02.jsp">requestJBDemo02.jsp</a>  这种request会消失--%>

requestJBDemo02.jsp

<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="cb" scope="request" class="cn.mldn.lxh.CountBean"/>

访问第
<font color="red" size="15">
	<jsp:getProperty name="cb" property="coun"/>
</font>
次!!
  • 首先在request内置对象中,找有没有属性名为cb的值,如果没有,则创建CountBean对象,将对象地址交给request管理。
  • 先在page内置对象中查找cb属性值,没有再去request里查找,找到了之前创建的CountBean对象,调用getCoun()方法–coun++,coun=1
  • 服务端跳转到requestJBDemo02.jsp (request还存活)
  • 先在request中找到属性名为cb的属性值,找到了,就不再创建对象
  • 先在page内置对象中查找cb属性值,没有再去request里查找,找到了之前创建的CountBean对象,调用getCoun()方法–coun++,coun=2
  • 所以最后输出到页面的就是2

当用服务端跳转时,request请求会被销毁,则需要重新创建CountBean对象

3、session传递javabean

sessionJBDemo01.jsp

<!--127.0.01:8080/test/02_JavaBean/sessionJBDemo01.jsp-->
<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="cb" scope="session" class="cn.mldn.lxh.CountBean"/>
访问第
<font color="red" size="15">
	<jsp:getProperty name="cb" property="coun"/>
</font>
次!!
<a href="sessionJBDemo02.jsp">sessionJBDemo02.jsp</a>

sessionJBDemo02.jsp

<%@page contentType="text/html;charset=gb2312"%>
 <jsp:useBean id="cb" scope="session" class="cn.mldn.lxh.CountBean"/> 
访问第
<font color="red" size="15">
	<jsp:getProperty name="cb" property="coun"/>
</font>
次!!
  • 先在该请求对应的session内置对象里找属性名为cb的属性值,没找到就创建CountBean对象,并将对象地址交给session管理

查找cb属性值,先在当前page寻找,然后在请求request中查找,最后在session里找

  • 在session找到属性名为cb的属性值,调用getCoun()–coun++,coun=1
  • 请求结束,返回第一次,然后客户端跳转到sessionJBDemo02.jsp,发起新的请求,session还在。所以可以在session里头找到属性名为cb的属性值,所以不会创建countBean对象
  • 在session找到属性名为cb的属性值,调用getCoun()–coun++,coun=2

4、application传递

<%@page contentType="text/html;charset=gb2312"%>
<jsp:useBean id="cb" scope="application" class="cn.mldn.lxh.CountBean"/>
访问第
<font color="red" size="15">
	<jsp:getProperty name="cb" property="coun"/>
</font>
次!!
  • 在application内置对象里找找属性名为cb的属性值,没找到,创建一个countBean对象,交给application管理
  • (先到page里找,没有到request,没有到session,)此时session里有一个countBean对象(前面例子session,用户没下线,session还在),于是调用session里的getCount()方法 ,coun++=====3。找到后就不去application里拿了。所以页面显示的值是3

没有指定在哪找属性值时,会按照这样的查找顺序,直到查到就不再往下一个对象查

page—>request—>session—>application

5、page传递

page是不能传递数据的,只会在当前页面有效

传递数据最好用reqeust的服务端跳转

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/813297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我对排序算法理解

排序算法一直是一个很困惑我的问题&#xff0c;早在刚开始接触 数据结构的时候&#xff0c;这个地方就很让我不解。就是那种&#xff0c;总是感觉少了些什么的感觉。一开始&#xff0c;重新来过&#xff0c;认真来学习这一部分&#xff0c;也总是学着学着就把概念记住了。过了一…

【Rust学习 | 基础系列3 | Hello, Rust】编写并运行第一个Rust程序

文章目录 前言一&#xff0c;创建项目二&#xff0c;两种编译方式1. 使用rustc编译器编译2. 使用Cargo编译 总结 前言 在开始学习任何一门新的编程语言时&#xff0c;都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中&#xff0c;将会介绍如何在Rust中编写并运…

Elasticsearch搜索引擎系统入门

目录 【认识Elasticsearch】 Elasticsearch主要应用场景 Elasticsearch的版本与升级 【Elastic Stack全家桶】 Logstash Kibana Beats Elasticsearch在日志场景的应用 Elasticsearch与数据库的集成 【安装Elasticsearch】 安装插件 安装Kibana 安装Logstash 【认…

Day01-作业(HTMLCSS)

作业1&#xff1a;通过HTML的标签及CSS样式&#xff0c;完成如下企业简介html页面的制作。 【必做】 A. 最终效果如下&#xff1a; B. 文字素材如下&#xff1a; 企业简介传智教育(股票代码 003032)&#xff0c;隶属江苏传智播客教育科技股份有限公司&#xff0c;注册资本4亿元…

【NVIDIA CUDA】2023 CUDA夏令营编程模型(一)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【Git】Git GitHub

1. Git1.1 Git基本操作1.2 Git版本回退1.3 Git分支操作 2. Git 配合GitHub2.1 生成密钥2.2 GitHub添加公钥2.3 Git连接GitHub2.4 本地仓库关联远程仓库2.5 本地代码push远程仓库2.6 本地clone远程仓库2.7 本地fetch和pull 1. Git 1.1 Git基本操作 touch test.py 工作区创建文…

全网最细,Postman接口测试实战详细总结,一篇进阶...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Postman是一款功能…

【力扣每日一题】2023.7.30 环形链表2

题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题属于是那种知道解法就很简单&#xff0c;不知道解法就很难独立想出来的那种&#xff0c;我们只需要稍微记住这类题的固定解法就可以。 所以接下来我先说解法&#xff0c;再解释为什么解法可以解出来。 那么我们都…

nginx使用-(想学nginx,这篇就够了)

nginx使用-&#xff08;想学nginx&#xff0c;这篇就够了&#xff09; upstream wgz{server 127.0.0.1:8081 ;server 127.0.0.1:8082 ;fair;}反向代理 动静分离 负载均衡 高可用集群配置 反向代理 upstream要转发的地址的配置proxy_pass请求转发的地址 location /user{proxy_…

程序设计 算法基础

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【并发专题】操作系统模型及三级缓存架构

目录 课程内容一、冯诺依曼计算机模型详解1.计算机五大核心组成部分2.CPU内部结构3.CPU缓存结构4.CPU读取存储器数据过程5.CPU为何要有高速缓存 学习总结 课程内容 一、冯诺依曼计算机模型详解 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时&#xff0c;先从内存中…

python学习之【浅拷贝】

前言 上一篇文章&#xff0c;python学习之【继承、封装、多态】主要学习了面向对象的三大特征。这篇文章记录下对python的浅拷贝的学习&#xff0c;下一篇文章接着学习深拷贝。 简单了解 浅拷贝&#xff1a;python拷贝一般都是浅拷贝&#xff0c;拷贝时&#xff0c;对象包含的…

【C语言】函数重难点之函数递归

大家好&#xff0c;我是深鱼~ 目录 一、函数递归知识讲解 1.什么是递归&#xff1f; 2.递归的两个必要条件 2.1练习1&#xff1a; 2.2练习2&#xff1a; 二、递归与迭代 2.1练习3 2.2练习4 一、函数递归知识讲解 1.什么是递归&#xff1f; 程序调用自身的编程技巧称为…

UNITY随记(八) SHADER实现立方体CUBE显示边框,描边

Shader "Vitens/CubeOutline"{Properties{_Color("Color", color) = (1,1,1,1)_Width("Width", range(0,0.5)) = 0.1}SubShader{Tags {"Queue"=

windows下载安装FFmpeg

FFmpeg是一款强大的音视频处理软件&#xff0c;下面介绍如何在windows下下载安装FFmpeg 下载 进入官网: https://ffmpeg.org/download.html, 选择Windows, 然后选择"Windows builds from gyan.dev" 在弹出的界面中找到release builds, 然后选择一个版本&#xff0…

Java中的生产者/消费者模型

一、什么是生产者/消费者模型 生产者-消费者模型&#xff08;Producer-Consumer problem&#xff09;是一个非常经典的多线程并发协作的模型。 比如某个模块负责生产数据&#xff0c;而另一个模块负责处理数据。产生数据的模块就形象地被称为生产者&#xff1b;而处理数据的模…

基地培训一周总结-用两台虚拟机模拟公司和员工

前言&#xff1a; 本来是打算每天跟更新所学内容&#xff0c;但奈何自己接触新知识速度较慢&#xff0c;每天都在完不成任务的边缘疯狂试探&#xff0c;短时间大量知识的涌入&#xff0c;感觉脑袋瓜在有点 跟不上。这周结束的时候&#xff0c;老师布置了个小项目&#xff0c;融…

Linux操作系统下安装python环境

参考&#xff1a;Linux操作系统下安装python环境_linux如何下载python_秃头小猿-F的博客-CSDN博客 注意 切换用户 二、切换root用户 1.给root用户设置密码&#xff1a;命令&#xff1a;sudo passwd root输入密码&#xff0c;并确认密码。2.重新输入命令&#xff1a;su root …

【数据结构】之十分好用的“链表”赶紧学起来!(第一部分单向链表)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

某行动态cookie反爬虫分析

某行动态cookie反爬虫分析 1. 预览 反爬网址(base64): aHR0cDovL3d3dy5wYmMuZ292LmNu 反爬截图&#xff1a; 需要先加载运行js代码&#xff0c;可能是对环境进行检测&#xff0c;反调试之类的 无限debugger 处理办法 网上大部分人说的都是添加cookie来解决。 那个noscrip…