JSP原理剖析(一)

1.1什么是JSP:

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

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

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

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

1.2JSP原理

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

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

 (2)服务器内部工作

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

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

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

自己本身电脑的地址为:

 地址如下所示:

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类

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

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

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

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

 我们进行手动导包如下所示:

 我们此时发现仍然无法进入该类:

无法进入该类,我们再继续手动导包:

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

 我们发现导入进去还是无法成功,我们进行搜索之后发现如下所示:

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

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

搜索如下所示:

之后,我们点击第一个进入界面如下所示:

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

复制代码如下所示:

<!-- https://mvnrepository.com/artifact/tomcat/jasper-runtime -->
<dependency>
    <groupId>tomcat</groupId>
    <artifactId>jasper-runtime</artifactId>
    <version>5.5.23</version>
</dependency>

 我们复制进去之后如下所示:

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

 我们进入随便一个类里面进行输入的时候(必须是Cookie包里面的):我们发现存有这个类了。

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

我们按住ctrl,进入界面如下所示:

 我们发现该类继承自HttpServlet。

JSP本质上就是一个Servlet.

我们打开index.jsp,我们发现如下所示:

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

 

源码里面我们发现这些都是手动输出的。说明我们编写的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。

我们进入文件如下所示:

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

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

四大作用域:session   request  application  page

pageContext为页面上下文。

pageScope为页面的作用域 

 requestScope为request的作用域

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

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

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

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

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

 我们新建一个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" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   hello
</body>
</html>

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

 我们同时发现work文件夹也不见了,当服务器跑完之后,进行刷新。发现新建了work文件夹:

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

 我们发现进入网站进行访问hello.jsp的时候,我们访问完毕之后,JSP里面出现了hello_jsp.java的源文件:

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

 out.write("\r\n");
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>Title</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("   hello\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");

我们的原理如下所示:

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

我们运行之后如下所示:

 我们进行查看源码:

  out.write("\r\n");
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>Title</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\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("</body>\r\n");
      out.write("</html>\r\n");

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

  out.write("<html>\r\n");

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直再追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值