JSP原理剖析(一)

1.1什么是JSP:

java server pages(java服务器端页面,也和Servlet一样,用于动态Web技术)

最大的特点:写JSP就像在写HTML

区别:HTML只给用户提供静态的数据

JSP页面中可以嵌入JAVA代码,为用户提供动态数据。

1.2JSP原理

思路:JSP到底怎么执行的?

(1)代码层面没有任何问题,仍然为如下所示:

JSP原理剖析(一)_第1张图片

 (2)服务器内部工作

Tomcat中有一个work目录,work目录就是Tomcat工作的目录。

JSP原理剖析(一)_第2张图片

 IDEA中使用Tomcat的会在IDEA的tomcat中生成一个work目录

JSP原理剖析(一)_第3张图片

其中Tomcat即为IDEA中Tomcat的工作空间。 

自己本身电脑的地址为:
JSP原理剖析(一)_第4张图片

 地址如下所示:

C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2022.1\tomcat\060f05dc-727f-4cf1-b15f-3fc617a8a14b\work\Catalina\localhost\Cookie_war\org\apache\jsp

我们发现页面转变成了Java程序

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet。

JSP最终也会被转换成为一个Java类

我们打开该文件后,首先我们来看源码:

JSP原理剖析(一)_第5张图片

针对源码,我们会思考为什么该类没有实现servlet接口,没有继承HttpServlet。而是继承的是HttpJspBase,实现的是JspSourceImports这个接口。针对这个疑问,我们进行如下思考:

我们发现这样子无法进入源码界面:

JSP原理剖析(一)_第6张图片

 我们手动进行导包:
我们发现爆红:

JSP原理剖析(一)_第7张图片

 我们进行手动导包如下所示:
JSP原理剖析(一)_第8张图片

 我们此时发现仍然无法进入该类:
JSP原理剖析(一)_第9张图片

无法进入该类,我们再继续手动导包:
JSP原理剖析(一)_第10张图片

 我们成功的导入进去如下所示:

JSP原理剖析(一)_第11张图片

 我们发现导入进去还是无法成功,我们进行搜索之后发现如下所示:
JSP原理剖析(一)_第12张图片

我们发现之前我们所导入的包都是错误的。我们进行导入jasper-runtime包。 

我们在maven仓库里面进行搜索:https://mvnrepository.com

搜索如下所示:

JSP原理剖析(一)_第13张图片

之后,我们点击第一个进入界面如下所示:
JSP原理剖析(一)_第14张图片

 我们点击5.5.23,将其复制到pom.xml里面:

JSP原理剖析(一)_第15张图片

复制代码如下所示:



    tomcat
    jasper-runtime
    5.5.23

 我们复制进去之后如下所示:
JSP原理剖析(一)_第16张图片

我们复制进去,发现有刷新指示,我们进行刷新,即可发现Structure里面导入了这个包。

 我们进入随便一个类里面进行输入的时候(必须是Cookie包里面的):我们发现存有这个类了。JSP原理剖析(一)_第17张图片

 我们进入HttpJspBase源码里面进行查看:

我们按住ctrl,进入界面如下所示:
JSP原理剖析(一)_第18张图片

 我们发现该类继承自HttpServlet。

JSP本质上就是一个Servlet.

我们打开index.jsp,我们发现如下所示:
JSP原理剖析(一)_第19张图片

我们在源码里面有对应的实现:

 JSP原理剖析(一)_第20张图片

源码里面我们发现这些都是手动输出的。说明我们编写的jsp界面最后转换成java程序的时候,它手动做了我们原来程序员做的繁琐的事情。,而我们只用管理简单的实现就可以啦

我们进行对index_jsp.java文件进行查看:
我们发现里面的:

常量:

 private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

里面的方法代码:与service里面的三个方法相同(初始化,销毁,以及调用service)

//初始化
public void _jspInit() {
  }

//销毁
  public void _jspDestroy() {
  }

//JSPservice
//Tomcat里面每个都是要走这样子一个请求服务,服务过来就会处理这个Request(请求)与Response(响应)
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

我们可以利用请求与响应去做一些事情,我们来看jsp里面做了什么:

1.判断请求:

//判断请求
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
      return;
    }

2.内置了一些对象:

//内置对象
    final javax.servlet.jsp.PageContext pageContext;  //pageContext为页面上下文
    javax.servlet.http.HttpSession session = null;    //session,可以直接拿来用
    final javax.servlet.ServletContext application;
              //applicationContext本质上就是ServletContext.他的作用域非常的高。
    final javax.servlet.ServletConfig config;   //config 配置
    javax.servlet.jsp.JspWriter out = null;  //out对象,输出对象,JspWriter
    final java.lang.Object page = this; //this代表本身这个页面,page:当前页
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;
final javax.servlet.http.HttpServletRequest request,    //请求
 final javax.servlet.http.HttpServletResponse response   //响应

我们对源码继续往下看,我们发现使用了try  -catch方法:
同时在输出页面之前增加了一些代码:

 response.setContentType("text/html");   //设置响应的页面类型为html。
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);  //初始化对象,其中this代表它本身,
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext(); //application赋了一个值,与此前的相同,为GetServletContext。
      config = pageContext.getServletConfig();  //获取了一个配置文件,在web.xml的配置文件可以得到
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
      

以上的这些对象我们可以在JSP界面直接使用

我们创建一个新的JSP,为hello.jsp。

JSP原理剖析(一)_第21张图片

我们进入文件如下所示:
JSP原理剖析(一)_第22张图片

我们发现目前还没有hello.jsp,我们需要进行访问之后才会将文件编译成class文件。 

我们进入hello.jsp进行查看,我们在jsp里面进行取数据需要使用${ }进行取

四大作用域:session   request  application  page

pageContext为页面上下文。

pageScope为页面的作用域 

JSP原理剖析(一)_第23张图片

 requestScope为request的作用域

session里面可以存东西,可以通过这种方式在页面里取出来 

我们也可以通过这种方式取出来。

我们可以使用Jsp里面已经有的对象 ,通过对java代码的编写

JSP原理剖析(一)_第24张图片

我们发现我们没有new out这个对象,但是我们已经可以直接使用了。 

我们之前的session没有去getAttribute,但是可以直接使用。能直接使用的原因是我们在index_jsp.java源码里面已经帮我们实现了。

JSP原理剖析(一)_第25张图片

 我们新建一个hello.jsp,如下所示:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/9/8
  Time: 15:20
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


   hello


我们运行之后,回到文件夹页面,进行刷新发现如下所示:

JSP原理剖析(一)_第26张图片

 我们同时发现work文件夹也不见了,当服务器跑完之后,进行刷新。发现新建了work文件夹:
JSP原理剖析(一)_第27张图片

 我们的JSP里面仍然只有默认的jsp:

 我们发现进入网站进行访问hello.jsp的时候,我们访问完毕之后,JSP里面出现了hello_jsp.java的源文件:JSP原理剖析(一)_第28张图片

 我们进入hello_jsp.java文件,我们发现除了我们的界面代码不一样之外,其他全部相同。我们了解到,JSP本质就是servlet,只不过jsp帮你简化了很多东西,只需要写页面部分即可。:
以下为我们所要写的页面部分:

 out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("    Title\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("   hello\r\n");
      out.write("\r\n");
      out.write("\r\n");

我们的原理如下所示:
JSP原理剖析(一)_第29张图片

 我们进入hello.jsp里面进行编写代码:

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/9/8
  Time: 15:20
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title

   //我们在里面定义了一个java的变量。
   <% String  name="rgf521ypl"; 
    %>
  //我们可以通过out.print进行输出,也可以用以下方式输出:
name:<%=name%>   //在jsp里面取出东西的方式为:<%=所取出来的值%>


我们运行之后如下所示:

JSP原理剖析(一)_第30张图片

 我们进行查看源码:

  out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("    Title\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("   ");
 String  name="rgf521ypl";  //java代码被原封不动的进行输出
    
      out.write("\r\n");
      out.write("\r\n");
      out.write("name:");  //通过out.write进行输出
      out.print(name);
      out.write("\r\n");
      out.write("\r\n");
      out.write("\r\n");

在JSP页面中,只要是java代码就会被原封不动的进行输出,如果是HTML代码,就会被转换为一个个的out.write对象。

  out.write("\r\n");

以这样子的格式输出到前端。

你可能感兴趣的:(JavaWeb,java,JSP)