JavaWeb——JSP

本文详细解析了JSP的工作原理,包括JSP的定义、特点和内部处理流程,阐述了JSP语法,如表达式、脚本片段、声明以及JSP指令的使用,特别是page指令、Include指令和Taglib指令。此外,介绍了JSP的九大内置对象和作用域,以及JSTL核心标签库的引入和应用,帮助开发者深入掌握JSP开发。
摘要由CSDN通过智能技术生成

一、JSP原理剖析

1.1 什么是JSP?

  • Java Servlet Pages:Java服务器端页面,和Servlet一样,用于动态web技术
  • 它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。

1.2 JSP的特点

  • 软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。
  • JSP 技术是以 Java 语言作为脚本语言的,JSP 网页为整个服务器端的 Java 库单元提供了一个接口来服务于HTTP的应用程序。
  • JSP开发的WEB应用可以跨平台使用,既可以运行在 Linux 上也能运行在 Windows 上。
  • 写JSP就像再写html,但是html只会提供静态数据

1.3 JSP原理

  • 服务器内部工作
    tomcat有一个work目录
    在这里插入图片描述

IDEA中使用Tomcat的会在IDEA的tomcat中生成一个work目录
在这里插入图片描述
电脑中的目录地址

C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat\d0a5c8e1-d2f7-4e43-b341-e0ad42b78504\work\Catalina\localhost\stu20211011\org\apache\jsp

在这里插入图片描述
可以看到页面转变成立Java程序

浏览器向服务器发送请,不管访问什么资源,实际上都在再访问Servlet

JSP最终也会被转换成Java类——JSP本质上就是一个Servlet
在这里插入图片描述

<!--        使用maven添加HttpJspBase所在的依赖-->
        <dependency>
            <groupId>tomcat</groupId>
            <artifactId>jasper-runtime</artifactId>
            <version>5.5.23</version>
        </dependency>

index_jsp.java

//初始化
  public void _jspInit() {
  }
//销毁
  public void _jspDestroy() {
  }
//JSPService
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)

1、判断请求
2、内置对象

    final javax.servlet.jsp.PageContext pageContext; //页面上下文
    javax.servlet.http.HttpSession session = null;   //session
    final javax.servlet.ServletContext application;  //application
    final javax.servlet.ServletConfig config;        //config
    javax.servlet.jsp.JspWriter out = null;          //out
    final java.lang.Object page = this;              //this 当前page  
    javax.servlet.jsp.JspWriter _jspx_out = null;     
    javax.servlet.jsp.PageContext _jspx_page_context = null;

	HttpServletRequest request      //请求
	HttpServletResponse response    //响应

3、输出页面前增加的代码

      response.setContentType("text/html");   //设置响应的页面类型
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

4、以上的对象,可以在jsp页面中直接使用

jsp被处理过程

在这里插入图片描述

jsp处理过程源码分析

index.html

<html>
<body>
<h2>Hello World!</h2>
<%
    String str = "learn fro java";
%>
<%--输出str--%>
desc:<%=str%>
</body>
</html>

在启动tomcat服务
在这里插入图片描述
idea中tomcat work文件下的的java文件
在这里插入图片描述
可以看出在jsp中的Java代码会原封不动地输出,而html的代码会使用out.write输出

注意:每启动一次tomcat服务,都会程序生成新的Java文件和class文件。

二、JSP语法

2.1 JSP需要用的依赖

    <dependencies>
<!--servlet依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
<!--        jsp依赖-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
<!--        使用maven添加HttpJspBase所在的依赖-->
        <dependency>
            <groupId>tomcat</groupId>
            <artifactId>jasper-runtime</artifactId>
            <version>5.5.23</version>
        </dependency>
<!--        JSTL表达式依赖-->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
<!--        standard标签库-->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>

JSP支持JAVA的所有语法。JSP作为Java技术的一种应用,它拥有一些自己扩充的语法

2.2 JSP 表达式

<%%>
<%=%> 也可以用${}代替
<%!%>

