美文网首页
深入理解JSP

深入理解JSP

作者: knowlege_picker | 来源:发表于2020-08-10 18:08 被阅读0次

如果你想详细地了解JSP和JSTL的话,你可以去菜鸟教程w3c学习。我觉得任何一种知识都是学不完的,展开讲实在是太多了。这篇文章会梳理一下知识结构,这样子的话就能有效的管理知识,之后的学习中需要不断完善。

JSP

什么是JSP

  • jsp是java server page的缩写:java服务端页面

  • jsp的书写格式像html。通过html标签写页面、通过jsp标签嵌入java代码。以此实现动态web

  • jsp其本质是servlet。代码最终会被编译成servlet

与servlet的比较

  • 直接书写servlet需要把html页面的每一行手动转换成out.print("xxx"),非常繁琐且容易出错

  • jsp页面还支持el表达式、jstl标签,写起来更加清晰、快捷

  • 在实际的开发中一般会把jsp与servlet程序结合起来使用。比如表单提交页面使用jsp写,表单处理用servlet写,这样可以发挥出各自的优势,且前后端的结构清晰

JSP原理

jsp代码执行的流程

jsp执行流程.jpg

在tomcat目录(D:\Environment\tomcat-9.0.36\work\Catalina\localhost\ROOT\org\apache\jsp)和idea临时目录的work下(C:\Users\hwx.IntelliJIdea2019.1\system\tomcat\Unnamed_servlet01_6\work\Catalina\localhost\s2\org\apache\jsp)都有一个JSP文件夹,这个文件夹是用来放JSP编译后产生的class文件的。当jsp文件被访问时,idea的work目录下就会产生相应的jsp的java和class文件。打开这个java文件一看,这个类是继承HttpJspBase的

继承图如下:

HttpJspBase.png

简单分析一下HttpJspBase的源码

  1. 可访问的属性和方法
jsp的java文件分析.png
  1. 内置对象和代码段
  • 内置对象: jsp中有九大内置对象

内置对象,又叫做隐含对象,不需要预先声明就可以在脚本代码和表达式中随意使用。

这是为什么呢?我们可以把每一个jsp页面视为一个写完一半的servlet,所有的准备工作和可能用到对象都已经被准备好了,我们只需要调用现成的对象,专注于往页面输出的东西就好了。

下面的这些就是java源码中定义对象的代码。

final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;

不要看这些对象的类型是新的,仔细看这些对象,它们只不过是在原来的接口上进行了重新的封装而已,我们原来是怎么用的现在还是怎么用。

  • 代码段

