Java Web应用开发

侯玉香,聂军,雷秦川,骆丽华,陈道敏,苗莹莹,刘叶

目录

  • 1 Java Web概述
    • 1.1 任务导引
    • 1.2 动态网页技术介绍
    • 1.3 JSP的运行环境
    • 1.4 JSP的运行原理
    • 1.5 JSP程序开发模式
    • 1.6 JSP开发工具
    • 1.7 任务实施:搭建项目环境及公司主页设计
    • 1.8 学习测验
  • 2 JSP基本语法
    • 2.1 任务导引
    • 2.2 JSP的基本组成
    • 2.3 脚本元素
    • 2.4 指令元素
    • 2.5 动作元素
    • 2.6 任务实施
    • 2.7 学习测验
  • 3 服务器交互
    • 3.1 任务导引
    • 3.2 课堂实录
    • 3.3 JSP内置对象概述
    • 3.4 out对象
    • 3.5 request对象
    • 3.6 response对象
    • 3.7 session对象
    • 3.8 application对象
    • 3.9 其他内置对象
    • 3.10 任务实施:使用JSP内置对象实现登录和注销功能
    • 3.11 学习测验
  • 4 JavaBean技术
    • 4.1 任务引导
    • 4.2 JavaBean概述
    • 4.3 JavaBean的应用
    • 4.4 JavaBean的作用域
    • 4.5 任务实施
    • 4.6 JSP中的文件操作
    • 4.7 学习测验
  • 5 Servlet技术
    • 5.1 任务引导
    • 5.2 Servlet基础
    • 5.3 Servlet开发
    • 5.4 Servlet常用API
    • 5.5 任务实施
    • 5.6 章节测验
  • 6 第6章 过滤器和监听器
    • 6.1 任务导引
    • 6.2 Servlet过滤器
    • 6.3 过滤器创建与配置
    • 6.4 Servlet监听器
    • 6.5 Servlet3.0新特性
    • 6.6 任务实施
    • 6.7 学习测验
  • 7 Java Web的数据库操作
    • 7.1 任务导引
    • 7.2 JDBC技术
    • 7.3 使用JDBC驱动程序访问数据库
    • 7.4 数据库连接的JavaBean
    • 7.5 JDBC对事务的操作
    • 7.6 连接池技术
    • 7.7 任务实施
    • 7.8 扩展阅读
    • 7.9 章节测验
  • 8 JSP高级技术
    • 8.1 任务导引
    • 8.2 EL概述
    • 8.3 JSTL标签库简介
    • 8.4 JSTL核心标签
    • 8.5 JSP与Ajax
    • 8.6 任务实施
    • 8.7 扩展阅读
    • 8.8 学习测验
  • 9 JSP实用组件技术
    • 9.1 任务导引
    • 9.2 上传与下载组件
    • 9.3 发送E-mail
    • 9.4 JSP动态图表
    • 9.5 在线编辑器
    • 9.6 任务实施
  • 10 教学过程材料
    • 10.1 2024-2025学年第一学期
      • 10.1.1 教学大纲
      • 10.1.2 授课计划
      • 10.1.3 实训指导书
      • 10.1.4 教案
      • 10.1.5 课件PPT
    • 10.2 2024-2025学年第二学期
      • 10.2.1 教学大纲
      • 10.2.2 授课计划
      • 10.2.3 实训指导书
      • 10.2.4 教案
      • 10.2.5 课件PPT
    • 10.3 2025-2026学年第一学期
      • 10.3.1 教学大纲
      • 10.3.2 授课计划
      • 10.3.3 实训指导书
      • 10.3.4 教案
      • 10.3.5 课件PPT
    • 10.4 2025-2026学年第二学期
      • 10.4.1 教学大纲
      • 10.4.2 授课计划
      • 10.4.3 实训指导书
      • 10.4.4 教案
      • 10.4.5 课件PPT
  • 11 课外资料
    • 11.1 电子书
      • 11.1.1 JavaWeb从入门到精通
      • 11.1.2 JavaWeb开发详解
      • 11.1.3 JavaWeb开发之道
      • 11.1.4 深入体验JavaWeb开发内幕-核心基础
      • 11.1.5 学通JavaWeb的24堂课
      • 11.1.6 Java Web 程序设计
      • 11.1.7 Java Web程序设计教程
      • 11.1.8 Java Web设计与应用教程
      • 11.1.9 Java_Web编程新手自学手册
      • 11.1.10 Tomcat and Java Web 开发技术详解
      • 11.1.11 Spring Boot 2+Thymeleaf企业应用实战
      • 11.1.12 Spring Boot+Vue全栈开发实战
      • 11.1.13 Spring实战
      • 11.1.14 JavaEE 8+Tomcat 9
    • 11.2 教学视频
      • 11.2.1 JDBC基础教学视频
      • 11.2.2 JDBC高级应用教学视频
