servlet和jsp核心编程(第2版)第十三章 在JSP页面中包含文件和applet学习笔记

本文详细阐述了JSP页面中如何利用jsp:include动作、include指令和jsp:plugin动作来包含文件及applet。重点讨论了在请求期间包含页面的方法、页面转换期间的文件包含、使用jsp:forward转发请求以及包含使用java插件的applet的技巧。
[size=x-large]第十三章 在JSP页面中包含文件和applet[/size]
本章论述jsp:include动作,include指令,jsp:plugin动作
[size=large]一、在请求期间包含页面jsp:include[/size]
[size=medium]1[/size].首先这个include动作,是在主页面被请求时,将include所引用的内容的输出包含进来,注意是次级页面的输出,我们可以这样理解,在访问主页面时,如果使用了jsp:include,则服务器对这个include中的URL进行解释,以通常的方式运行该页面,然后将该次级页面的输出包含进来。也就是将主次页面的输出合并在一起后输出。这种行为和RequestDispatcher类的include方法相同。

[size=medium]2[/size].<重点提示>对以斜杠开头的URL,服务器和浏览器的解释是不同的,服务器总是相对于当前WEB应用对他们进行解释,浏览器总是相对于服务器的根目录对他们进行解释。我们可以这样理解,如果是用户请求的一个URL,或者说是客户(浏览器去处理的一
个URL),那么就是以服务器的根目录来解释,比如:
<a href = "/MyTest1/test.jsp">
形成的URL为http://localhost:8080/MyTest1/test1.jsp其中MyTest1是其项目名。但是如果为
<jsp:include page = "/test.jsp">
形成的URL就
为:http://localhost:8080/MyTest1/test1.jsp。注意其中的page属性。

[size=medium]3[/size].<核心方法>由于jsp:include所包含的页面一般不是完整的页面,所以我们可以把它放在WEB-INF目录中,这样用户就不会偶然访问到他们了。

[size=medium]4[/size].flush属性,表示将页面包含进来之前是否应该清空主页面的输出流。

[size=medium]5[/size].<核心方法>不要将完整的HTML文档作为被包含的页面,被包含页面中只能含有适合于出现在文件插入点处的HTML标签。 注意这里是HTML文档不需要是完整的,包括JSP文档,我们需要查看其生成的html代码,并将其交给html验证器。

[size=medium]6[/size].jsp:param 增加请求参数,如果使用了jsp:param指定了参数,那么由jsp:param所指的值仅在被包含文件中优先采用。不会出现在主页面中。

[size=large]二、在页面转换期间包含文件:include指令[/size]
[size=medium]1[/size].include指令可以在主JSP文档转换为servlet(一般在它首次被访问时),将文件包含到文档中。
<%@include file = "Relative URL"%>

我们可以理解为,当主页面转换为servlet时,将include指令所引入的页面合成进来,然后一起转换为servlet。这就意味着include指令。

[size=medium]2[/size].和include动作的主要区别就是它们的调用时间不同,include指令在页面转换为servlet时调用,而include动作则在页面请求时调用,然后服务器分别解释两个URL,将它们的输出合并在一起。

[size=medium]3[/size].<核心方法>对于文件包含,应该尽可能使用include动作。仅在所包含的文件中定义了主页面要用到的字段或方法,或者所包含的文件设置了主页面的响应报头时,才使用include指令。这是因为include动作更加易于维护:主页面不需要知道次页面是否需要更改。

[size=medium]4[/size].既然include指令不便于维护,为什么有时还要使用他呢,因为次页面所包含的内容可以影响到主页面,而这时include动作无法完成的内容。

[size=medium]5[/size].<警告>因为并不要求检测包含的页面什么时候发生更改,所以如果我们更改了被包含的文件,必须更新所有使用它的jsp文件的修改日期。我们往往通过在顶级页面中写入一段JSP注释,当被包含文件发生改变时更新这段注释。

[size=medium]6.[/size]特别要注意脚本重用的问题,比如我们写了一个用于计算访问计数的脚本,如果我们在一个页面中使用include动作,那么这个计算访问计数的脚本转换的servlet就为一个单独的servlet,那么这个单独的servlet就属于整个网站,也就是说计算的是整个网的访问计数,而无论用户访问哪个页面,总访问计数都会加1,所以显示的访问计数就是整个网站的访问计数。而如果我们使用include指令,那么由于这个脚本和当前主页面一起形成一个servlet,所以这个脚本就计算的是当前页面的访问计数,虽然网站中的页面都使用该脚本,但是他们的访问计数都不经相同,它显示的就是各自页面的访问计数。

[size=large]三、使用jsp:forward转发请求[/size]
[size=medium]1[/size].如果使用jsp:forward 则主页面不能含有任何输出,因为我们转到了jsp:forward所指的页面,原来的页面的输出显示出来也会被覆盖,我们推荐完全避免使用jsp:forward,转而由servlet调用RequestDispacher的forward方法。

[size=large]四、包含使用java插件的applet[/size]
[size=medium]1[/size].<核心方法>不管您选择applet的哪种方式,applet的.class文件都必须放在浏览器能够访问的目录中,不要将它们放在WEB-INF/classes目录中,使用它们的是浏览器,不是服务器。

[size=medium]2[/size].如果是小型项目,用户又是使用老的浏览器,怎可以用JDK1.1或1.2开发applet,但是我们不能使用java 2D,不能使用java 2集合包;如果我是小型项目,用户使用的是IE6以上或Netscape6或以上。我们可以让用户安装java运行环境JRE(1.4),然后使用
JDK开发;如果是大型项目,一般,我们让用户安装java2插件,使用java2 开发applet。我们可以到[url]http://java.sun.com/products/plugin/[/url]下载这个插件。
[size=medium]3[/size].但遗憾的是在某些浏览器中,常规的applet标签不能包含一些插件,这就需要我们针对不同浏览器使用<object>或是<embed>包含这些插件,但是我们还要判断浏览器类型,比较繁琐,<重点提示>所以我们使用<jsp:plugin>,这个元素不向浏览器添加 任何java能力,它只是简化了笨重的OBJECT和EMBED标签的创建工作,java2插件需要这两个标签,也就是说这个标签主要用于引入插件。

[size=medium]4[/size].jsp:param和jsp:params元素,说这两个标签不是为了说它的功能,而是说他们所遵循的xml语法,首先属性名必须小写,属性值必须在单引号或双引号中,同时元素以/>结束。且所有的<jsp:param>必须在<jsp:params>中。

[size=medium]5[/size].jsp:fallback向不支持object或embed的浏览器提供一段替换性文字。如:
<applet code = "MyApplet.class" width = 475  height = 350>
<b>Error:this example requires java.</b>
</applet>

<jsp:plugin type = "applet" width = "475" height =" 350 ">
<jsp:fallback>
<b>Error:this example requires java.</b>
</jsp:fallback>
</jsp:plugin>
**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值