第21篇 JSP指令

JSP指令(JavaServer Pages Directives)是JSP页面中的一种特殊语句,它们以`<%@ %>`的形式存在,并且不是发送给浏览器的输出内容,而是由JSP容器(如Apache Tomcat)在将JSP页面转换为Servlet时解析并执行的。JSP指令主要用于向容器提供有关如何处理整个页面或者页面中特定部分的信息。

以下是JSP中的主要指令类型:

1. **page指令**:
   - 用于定义单个JSP页面的全局属性,如脚本语言(默认为Java)、字符编码、MIME类型(contentType)、是否启用会话(session)、错误页面的设置(errorPage)、是否作为错误处理页面(isErrorPage)以及导入所需的Java包等。

2. **include指令**:
   - 包括两种形式:静态包含

<%@ include file="relativeURL" %>

和动态包含

<jsp:include page="relativeURL" />


   - 静态包含会在JSP转换为Servlet阶段将指定文件的内容合并到当前文件中,如同原始文件的一部分。
   - 动态包含则是在运行时执行包含操作,允许每次请求时根据条件动态插入不同的内容。

3. **taglib指令**:
   - 用于引入自定义标签库或标准标签库(如JSTL),使JSP页面能够使用扩展功能的标签。
   - 格式为:

<%@ taglib prefix="namespacePrefix" uri="tagLibraryURI" %>

除了以上提到的三个主要指令外,还有一些动作指令(Action Elements),它们以`<jsp:actionName>`的形式出现,比如:

- `jsp:forward`:用于将请求转发至其他资源。
- `jsp:include`(动作形式):类似于动态包含指令,也是在运行时包含其他资源,但可以传递参数。
- `jsp:useBean`:查找或实例化一个JavaBean对象。
- `jsp:setProperty` 和 `jsp:getProperty`:用于设置和获取JavaBean对象的属性值。

这些指令和动作元素一起增强了JSP页面的功能性和可维护性。

JSP指令和动作元素在实际开发中扮演着重要的角色,有助于开发者组织代码结构,提高代码重用率,同时简化了动态网页的开发过程。下面是一些额外的说明和示例:

4. **include指令的详细应用**:
   使用静态包含指令可以方便地复用JSP页面中的公共部分,例如页头、页脚、导航菜单等。例如:
   ```jsp

   <%@ include file="/common/header.jsp" %>


   ```
   这将会在编译阶段将`header.jsp`的内容嵌入到当前JSP页面中。

5. **taglib指令的详细应用**:
   通过taglib指令引入标签库后,可以在JSP页面中使用自定义标签。例如引入JSTL核心标签库:
   ```jsp

   <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


   ```
   引入库后,便可在JSP中使用如`<c:out>`, `<c:if>`, `<c:forEach>`等便捷标签进行数据输出、条件判断和循环遍历等操作。

6. **动作元素补充**:
   - `jsp:param`:与`jsp:include`或`jsp:forward`配合使用,用于传递参数。
   - `jsp:attribute`:与定制标签一起使用,用来设置标签体内的属性值。
   - `jsp:useBean`不仅可以查找或实例化JavaBean对象,还可以结合`scope`属性指定其作用范围,如request、session或application。

总的来说,熟练掌握和合理运用JSP指令和动作元素,可以帮助开发者构建出更高效、更具可维护性的Web应用程序。

7. **jsp:useBean动作元素的深入应用**:
   `jsp:useBean`动作元素主要用于查找或创建一个JavaBean对象,并将其绑定到指定的作用域中。例如:

   ```jsp
 

 <%@ page import="com.example.MyBean" %><jsp:useBean id="myBean" class="com.example.MyBean" scope="session">


       <!-- 如果session作用域中没有该bean,则会调用无参构造函数创建一个新的实例 -->
 

 </jsp:useBean>

 

 <jsp:setProperty name="myBean" property="name" value="John Doe" />


   <!-- 设置JavaBean对象的属性值 -->

 

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


   <!-- 获取JavaBean对象的属性值,此处将输出"John Doe" -->
   ```