JavaBean的作用域

四 个 域 的 作 用 域 范 围 大 小 : page  < request < session < application 

1.page作用域

        page作用域在这4种类型中范围是最小的,客户端每次请求访问时都会创建一个JavaBean对象。JavaBean对象的有效范围是客户请求访问的当前页面文件,当客户执行当前的页面文件完毕后JavaBean对象结束生命。

(1)生命周期:当对 JSP的请求时开始,当响应结束时销毁。 

(2)作用范围:整个 JSP页面,是四大作用域中最小的一个,即超过这个页面就不能够使用 了。 (所以使用 pageContext 对象向其它页面传递参数是不可能的 .) 作用: 

            1)获取其它八大隐式对象,可以认为是一个入口对象。 

            2)获取其所有域中的数据 pageContext 操作所有域中属性的方法 :

public java.lang.Object getAttribute(java.lang.String name,int scope)

 public void setAttribute(java.lang.String name, java.lang.Object value,int scope)

 public void removeAttribute(java.lang.String name,int scope) 

            pageContext 中代表域的常量

PageContext.APPLICATION_SCOPE

 PageContext.SESSION_SCOPE

 PageContext.REQUEST_SCOPE 

PageContext.PAGE_SCOPE 

              findAttribute 方法 ,在四大域中搜寻属性,搜寻的顺序是 page 域、 request 域、 session 域、 application 域, 从小域到大域开始搜索,如果搜索到就直接获取该值,如果所有域中都找不到,返回一个 null(与 el 表达式不同,此处返回 null,对网页是不友好的 ) 

            3)跳转到其他资源,其身上提供了 forward 和 include 方法,简化重定向和转发的操作。

2.request作用域

当scope为request时,JavaBean对象被创建后,它将存在于整个request的生命周期内,request对象是一个内建对象,使用它的getParameter方法可以获取表单中的数据信息。

(1)生命周期: 在 service 方法调用前由服务器创建, 传入 service 方法。整个请求结束, request 生命结束。 

(2)作用范围:整个请求链(请求转发也存在) 。

( 3)作用: 在整个请求链中共享数据。最常用到:在 Servlet 中处理好的数据交给 Jsp 显示, 此时参数就可以放置在 Request 域中带过去。

3.session作用域 

        当scope为session时,JavaBean对象被创建后,它将存在于整个session的生命周期内.在同一个浏览器内,JavaBean对象就存在于一个session中。当重新打开新的浏览器时,就会开始一个新的session。每个session中拥有各自的JavaBean对象。 

         HttpSession 在服务器中, 为浏览器创建独一无二的内存空间, 在其中保存会话相关的信息。

 (1)生命周期:在第一次调用 request.getSession() 方法时,服务器会检查是否已经有对应的 session,如果没有就在内存 中创建一个 session并返回。 当一段时间内 session 没有被使用(默认为 30 分钟),则服务器会销毁该 session。 如果服务器非正常关闭(强行关闭) ,没有到期的 session也会跟着销毁。 如果调用 session 提供的 invalidate (),可以立即销毁 session。 注意:服务器正常关闭,再启动, Session 对象会进行钝化和活化操作。同时如果服务器钝 化的时间在 session 默认销毁时间之内, 则活化后 session 还是存在的。 否则 Session 不存在。 如果 JavaBean 数据在 session 钝化时,没有实现 Serializable 则当 Session活化时,会消失。 


