14、JavaEE核心技术 - JavaBeans

三、JavaEE核心技术–JavaBeans

一、JavaBeans的定义

JavaBeans是一种遵循特定规范的Java类,允许它们被作为可重用组件使用。这些组件可以被图形化的建模工具(如Eclipse、NetBeans等)识别,并用于构建复杂的应用程序。JavaBeans的定义要求如下:

  1. 无参数构造函数:必须提供一个无参数的构造函数,可以是默认的,也可以是显式定义的。这个构造函数用于创建Bean的实例。
  2. 属性的getter和setter方法:Bean的属性必须通过getter和setter方法进行访问和修改。方法的命名遵循特定的规范:对于属性propertyName,对应的getter方法为getPropertyname(),setter方法为setPropertyName(type propertyname)
  3. 具体类:JavaBeans必须是一个具体类,不能是抽象类或接口,这样才能被实例化。
  4. 可序列化(可选):虽然不是必须的,但建议Bean实现java.io.Serializable接口,以便在需要时可以进行序列化操作,如通过网络传输或保存到文件中。

二、JavaBeans的作用

  1. 数据存储与传输:在Web应用中,JavaBeans常用于在不同的组件(如Servlet和JSP)之间传递数据。例如,将表单数据封装到一个Bean中,然后在Servlet中处理并传递给JSP页面显示。
  2. 封装业务逻辑:JavaBeans可以包含业务逻辑,通过方法调用来执行特定的操作,从而将业务逻辑与表现层(JSP)分离,提高代码的可维护性。
  3. 提供可重用性:JavaBeans的组件化特性使得它们可以在多个项目中重复使用,减少代码冗余,提高开发效率。

三、JavaBeans的作用域(Scope)

在Web应用中,JavaBeans的实例生命周期由其作用域决定。作用域定义了Bean的可访问范围和生命周期。常见的作用域包括:

1. Request Scope(请求作用域)
  • 定义:在单个HTTP请求的生命周期内有效。每次请求创建一个新的Bean实例,响应完成后实例被销毁。

  • 使用场景:适用于处理与当前请求相关的临时数据,如处理表单提交的数据。

  • 设置方式:

    // 在Servlet中创建Bean并设置为request作用域  
    MyBean bean = new MyBean();  
    bean.setAttribute("value", "requestScopeValue");  
    request.setAttribute("myBean", bean);  
    
    <!-- 在JSP中使用 -->  
    <jsp:useBean id="myBean" class="com.example.MyBean" scope="request" />  
    
2. Session Scope(会话作用域)
  • 定义:在一个用户会话的生命周期内有效。同一用户的多个请求共享同一个Bean实例,直到会话超时或用户退出。

  • 使用场景:适用于存储用户特定的数据,如购物车、用户偏好设置等。

  • 设置方式:

    MyBean bean = new MyBean();  
    bean.setAttribute("value", "sessionScopeValue");  
    session.setAttribute("myBean", bean);  
    
    <jsp:useBean id="myBean" class="com.example.MyBean" scope="session" />  
    
3. Application Scope(应用作用域)
  • 定义:在整个Web应用的生命周期内有效。所有用户共享同一个Bean实例,直到应用关闭。

  • 使用场景:适用于存储全局配置信息、应用层面的数据,如统计信息、公共配置参数等。

  • 设置方式:

    MyBean bean = new MyBean();  
    bean.setAttribute("value", "applicationScopeValue");  
    application.setAttribute("myBean", bean);  
    
    <jsp:useBean id="myBean" class="com.example.MyBean" scope="application" />  
    
4. Page Scope(页面作用域)
  • 定义:仅在当前JSP页面的生命周期内有效。一旦页面被转发或重定向,Bean实例将被销毁。

  • 使用场景:适用于在同一页面内多次访问属性的场景。

  • 设置方式:

    <jsp:useBean id="myBean" class="com.example.MyBean" scope="page" />  
    

四、JavaBeans的生命周期

每个作用域下的Bean实例生命周期如下:

  1. Request Scope:Bean实例在每次HTTP请求时创建,响应完成后销毁。
  2. Session Scope:Bean实例在用户会话开始时创建,在会话超时或invalidate时销毁。
  3. Application Scope:Bean实例在Web应用启动时创建,在应用关闭时销毁。
  4. Page Scope:Bean实例在JSP页面开始处理时创建,页面完成处理后销毁。

五、使用JavaBeans的示例

1. 定义一个简单的JavaBean
public class User {  private String username;  private String password;  public User() {  // 无参数构造函数  }  public String getUsername() {  return username;  }  public void setUsername(String username) {  this.username = username;  }  public String getPassword() {  return password;  }  public void setPassword(String password) {  this.password = password;  }  
}  
2. 在JSP中使用JavaBean
<!-- 使用useBean标签创建Bean -->  
<jsp:useBean id="user" class="com.example.User" scope="request" />  <!-- 设置Bean的属性 -->  
<jsp:setProperty name="user" property="username" value="johnDoe" />  
<jsp:setProperty name="user" property="password" value="secret" />  <!-- 获取Bean的属性并显示 -->  
<p>Username: <jsp:getProperty name="user" property="username" /></p>  
<p>Password: <jsp:getProperty name="user" property="password" /></p>  
3. 使用EL(Expression Language)访问Bean的属性
${user.username}  
4. 在Servlet中处理JavaBean
public class LoginServlet extends HttpServlet {  @Override  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  User user = new User();  user.setUsername(req.getParameter("username"));  user.setPassword(req.getParameter("password"));  req.setAttribute("user", user);  req.getRequestDispatcher("/result.jsp").forward(req, resp);  }  
}  