8. **JSP动作元素的其他示例**:

   - `jsp:forward`:用于将请求转发到另一个资源,包括JSP页面、Servlet或HTML文件等。
     ```jsp
 

   <jsp:forward page="/anotherPage.jsp" />


     ```

   - `jsp:plugin`:用于生成适合于客户端插件(如Java Applet或Adobe Flash)的OBJECT或EMBED标签。
     ```jsp
   

 <jsp:plugin type="applet" code="MyApplet.class" width="300" height="300" />


     ```

9. **综合运用指令和动作元素的优势**:
   在实际开发过程中,JSP指令和动作元素的灵活运用,能有效减少重复代码,增强程序结构的清晰度,同时提高开发效率。例如,通过`page`指令配置全局属性,利用`include`指令实现页面模块化,借助`taglib`指令引入标签库简化常见任务,以及通过动作元素实现动态内容生成和控制流程,使得JSP页面编程更加简洁且易于管理。

10. **自定义标签库(Custom Tag Libraries)与JSP标签**:
    JSP除了内置的动作元素外,还支持开发者自定义标签库以扩展功能。自定义标签库通过`<%@ taglib %>`指令引入,并使用自定义标签来封装复杂或者常用的功能块。

    ```jsp
   

 <%@ taglib prefix="myTags" uri="http://example.com/mytags" %>


    
    <!-- 使用自定义标签 -->
   

 <myTags:customTag attribute="value" />


    ```

    上述例子中,`prefix`属性定义了在JSP页面中使用的前缀,而`uri`属性则指定了标签库的统一资源标识符(URI)。开发者可以编写标签处理器类来处理这些自定义标签,并在标签库描述符(TLD)文件中定义它们的行为和属性。

11. **EL表达式(Expression Language)**:
    自JSP 2.0起,引入了Expression Language作为简化JSP页面中数据访问和表达式计算的标准方式。它允许直接访问JavaBean属性、数组、列表、映射、上下文范围变量等。

    ```jsp
   

 ${sessionScope.myBean.name}


    ```

    上述EL表达式将会从session作用域中查找名为`myBean`的对象,并获取其`name`属性的值。

12. **JSTL(JavaServer Pages Standard Tag Library)**:
    JSTL是一组标准标签库,包含核心标签库(Core Tags)、SQL标签库、XML标签库、函数标签库等,极大地增强了JSP的功能并减少了脚本元素的使用。例如,使用JSTL的条件标签可以更清晰地执行逻辑判断:

    ```jsp

    <c:if test="${not empty myBean}">The bean is present and its name is ${myBean.name}.</c:if>


    ```

综上所述,通过合理运用JSP的各种指令、动作元素、自定义标签库、EL表达式以及JSTL,开发人员能够构建出结构清晰、可维护性高的Web应用程序,并有效分离视图层与业务逻辑层。

13. **JSP注释与隐藏注释**:
   - **普通注释**:JSP页面中可以使用HTML注释方式对代码进行注解,这类注释会被发送到客户端,但在浏览器中不会显示。
     ```jsp
     <!-- 这是一个普通的HTML注释 -->
     ```

   - **JSP注释**:使用`<%-- --%>`包裹的内容是JSP注释,它们不会被发送到客户端,仅用于服务器端代码的注释。
     ```jsp
     <%-- 这是一个JSP注释,不会出现在客户端 --%>
     ```

14. **Scriptlet与避免过度使用**:
   JSP中的Scriptlet是指在`<% ... %>`标签内编写的Java代码片段,虽然提供了直接在JSP页面中嵌入Java代码的能力,但过度使用会导致MVC架构分离不彻底,降低代码的可读性和可维护性。现代Web开发通常推荐采用MVC架构,将业务逻辑转移到Servlet或Controller中处理,而在JSP中尽量只保留与视图展示相关的逻辑。