在这个java文件的末尾(如下图)可以看到我们写的jsp代码统统变成了我们熟悉的servlet代码。并且注意到pageContext_jspxFactory对象上拿到,其他的内置对象可以从pageContext身上拿到。
pageContext可以去深入理解一下

    try {
       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;
        ​
       out.write("<html>\n");
       out.write("<body>\n");
       out.write("<h2>Hello World!</h2>\n");
       out.write("</body>\n");
       out.write("</html>\n");
       } catch (java.lang.Throwable t) {
       if (!(t instanceof javax.servlet.jsp.SkipPageException)){
       out = _jspx_out;
       if (out != null && out.getBufferSize() != 0)
       try {
       if (response.isCommitted()) {
       out.flush();
       } else {
       out.clearBuffer();
       }
       } catch (java.io.IOException e) {
         if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
         else throw new ServletException(t);
         } finally {
         _jspxFactory.releasePageContext(_jspx_page_context);
         }

内置对象的作用域

  1. 九大内置对象
    request
    response
    pageContext
    session
    application
    out
    config
    page
    exception

  2. 四大作用域

作用域代表了取用数据的有效范围。下面这些内置对象能够存储数据,同时也标志了四种作用域。我们下面讨论一下它们的作用域范围。

  • pageContext //保存的数据只在这一个页面有效

  • request //只在一次请求中有效,请求转发会携带

  • session //在一次会话中有效

  • application //保存的数据在服务器运行时都有效

  1. 作用域情况如下图所示:
作用域.jpg
  1. 作用域的测试

  2. 推荐阅读:JSP 九大内置对象及四个作用域详解

    JSP、JSTL、EL表达式

    JSTL和EL表达式是对Jsp的优化,但并不是重点,用jsp都能实现。所以后面两种只用了解,觉得好用就用,不好用记不住就不用。使用之前在pom中导入依赖。

   <dependencies>
     <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.11</version>
     </dependency>
     <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>javax.servlet-api</artifactId>
     <version>4.0.1</version>
     </dependency>
     <dependency>
     <groupId>javax.servlet.jsp</groupId>
     <artifactId>javax.servlet.jsp-api</artifactId>
     <version>2.3.3</version>
     </dependency>
     <dependency>
     <groupId>taglibs</groupId>
     <artifactId>standard</artifactId>
     <version>1.1.2</version>
     </dependency>
     <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
     <dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>jstl</artifactId>
     <version>1.2</version>
     </dependency>
    </dependencies></pre>

web.xml必须这样

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0">
    ​
</web-app>

Jsp

  1. 脚本程序。脚本程序的语法格式:<% 代码片段 %>

  2. jsp声明。JSP声明的语法格式:<%! 声明变量 %>

  3. JSP表达式。表达式的值会插入到表达式出现的地方。<%= 表达式 %>

  4. jsp指令。JSP指令用来设置与整个JSP页面相关的属性。<%@ 属性 %>

  5. JSP行为。JSP行为标签使用XML语法结构来控制servlet引擎。<jsp:action_name attribute="value" />

JSTL

  1. JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。JSTL的出现主要是为了简化脚本程序的

  2. 使用流程:-->导包-->page页面声明核心库-->使用JSTL标签、

  3. 在第一次运行的时候,可能需要手动引入特定包到项目和tomcat的lib目录下,如果第一次运行的时候遇到500错误的话。那两个包在Tomcat的这个目录下:D:\Environment\tomcat-9.0.36\webapps\examples\WEB-INF\lib

EL表达式

  1. EL表达式主要用于替换JSP页面中的脚本表达式<%= 变量或表达式 %>,以从各种类型的web域中检索java对象、获取数据。

  2. el表达式的用法

相关文章

  • 深入理解JSP

    如果你想详细地了解JSP和JSTL的话,你可以去菜鸟教程和w3c学习。我觉得任何一种知识都是学不完的,展开讲实在是...

  • 深入理解JSP和Servlet

    开始编写比较复杂的jsp啦。 全称:javaserver pages在传统的网页HTML文件(.htm,.html...

  • springMVC(8) ViewResolver实现之Inte

    前言 为了能够对ViewResolver能够有一个更深入的理解,这次我又选择了jsp的解析部分InternalRe...

  • JVM(三)-性能监控与故障处理

    参考:《深入理解JVM——高级特性与最佳实践》 一、概述 jsp 显示指定系统内所有的HotSpot虚拟机进程 j...

  • 理解JSP

    1、JSP基本概念 1.1 JSP是什么 JSP是Java Server Pages(java服务器页面)的缩写。...

  • 深入理解Tomcat+Servlet+Spring+JSP

    开发过web项目的同学估计会有如下几个疑问一直萦绕心头:1)Tomcat是什么,为什么要用Tomcat啊?2)Se...

  • 五、JSP生命周期

    JSP生命周期 理解jsp底层功能的关键就是去理解他们所遵循的生命周期。 jsp生命周期从创建到销毁的整个...

  • Jsp的理解

    Jsp是什么? 在解释之前,应该去看一下关于jsp的例子或者教学视频,通过例子总结才算自己的吧。 动态和静态网页的...

  • javaweb 自定义标签详解

    1.学习目标 理解客户化jsp标签的作用 了解jsp Tag API 掌握创建并运用客户化jsp标签的步骤 掌握在...

  • 2019-02-01

    接上文深入浅出Java MVC(Model View Controller) ---- (JSP + servle...

网友评论

      本文标题:深入理解JSP

      本文链接:https://www.haomeiwen.com/subject/lawjdktx.html