<%--注释--%>  JSP的注释不会再客户端显示,但是html的注释会显示

EL表达式${...}

&{"Hello"}  等价于 <%="Hello
"%>输出值

输出到客户端

<%= 变量或者表达式%>

<%= new java.util.Date()%>
<%="Hello"%>

2.3 JSP脚本片段

<%
    int num = 1024;
    for (int i = 0; i < 10; i++) {
        num += i;
        out.println(num);
    }
    out.print("<h1>sum=" + num+"</h1>");
%>

2.4 脚本片段的再实现

在jsp代码中可以包裹一些html代码以达到特定效果
下面的代码中相对于把Java代码分为两段,在中间添加html代码

<%
    for (int i = 0; i < 10; i++) {
%>
<h1> hello <%=i%></h1>
<%
    }
%>

在这里插入图片描述在这里插入图片描述可以看到即使在jsp文件中脚本片段将一个循环分成了缩短,但是在生成的Java文件中该端代码依然是在一个循环内,并且调用了指定的方法实现。

2.5 JSP声明

<%!
    static {
        System.out.println("Loading Servlet!");
    }
    private int globalVar = 0;
     public void method1(){
         System.out.println("进入了JSP声明中的method1方法");
     }
%>

生成的Java文件中,使用JSP声明的部分编译后会生成到类中
中而除了JSP声明以的JSP表达式和脚本片段,都会生成在_jspService()方法中
在这里插入图片描述

三、JSP指令<%@ … … %>

指令描述
<%@ page … %>定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %>包含其他文件
<%@ taglib … %>引入标签库的定义

3.1 page指令

page指令相关的属性

属性描述
buffer指定out对象使用缓冲区的大小
autoFlush控制out对象的 缓存区
contentType指定当前JSP页面的MIME类型和字符编码
errorPage指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends指定servlet从哪一个类继承
import导入要使用的Java类
info定义JSP页面的描述信息
isThreadSafe指定对JSP页面的访问是否为线程安全
language定义JSP页面所用的脚本语言,默认是Java
session指定JSP页面是否使用session
isELIgnored指定是否执行EL表达式
isScriptingEnabled确定脚本元素能否被使用

定制错误页面

在jsp文件中定义

<%@ page errorPage="error/500.jsp" %>

再web.xml中自定义错误页面

    <error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error/500.jsp</location>
    </error-page>

3.2 Include指令

JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
语法格式

<%@ include file="文件相对 url 地址" %>
<%@include ...%>会将两个页面合二为一
<%@include file = ".../header.jsp"%>
<!--网页主体-->
<%@include file = ".../footer.jsp"%>



//JSP标签jsp:include:拼接三个页面,本质上还是三个页面
<jsp:include page="../header.jsp"/>
<!--网页主体-->
<jsp:include page="../footer.jsp"/>

3.3 Taglib指令

JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。

<%@ taglib uri="uri" prefix="prefixOfTag" %>

等价的XML语法
<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />

uri属性确定标签库的位置,prefix属性指定标签库的前缀。

四、九大内置对象和作用域

  • PageContext 存东西
  • Request 存东西
  • Response
  • Sesion 存东西
  • Apllication 【ServletContext】存东西
  • config 【ServletConfig】
  • out
  • page
  • execption

四种作用域(scope)

在这里插入图片描述

    pageContext.setAttribute("class1","Java");//保存的数据只在一个页面中有效
    request.setAttribute("class2","Python");//保存的数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("class3","C");//保存的数据只在一次会话中有效,从打开网站到关闭网站
    application.setAttribute("class4","Golang");//保存的数据只在服务器中有效,从打开服务器到关闭服务器

五、JSP标签

在这里插入图片描述

<%--jsp标签写法--%>
<jsp:forward page="error">
    <jsp:param name="name" value="张三"></jsp:param>
    <jsp:param name="age" value="12"></jsp:param>
</jsp:forward>

JSTL (java server pages standard tag library)

标签库依赖

        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

参见菜鸟教程
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。