15. **JSP的生命周期**:
   JSP页面的生命周期涉及多个步骤,包括翻译、编译、实例化、服务和销毁。当首次请求JSP页面时,JSP容器会将JSP页面转换成Servlet源码,然后编译为字节码文件,接着实例化为Servlet并初始化。后续请求时,已编译的Servlet会响应请求,处理用户交互,最后在应用关闭或超出作用域时销毁。

通过理解并有效地使用上述JSP特性,开发者可以更好地优化Web应用程序的开发过程和性能,同时遵循良好的编程实践,提高项目的整体质量和稳定性。随着技术发展,如今更多项目倾向于使用如JSF、Spring MVC、Thymeleaf等更为现代化的框架替代传统的JSP进行视图层开发,以适应更高的可维护性和组件化需求。

16. **JSP的错误处理**:
   JSP提供了错误处理机制,可以通过`page`指令的`errorPage`属性指定错误发生时转向的页面。例如:   ```jsp

   <%@ page isErrorPage="true" %><%@ page errorPage="error.jsp" %><%!void doSomething() throws Exception {// 如果此方法抛出异常,JSP引擎会自动转向到error.jspthrow new Exception("An error occurred.");}%>


   ```

   上述代码中,`isErrorPage="true"`表示当前JSP页面本身就是一个错误处理页面,它可以访问特殊的对象`exception`来获取错误信息。`errorPage="error.jsp"`则指定了在当前页面内部抛出未捕获异常时应跳转的目标页面。

17. **JSP与MVC模式的契合**:
   尽管JSP本身并不严格遵循MVC模式,但它可以与Servlet和JavaBean一起构成MVC模型。在MVC架构下,Servlet负责处理HTTP请求,执行业务逻辑,并将数据填充到JavaBean对象中;JSP则专注于渲染视图,通过EL表达式和JSTL标签从JavaBean中读取并展示数据。

18. **JSP与现代Web开发趋势**:
   虽然JSP曾经是Java Web开发的重要组成部分,但随着前端技术的发展和前后端分离理念的普及,越来越多的现代Web框架开始提倡将视图层和业务逻辑进一步解耦,如React、Vue.js等前端框架负责界面渲染,而Java后端则专注API接口的设计与实现。尽管如此,对于一些需要服务器端模板渲染的场景,JSP仍然是一种可行的技术选择,尤其是在现有基于Java EE的传统企业级应用中。

总之,了解和掌握JSP的基本原理和高级特性对于Java Web开发者来说非常重要,这不仅有助于理解和维护现有的系统,而且也有助于更好地认识Web开发演变的过程和技术演进的方向。

19. **JSP Fragment(片段)**:
   JSP片段是JSP中的一段可重用的代码块,通过 `<jsp:declaration>` 标签定义。片段定义的代码不会直接输出,而是作为一个局部变量供页面内的其他地方调用。这对于封装和复用复杂的模板代码非常有用。   ```jsp
   <%-- 定义一个JSP片段 --%>
 

  <jsp:declaration>String greeting = "Hello, World!";</jsp:declaration><%-- 使用JSP片段 --%><%= greeting %>


   ```

20. **JSP标记文件(JSP Tag Files)**:
   JSP 2.1版本引入了标记文件的概念,它允许开发者定义自己的“用户自定义标记”(User-defined Tags,UDT),并且具有比传统自定义标签更灵活的结构和更好的可读性。标记文件通常以`.tag`为扩展名,它们可以包含任意的JSP元素,包括其他自定义标签、EL表达式、脚本片段等。   ```jsp
 

  <%@ tag description="A simple greeting tag" pageEncoding="UTF-8" %><%@ attribute name="name" required="true" rtexprvalue="true" %><div>Hello, <span>${name}</span>!</div>


   ```

   上述代码定义了一个简单的自定义标签,它接受一个必需的`name`属性,并在其内部渲染问候语。