(2)作用范围:一次会话。

4.application作用域

         当scope为application时,JavaBean对象被创建后,它将存在于整个主机或虚拟主机的生命周期内,application范围是JavaBean的生命周期最长的。

(1)生命周期:当 Web 应用被加载进容器时创建代表整个 web 应用的 ServletContext 对象, 当服务器关闭或 Web 应用被移除时, ServletContext 对象跟着销毁。 

(2)作用范围:整个 Web 应用。 

(3)作用:

 a) 在不同 Servlet 之间转发 this.getServletContext().getRequestDispatcher("/servlet/Demo10Servlet").forward(request,respo nse); 方法执行结束, service 就会返回到服务器, 再有服务器去调用目标 servlet ,其中 request 会重新创建,并将之前的 request 的数据拷贝进去。 

b) 读取资源文件。

 1)由于相对路径默认相对的是 java 虚拟机启动的目录,所以我们直接写相对路径将会是相 对于 tomcat/bin 目录,所以是拿不到资源的。 如果写成绝对路径,当项目发布到其他环境时,绝对路径就错了。

 2)为了解决这个问题 ServletContext 提供了: this.getServletContext().getRealPath( “ /1.properties ”),给进一个资源的虚拟路径,将 会返回该资源在当前环境下的真实路径。 this.getServletContext().getResourceAsStream( “ /1.properties ”),给一个资源的虚拟路径 返回到该资源真实路径的流。

 3)当在非 servlet 下获取资源文件时,就没有 ServletContext 对象用了,此时只能用类加载 器 classLoader.getResourceAsStream(“../../1.properties ”),此方法利用类加载器直接将资 源加载到内存中,有更新延迟的问题, 以及如果文件太大,占用内存过大。 classLoader.getResource(“../1.properties ”).getPath(),直接返回资源的真实路径,没有 更新延迟的问题。

案例4-4 测试JavaBean的作用域。

4_3.jsp:

<%@ page contentType="text/html;charset=UTF-8" %>

<%@ page language="java" import="ch4.Person" %>

<html>

<head><title>测试JavaBean的作用域</title>

</head>

<body>

<jsp:useBean id="person" class="ch4.Person" scope="application"></jsp:useBean> 

<jsp:setProperty name="person" property="name" value="lan"/>

<jsp:setProperty name="person" property="sex" value="男"/>

<jsp:setProperty name="person" property="age" value="18"/>

<br><a href="4_3.jsp">测试JavaBean的四个作用域</a>

</body>

</html>

点击超链接后,跳转到4_3.jsp,因为useBean的作用域是全局,所以从4_3.jsp页面也可以获得name、age。

4_4.jsp:

<%@ page contentType="text/html;charset=UTF-8" %>

<%@ page language="java" import="ch4.Person" %>

<html>

<head><title>测试JavaBean的作用域</title>

</head>

<body>

使用内置对象获取姓名和年龄

<hr>

application作用域:<br>

姓名:<%= ((Person)application.getAttribute("person")).getName() %><br>

年龄:<%= ((Person)application.getAttribute("person")).getAge() %> <br>

session作用域:<br>

姓名:<%= ((Person)session.getAttribute("person")).getName() %><br>

年龄:<%= ((Person)session.getAttribute("person")).getAge() %> <br>

<%--

request作用域:<br>

姓名:<%= ((Person)request.getAttribute("person")).getName() %><br>

年龄:<%= ((Person)request.getAttribute("person")).getAge() %> <br>

page作用域:<br>

姓名:<%= ((Person)pageContext.getAttribute("person")).getName() %><br>

年龄:<%= ((Person)pageContext.getAttribute("person")).getAge() %> <br>

--%>

</body>

</html>

用request的作用域时,4_3.jsp页面就不能获取值了,因为超链接是一个请求重定向,而request作用域只在一次请求里有效。可以将超链接改为

<%

        request.getRequestDispatcher("4_3.jsp").forward(request,response);

%>

但如果作用域是page,那就算服务器内部转发也不行了。因为只要换个页面,page就不能生效了。