根据JSTL标签所提供的功能,可以将其分为5个类别。

  • 核心标签
  • 格式化标签
  • SQL 标签
  • XML 标签
  • JSTL 函数

JSTL核心标签

使用JSP核心标签库首先要导入对应的标签库

引用核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签描述
<c:out>用于在JSP中显示数据,就像<%= … >
<c:set>用于保存数据
<c:remove>用于删除数据
<c:catch>用来处理产生错误的异常状况,并且将错误信息储存起来
<c:if>与我们在一般程序中用的if一样
<c:choose>本身只当做<c:when>和<c:otherwise>的父标签
<c:when><c:choose>的子标签,用来判断条件是否成立
<c:otherwise><c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
<c:import>检索一个绝对或相对 URL,然后将其内容暴露给页面
<c:forEach>基础迭代标签,接受多种集合类型
<c:forTokens>根据指定的分隔符来分隔内容并迭代输出
<c:param>用来给包含或重定向的页面传递参数
<c:redirect>重定向至一个新的URL.
<c:url>使用可选的查询参数来创造一个URL

核心标签使用举例:

<%--在JSP中显示数据--%>
<c:out value="调用JSTL中的输出方法" default="默认输出值" escapeXml="true"></c:out>
<%--保存数据--%>
<c:set var="i" value="0"></c:set>
<%--删除数据--%>
<c:remove var="i" scope="page"></c:remove>
<%--循环:0开始,到3每次+1并输出--%>
<c:forEach begin="0" end="3" step="1" var="i">
i=<c:out value="${i}"></c:out>
</c:forEach>

JSTL是为了弥补jsp标签本身的不足而进行的扩充,扩充后的JSP标签的功能标签与Java语言中一样,如遍历、循环等。

JSPJavaServer Pages)是一种服务器端的动态网页开发技术,它可以将 Java 代码嵌入 HTML 页面中,从而实现动态网页的生成。 JSP 的基本原理是将 JSP 页面翻译成 Servlet,在服务器端执行 Servlet 代码,再将执行结果返回给客户端。因此,我们在使用 JSP 开发网页时,需要先了解 Servlet 的相关知识。 JSP 的语法基本上就是 HTML 标签加上 Java 代码。以下是一些基本的 JSP 标签: 1. <% ... %>:嵌入 Java 代码,可以用于定义变量、写循环、判断语句等。 2. <%= ... %>:输出 Java 代码的执行结果。 3. <%-- ... --%>:注释,不会被翻译成 Servlet。 4. <jsp:include ... />:包含其他 JSP 页面或 HTML 页面。 5. <jsp:forward ... />:将请求转发到其他资源(JSP 页面、Servlet 或 HTML 页面)。 6. <jsp:useBean ... />:创建 JavaBean 对象。 7. <jsp:setProperty ... />:为 JavaBean 对象设置属性。 8. <jsp:getProperty ... />:取得 JavaBean 对象的属性值。 在 JSP 页面中,我们还可以使用 EL 表达式和 JSTL 标签库来简化代码编写,提高开发效率。 EL(Expression Language)表达式是一种简化的表达式语言,可以用于取值、赋值、计算等操作。例如,${name} 表示取得名为 name 的变量的值。 JSTLJavaServer Pages Standard Tag Library)是一套标签库,提供了循环、条件判断、格式化、国际化等常用功能的标签。例如,<c:forEach> 标签可以用于循环遍历集合,<c:if> 标签可以用于条件判断。 除了以上标签库,JSP 还支持自定义标签库。我们可以通过编写标签处理器来扩展 JSP 的功能。 JSP 的优点是可以将 Java 代码嵌入 HTML 页面中,使得网页的开发更加灵活和方便。但是,由于 JSP 页面需要翻译成 Servlet,因此会增加服务器的负担和响应时间。此外,JSP 页面中夹杂着 Java 代码,也不利于代码的维护和调试。因此,在开发大型网站时,建议使用 MVC 设计模式,将业务逻辑和视图分离,使得代码更加清晰和易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值