总结起来,尽管现代Web开发已经倾向于使用前后端分离的架构和更为丰富的前端框架,但JSP仍然是Java Web开发领域不可或缺的一部分,尤其在那些需要服务器端模板渲染或者遗留系统的维护升级场景中。通过对JSP各种特性和最佳实践的理解和掌握,开发者可以更高效地构建和维护Web应用。

 

 

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

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

相关文章

如何帮助中小企业建立数字化的能力?

中小企业建立数字化的能力&#xff0c;可以从以下几个方面着手&#xff1a; 1、开展数字化评估&#xff1a;中小企业首先需要对自己的数字化基础水平和企业经营管理现状进行评估&#xff0c;这包括了解企业在数字化方面的现有能力和需求&#xff0c;以及内外部转型资源的可用性…

[创业之路-106] :经济学十大陷阱与核心思想:系统论、社会进化论、周期论、阴阳互转论

目录 前言&#xff1a; 一、流动性陷阱。 二、中等收入陷阱。 三、修昔底德陷阱。 四、塔西佗陷阱。 五、金德尔伯格陷阱。 六、卢梭陷阱。 七、拉美陷阱。 八、阿喀琉斯之踵。 九、布拉德伯里悖论。 十、李约瑟之谜 结论&#xff1a;上述陷阱的…

Oracle-操作【Python-cx_oracle】

一、cx_oracle 1 简介 通过Python扩展模块cx_Oracle访问Oracle数据库cx_Oracle通常使用 pip 安装Oracle 客户端库需要单独安装 2 特点 支持多个 Oracle 客户端和数据库版本执行 SQL 和 PL/SQL 语句广泛的 Oracle 数据类型支持&#xff0c;包括大型对象&#xff08;CLOB 和 …

AI智能客服机器人原来这么好用,企业再不使用就落伍了!

随着人工智能技术的不断成熟&#xff0c;AI智能客服机器人已经变得越来越智能&#xff0c;它们正逐渐成为企业提供客户服务的强大助手。企业若不开始部署这种高效的技术&#xff0c;可能会在竞争中失去先机。下面&#xff0c;让我们来看看AI智能客服机器人为何如此好用&#xf…

vue +antvX6 根据节点与线,动态设置节点坐标生成流程图

需求 vue2 + antvX6完成流程图,但只有节点与线,没有节点的坐标,需要根据节点的顺序显示流程图。 需求: 1.根据数据动态生成对应的节点与线; 2.节点不能重叠; 3.节点与线可拖拽; 4.因为线存在重叠可能,所有鼠标移入时线必须高亮显示(红色),鼠标移出复原; 5.要求有…

Spring-基于xml自动装配

版本 Spring Framework 6.0.9​ 1. 定义 Spring IoC容器在无需显式定义每个依赖关系的情况下&#xff0c;根据指定的策略&#xff0c;自动为指定的bean中所依赖的类类型或接口类型属性赋值。 2. 关键配置元素 BeanDefinitionParserDelegate类定义了autowire属性的属性值&…

绿联 安装transmission

绿联 安装transmission及中文UI 1、镜像 linuxserver/transmission:latest 2、安装 2.1、创建容器 按需配置权重。 2.2、基础设置 2.3、网络 桥接即可。 注&#xff1a;如果使用IPV6&#xff0c;请选择"host"模式。 注&#xff1a;如果使用IPV6&#xff0c;请选…

《亲密关系》一书摘要

1.人们常常能深切感受到影响自己行为的外部压力&#xff0c;因而对自己行为的解释容易做出外部归因。但他们注意不到同样的环境也会影响他人&#xff0c;从而在解释他人的行为时&#xff0c;常常归因于他们内部的原因&#xff0c;如性格。即便是你最亲密的伴侣也很少能真正理解…

Git禁止松散对象loose objects弹窗

打开仓库时&#xff0c;弹窗如图 This repository currently has approximately XXXX loose objects.解决办法&#xff1a;见How to skip “Loose Object” popup when running ‘git gui’ Git v1.7.9 或以上版本&#xff0c;执行git config --global gui.gcwarning false

