JSP——Java服务端页面技术

JSP的使用

引入JSP

        目前我们在做web项目的时候,使用的是原生的纯Servlet来完成页面的开发,很不方便。因为我们是在Servlet中通过Java代码去向浏览器打印HTML代码,一旦页面比较复杂、再加上一些样式、js脚本就很繁琐了。

        有没有更简单、快捷的方式呢?答案是有,这个方式就是JSP文件。

JSP执行原理及流程

  • JSP看似是HTML代码,看似是页面,但其实是一种后端技术。

  • 当我们第一发送请求访问jsp资源时,Tomcat服务器中的JSP加载引擎会将该JSP资源转换成一个 .java 文件(Servlet)。

  • 这个 .java文件其实就是一个Servlet,在这个Servlet中已经将写在JSP中的HTML代码以writer.print()的方式编写好了,然后将数据响应给浏览器的。

  • JSP本质上就是一个Servlet,JSP中的HTML代码就相当于我们之前在Servlet中写的writer.write()代码。

JSP的执行过程

        JSP的执行过程大致可以分为三个时期:转换、编译、执行。当我们第一次请求jsp页面时,会将jsp页面进行转换、编译。

转换/翻译(translation):Tomcat中的JSP引擎将JSP网页转换成Servlet,得到一个.java文件。

        当JSP页面在执行时,JSP 引擎会做检查工作,如果发现JSP页面中有更新修改时,JSP引擎会再次转换JSP为Servlet,如果没有更新,就直接执行之前转换好的Servlet。

编译(compile):通过javac命令将.java文件编译成 .class文件。

运行:运行.class字节码文件,处理请求。

具体运行过程:

  1. 浏览器发起请求访问jsp。

  2. Tomcat服务器接收到请求后调用对应的Servlet处理请求,调用JspServlet。

  3. JspServlet将请求的jsp文件转换成对应的Java文件并完成编译。

  4. 将编译后的class文件加载到内存并执行,其实就是运行一个Servlet。

  5. 最后得到结果数据响应浏览器。

JSP的性能问题

        JSP的执行性能和Servlet相差不多。其实执行性能上的差别只在第一次的执行上。因为在第一次执行jsp时,jsp要经过转换、编译、执行三个过程。而之后再次访问jsp页面时,就直接执行第一次所产生的Servlet即可,不需要每次都转换、编译。

        JSP和HTML相比的话肯定是要慢些的,他们的机制就不一样,JSP本质上是Servlet,在请求jsp时,要经过执行,其内部是通过大量的IO流形式将内容发送给页面的,IO流就是一种比较耗费资源的操作。而HTML本身资源是已经存在的,不需要服务器执行什么操作。

        但JSP是动态资源,可以动态的展示数据。这点是HTML比不了的。

JSP的加载引擎

        通过查看Tomcat conf/web.xml文件发现,这里默认配置了一个JSP的加载引擎-JspServlet。

        可以看到,只要是请求jsp页面的请求都会被jsp加载引擎所匹配到,那么该引擎实现了什么作用:

转换JSP页面:将JSP页面转换成一个Servlet。

编译JSP对应的Java文件:JSP引擎调用Java编译器对这个Servlet进行编译,得到可执行文件class。

请求处理:JSP引擎调用java虚拟机来解释执行class文件,得到结果响应浏览器。

JSP的继承结构

        JSP文件在转换成JAVA代码之后,它默认继承了HttpJspBase,实现了JspSourceDependent,和JspSourceImports两个接口,其中HttpJspBase又继承了HttpServlet ,也就是说,JSP本质上就是一个Servlet。

                        

  • HttpJSPBase重写了init,service和destory方法,自定义了 jspInit, jspService, jspDestory。

  • 然后在重写的init方法中调用了 JSPInit,在重写的service方法中调用了 jspService,在重写的destory方法中调用了 jspDestory。

  • 我们JSP的文件编译成JAVA代码后,继承HttpJspBase重写的方法是 jspInit, jspService, jspService。 