六、常见应用场景

  1. 表单处理:将用户输入的表单数据封装到JavaBean中,在Servlet中进行处理,然后传递给JSP显示结果。
  2. 用户会话管理:存储用户的会话信息,如购物车内容、用户偏好设置等。
  3. 数据传递:在不同的Servlet和JSP之间安全地传递数据,保持代码的模块化和可维护性。
  4. 业务逻辑封装:将复杂的业务逻辑封装在JavaBean中,以提高代码的可重用性和可维护性。

七、最佳实践

  1. 正确使用作用域:根据数据的使用范围选择合适的scope,避免在不需要的高作用域中存储数据,防止内存泄漏或数据混乱。
  2. 遵循Encapsulation原则:确保Bean的属性通过getter和setter方法进行访问和修改,增强数据的安全性和封装性。
  3. 合理实现序列化:如果Bean需要在不同的JVM之间传输,或者需要保存到持久存储中,确保Bean实现了Serializable接口。
  4. 避免过多的状态:在高作用域(如application scope)中避免存储过多的状态,特别是那些对每个用户都是独特的数据。这样可以减少内存占用,提高应用的性能。
  5. 及时处理异常:在Bean的方法中确保正确处理异常,避免由于异常未被处理导致的潜在问题。

八、总结

JavaBeans作为JavaWeb开发中的核心组件,通过其灵活的作用域和组件化的特性,帮助开发者高效地管理和传递数据。理解和合理使用JavaBeans,可以显著提高Web应用的结构清晰度、可维护性和性能。通过实践和不断的学习,掌握JavaBeans的使用技巧,对于构建高效、稳定的Web应用至关重要。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卡尔曼滤波算法从理论到实践:在STM32中的嵌入式实现

摘要&#xff1a;卡尔曼滤波&#xff08;Kalman Filter&#xff09;是传感器数据融合领域的经典算法&#xff0c;在姿态解算、导航定位等嵌入式场景中广泛应用。本文将从公式推导、代码实现、参数调试三个维度深入解析卡尔曼滤波&#xff0c;并给出基于STM32硬件的完整工程案例…

【Linux】:线程池

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来线程池相关的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构…

SpringMVC (一)基础

目录 SpringMVC 一 简单使用 1 新建模块选择指定参数 2 创建实现类 3 将项目启动 4 运行结果&#xff1a;在浏览器当中响应执行 二 RequestMapping 三 请求限定 SpringMVC SpringMVC是Spring的web模块&#xff0c;用来开发Web应用&#xff0c;SpringMVC应用最终作为B/…

tomcat应用的作用以及安装,以及tomcat软件的开机自启动。

一.tomcat介绍 1.作用 tomcat是一款用来部署网站服务器的一款软件。 动态网站主流语言&#xff1a; PHP, lamp/lnmp平台 Java语言&#xff0c;运行在tomcat平台。【只要这个网站或者软件是Java语言写的&#xff0c;我们都可以在tomcat平台上去运行这个java程序。】 网站是…

CSDN博客:Markdown编辑语法教程总结教程(下)

❤个人主页&#xff1a;折枝寄北的博客 Markdown编辑语法教程总结 前言1. LaTex数学公式2. 插入不同类别的图2.1 插入甘特图2.2 插入UML图2.3 插入Mermaid流程图2.4 插入Flowchart流程图2.5 插入classDiagram类图 3. CSDN快捷键4. 字体相关设置4.1 字体样式改变4.2 字体大小改变…

AI模型的构建过程是怎样的(下)

你好,我是舒旻。 上节课,我们讲了一个模型构建的前 2 个环节,模型设计和特征工程。今天,我们继续来讲模型构建的其他 3 个环节,说说模型训练、模型验证和模型融合中,算法工程师的具体工作内容,以及 AI 产品经理需要掌握的重点。 模型训练 模型训练是通过不断训练、验证…

K邻近算法

K邻近算法 1 算法介绍 1.1 什么是K-NN K-NN&#xff08;K Near Neighbor&#xff09;&#xff1a;k个最近的邻居&#xff0c;即每个样本都可以用它最接近的k个邻居来代表。K-NN算法属于监督学习方式的分类算法&#xff0c;即计算某给点到每个点的距离作为相似度的反馈。简单…

晋升系列4:学习方法

每一个成功的人&#xff0c;都是从底层开始打怪&#xff0c;不断的总结经验&#xff0c;一步一步打上来的。在这个过程中需要坚持、总结方法论。 对一件事情长久坚持的人其实比较少&#xff0c;在坚持的人中&#xff0c;不断的总结优化的更少&#xff0c;所以最终达到高级别的…