【计算机毕业设计】面向学生成绩分析系统产品功能介绍——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

NIO之ByteBuffer

NIO中的ByteBuffer是缓冲区&#xff0c;其中有几个比较重要的属性capacity&#xff0c;position和limit。 capacity&#xff1a; 其中&#xff0c;capacity是缓冲区的容量大小&#xff0c;在分配内存空间后不会改变。 limit&#xff1a; limit是限制位置&#xff0c;在读写模…

前端crypto-js, 文件加密,判断相同文件、图片(MD5,SHA256)

文章目录 前情提要应用场景实战解析最后前情提要 大家好,今天我们来接触一个库crypto-js 没错,上面是有道翻译的截图,为了我们得到的信息更权威,这个库是用来加密的,但介绍是说,已经停止维护,但并不影响我们在前端项目中的使用,所以学学也没有坏处 应用场景 判断图片…

亿发:新修订器械GSP重大变化,医疗器械GSP软件助力适应科学监管

随着医疗器械行业的快速发展和监管要求的提升&#xff0c;国家药监局近期发布了新修订的医疗器械GSP&#xff08;Good Storage Practice&#xff09;规范&#xff0c;旨在加强医疗器械流通环节的质量管理和监督&#xff0c;确保医疗器械的安全、有效和可追溯。这一重大变化为医…

万益蓝Wonderlab益生菌:吃雪糕的自由,我终于找回来了!

虽然现在不是夏天&#xff0c;但是我必须要来说一下&#xff01;我不仅在夏天可以吃雪糕&#xff01;冬天吃也完全没有问题&#xff01; 夏天&#xff0c;对于很多人来说&#xff0c;是雪糕、冷饮和冰镇西瓜的代名词。但对于我&#xff0c;这简直就是个“禁区”。每次看着别人…

SpringBoot项目启动的时候直接退出了?

SpringBoot项目启动的时候直接退出了&#xff1f; 如下图&#xff1a; 在启动SpringBoot项目的时候仅仅用了1.209s&#xff0c;然后直接退出了&#xff0c;也没有出现启动的项目对应的服务器端口号&#xff1f;为什么会这样呢&#xff1f;因为既然有服务器端口号 那么肯定会有…

神经网络学习工具分享(一)

1.Roboflow 标注数据集&#xff0c;并自动转换为可直接训练的格式。 Roboflow: Give your software the power to see objects in images and video 2.Papers With Code 既可以看论文&#xff0c;也可以连接论文上面github上面的代码。 The latest in Machine Learning | …

【php开发工程师系统性教学】——Laravel框架(验证码)的配置和使用的保姆式教程

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

如何用python在树莓派实现舵机缓慢转动?(模块封装可适配接口)

1.简介 使舵机缓慢从160度转向5度&#xff0c;然后再缓慢转回160度&#xff0c;需要在set_servo_angle函数中添加一些逻辑来逐步改变角度&#xff0c;而不是直接设置为目标角度。可以通过在两个角度之间分步改变角度来实现这一点。 2.示例 代码中&#xff0c;添加了一个函数gr…

MySQL的事务相关的语句的使用

MySQL的事务相关的语句的使用 事务是数据库管理系统执行过程中的一个程序单位&#xff0c;由一个或多个数据库操作组成。MySQL作为一款流行的关系型数据库管理系统&#xff0c;支持事务处理&#xff0c;允许用户定义一系列的操作&#xff0c;这些操作要么完全执行&#xff0c;…

数仓建模—数仓架构发展史

数仓建模—数仓架构发展史 时代的变迁,生死的轮回,历史长河滔滔,没有什么是永恒的,只有变化才是不变的,技术亦是如此,当你选择互联网的那一刻,你就相当于乘坐了一个滚滚向前的时代列车,开往未知的方向,不论什么样的技术架构只有放在当前的时代背景下,才是有意义的,…