JSP中的Java代码问题

        在jsp中可以通过 <%%> 和 <%!%>两种方式来书写代码,这两种方式中写的Java代码在转换后生成的代码在Servlet中位置是不一样的,前者在_jspService方法中,后者在Servlet中作为类的成员。

        JSP本质上是Servlet,在Servlet中是不推荐定义一些成员变量的。

JSP中的注释

        JSP中可以写HTML、Java、CSS、JS代码,那么也就可以写这些语言的注释,并且JSP也有自己的注释方式。

        JSP的注释格式是:<%--注释内容--%>

JSP的使用建议

  • JSP和Servlet本质上是相同的。所以说,JSP页面功能和Servlet中功能完全可以互换。

  • JSP的编码风格是在HTML中嵌入少量的Java代码,它用于展示数据比较方便。

  • Servlet适合编写Java代码。

  • 所以在MVC分层上,我们往往将Servlet作为控制层,将JSP作为视图层。

  • 以后通过Servlet去处理请求,得到结果,然后通过JSP来进行结果展示。

JSP中常用的指令标签

概述

        指令标签是JSP页面上的一种特殊标签,JSP指令可以用来设置整个JSP页面相关的属性,如网页的编码方式、网页使用的脚本语言、导包等。

JSP中的三种指令标签:

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确定脚本元素能否被使用

    contentType:告诉浏览器响应的数据类型及编码格式
    language:设置jsp页面中使用的脚本语言
    import:导包
    pageEncoding:当前页面的编码格式
    errorPage:指定错误页,当前页面发生错误时,显示错误页面的信息
    isErrorPage:指定当前页面为错误提示页,也可以接收异常对象(只有当isErrorpage=true 才具有exception对象)

        errorPage是一种处理错误提示页的功能。除了jsp的这种错误提示功能外,我们也可以在web.xml中配置各种错误提示页。

        注意:如果jsp中配置的错误页和web.xml中配置的错误页冲突的话,以jsp中指定的errorPage为准,它的优先级更高。

include指令标签
  • JSP可以通过include指令来包含其他文件。被包含的文件可以是jsp文件、HTML文件或文本文件。

  • 包含的文件就像是jsp文件的一部分,会被同时编译执行。

  • 除了使用include指令标签可以实现引入外,使用jsp:include动作也可以实现引入。

 不同引入方式的区别:

        静态引入: @include 被引入的网页和当前页生成代码后形成了一个java文件

        动态引入: jsp:include 被引入的JSP页面会生成独立的java代码

tablib指令标签

        taglib就是标签库的意思,我们可以在jsp页面中引入其他的标签库,帮我们去快速简单的做一些事情。

        taglib指令的语法:

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

JSP内置对象

什么是内置对象

     因为JSP的本质是Servlet,在JSP文件经过转译之后,生成JAVA代码,在运行时,JSP给我们准备好了九个可以直接使用而不用我们自己去new的对象,这九个对象我们称之为内置对象。

        内置对象完全由JSP自行去维护, 直接使用即可。

九大内置对象

注意事项:

response对象 当服务器创建request对象时会同时创建用于响应客户端的response对象。

out对象 是 JspWriter 类的实例,不是PrinterWriter的实例;用来在response对象中写入内容。JspWriter类包含了大部分java.io.PrintWriter类中的方法。不过,JspWriter增了一些专为处理缓存而设计的方法。另外JspWriter类会抛出IOExceptions异常。 最初的JspWriter类对象根据页面是否有缓存来进行不同的实例化操作。可以在page指令中使用。buffered='false'属性来轻松关闭缓存。

pageContext对象 PageContext类的实例,用来代表整个JSP页面;提供对JSP页面所有对象以及命名空间的访问。 

Servlet与JSP的联系和区别

联系:

  1. JSP和Servlet都是Sun公司推出的动态网页技术

  2. 基于Servlet开发页面的繁琐性,推出JSP来简化页面开发

  3. JSP本质上是一个Servlet,会翻译成一个Servlet