LoRA,DoRA,RSLoRA,LoRA+ 是什么

LoRA,DoRA,RSLoRA,LoRA+ 是什么 一、LoRA(Low-Rank Adaptation,低秩适应) 核心原理:冻结预训练模型参数,仅在每层插入两个低秩矩阵(A∈R^{rd}, B∈R^{dr}),通过分解权重增量ΔW=BA近似全秩更新,参数量仅为全量微调的0.01%-1%。 举例:在GPT-2(774M参数)的注意力…

HTTP发送POST请求的两种方式

1、json String json HttpRequest.post(getUrl(method, "v1", url, userId, appKey)).header("Content-type", "application/json") // 设置请求头为 JSON 格式.body(JSONUtil.toJsonStr(params)) // 请求体为 JSON 字符串.execute().body(); …

TCP并发服务器

单循环服务器&#xff1a;服务器在同一时刻只能响应一个客户端的需求。 并发服务器&#xff1a;服务器在同一时刻可以响应多个客户端的需求。 构建TCP服务器的方法&#xff1a; IO多路复用的函数接口[select() poll() epoll()] 1.多进程实现TCP并发服务器 #include <s…

【大模型统一集成项目】如何封装多个大模型 API 调用

&#x1f31f; 在这系列文章中&#xff0c;我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程&#xff0c;从 架构设计 到 代码实战&#xff0c;逐步搭建一个支持 多种大模型&#xff08;GPT-4、DeepSeek 等&#xff09; 的 一站式大模型集成与管理平台&#xff…

Linux基础开发工具—vim

目录 1、vim的概念 2、vim的常见模式 2.1 演示切换vim模式 3、vim命令模式常用操作 3.1 移动光标 3.2 删除文字 3.3 复制 3.4 替换 4、vim底行模式常用命令 4.1 查找字符 5、vim的配置文件 1、vim的概念 Vim全称是Vi IMproved&#xff0c;即说明它是Vi编辑器的增强…

数据结构与算法效率分析:时间复杂度与空间复杂度详解(C语言)

1. 算法效率 1.1 如何衡量一个算法的好坏&#xff1f; 在计算机程序设计中&#xff0c;衡量算法优劣的核心标准是效率。但效率不仅指运行速度&#xff0c;还需要综合以下因素&#xff1a; 时间因素&#xff1a;算法执行所需时间 空间因素&#xff1a;算法运行占用的内存空间…

使用arm嵌入式编译器+makefile编译管理keil项目

目录 # arm嵌入式编译器-知识 # arm嵌入式编译器-知识 --- arm嵌入式编译器&#xff08;百度云盘&#xff09;下载&#xff1a;arm嵌入式编译器 keil&#xff0c; 链接 提取码: 8a6c arm官方使用教程&#xff1a; Arm Compiler 6 User Guide linux 安装完了有个非常重要的一步…

SwiftUI学习笔记day1---Stanford lecture1

SwiftUI学习笔记day1—Stanford lecture1 课程链接&#xff1a;Lecture 1 | Stanford CS193p 2023课程大纲&#xff1a;代码仓库&#xff1a;github/iOS 文章目录 SwiftUI学习笔记day1---Stanford lecture11.在Xcode中创建一个swiftUI的工程2.简单认识Xcode这个IDE3.尝试理解示…

vanna+deepseekV3+streamlit本地化部署

文章目录 1、vanna介绍1.1、基本介绍1.2、工作原理1.3、优点 2、vannadeepseekV3mysqlstreamlit本地化部署2.1、创建conda环境&#xff0c;安装依赖2.2、Mysql数据准备2.3、新建pycharm项目2.4、封装deepseek大模型2.5、定义MyVanna2.6、构建streamlit的app2.7、app演示 1、van…

【LangChain接入阿里云百炼deepseek】

这是目录 前言阿里云百炼注册账号使用代码执行结果 前言 大模型爆火&#xff0c;现在很多教程在教怎么使用大模型来训练Agent智能体&#xff0c;但是大部分教程都是使用的OpenAI。 最近阿里云推出DeepSeek-R1满血版&#xff0c;新用户可享100万免费Token额度。 今天就教大家怎…

【优选算法】二分法(总结套路模板)

目录 1. 题目一 &#xff1a;二分查找 解题思路&#xff1a; 模板总结&#xff08;简单版&#xff0c;不适用所有情况&#xff09; 代码实现&#xff1a; 2. 题目二 解题思路&#xff1a; 模板总结&#xff08;几乎万能&#xff09; 代码实现&#xff1a; 3. 题目…

Qt开源控件库(qt-material-widgets)的编译及使用

项目简介 qt-material-widgets是一个基于 Qt 小部件的 Material Design 规范实现。 项目地址 项目地址&#xff1a;qt-material-widgets 本地构建环境 Win11 家庭中文版 VS2019 Qt5.15.2 (MSVC2019) 本地构建流程 克隆后的目录结构如图&#xff1a; 直接使用Qt Crea…