区别:

  1. JSP使人们把显示和逻辑分隔成为可能,这意味着两者的开发可并行进行;而Servlet并没有把两者分开

  2. JSP是在HTML代码里写JAVA代码,框架是HTML;而Servlet是在JAVA代码中写HTML代码,本身是个JAVA类

  3. Servlet需要在web.xml中配置,而JSP无需配置

  4. 目前JSP主要用在视图层负责显示,而Servlet主要用在控制层负责调度

强调

        JSP表面上是一个HTML,本质上是一个Servlet

JSP使用总结

  1. 创建Jsp文件,在项目的web目录下创建。

  2. 使用page指令设置Jsp的转译细节(一般自动生成的就够用)。

  3. 使用tablib指令引入第三方的自定义标签来使用(JSTL标签)。

  4. 使用HTML,CSS,JQuery完成页面的开发。

  5. 使用<%%>声明java脚本片段完成数据的动态拼接。

    1. <%%>:生成在_jspService()方法中

    2. <%! %>:生成在类中

    3. <%= %>:生成在_jspService()方法中,输出

  6. 获取request或者session中的数据拼接到当前页面中(内置对象)。

EL表达式

问题

        虽然Servlet结合jsp的方式已经极大的简化了我们开发功能和页面的操作。但在jsp页面中取域中的数据要使用<%%>和HTML代码进行拼接的方式展示数据,还是比较麻烦,而且不利于阅读。

解决

        可以在jsp页面中使用EL表达式来获取域对象中的数据

特点

  1. 可以获取作用域对象中的数据

  2. 底层使用的是反射,在使用的时候可以通过键名即可获取对应的值

  3. 简化了在jsp页面中使用<%%>获取域对象数据的方式

使用

  • ${键名},键名是域对象中存储的数据的键。

  • ${键名.属性名.属性名…},可以获取域对象中级联属性的值。

  • ${键名[角标]},获取域对象中存储的list集合或者数组中指定角标的数据。

注意:${}不仅可获取域对象中的数据,而且会将该数据打印到浏览器中。如果获取不到数据,也不会报错,只是不显示而已。

作用域数据查找顺序

        使用EL表达式获取域数据的时候,如果没有指明作用域,那会按照作用域由小到大的顺序去找,直到找到为止: ​ pageContext ---> request ---> session ---> application

指定获取某个作用域中的数据
  • ${pageScope.键名} 获取page域对象中的数据

  • ${requestScope.键名} 获取request域对象中的数据

  • ${sessionScope.键名} 获取session域对象中的数据

  • ${applicationScope.键名} 获取application域对象中的数据

获取request对象中的请求数据

        ${param.键名},可以获取request中携带的请求参数的数据

获取request对象中Cookie的key value

        ${cookie.JSESSIONID.name}

        ${cookie.JSESSIONID.value}

EL表达式可以使用比较运算和算术运算

        ${键名 逻辑运算符 键名} ​ ${键名 算术运算符 键名}

        注意: + 表示的是算术运算,而不是字符串拼接

JSTL标签库

问题

       通过运用之前学的内容,可以使用Servlet进行请求处理,使用JSP将请求处理的结果展示,在jsp页面使用EL表达式获取并输出域对象中数据。但是如果要循环输出一个list集合的数据,还得在jsp页面使用<%%>的形式写java代码来完成。

 解决 

        可以使用JSTL标签来完成一些例如循环、判断等情况的与数据输出。

        JSTL的作用就是:替换在Jsp中声明的Java逻辑代码。

什么是JSTL标签库

     JSTL标签库是第三方发明的自定义的标签,每个标签都有自己特定的含义表示一个具体的java逻辑。我们要在JSP中使用JSTL必须使用taglib标签引入第三方的标签库资源。 

​标签库的内容有:

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

使用

使用步骤:

  1. 在项目中导入JSTL的jar包。

  2. 在jsp页面中通过taglib指令引入jstl标签库。

  3. 使用jstl标签完成开发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值