对于JSP原理以及源码的深入剖析与理解心得

上进小菜猪 发表于 2022/10/30 23:45:43 2022/10/30
【摘要】 一.什么是JSP?JSP:Java Server Pages,这是一种动态web页面开发技术。它使用JSP标记将java代码插入HTML页面。标签通常以<%开头,以%>结尾。JSP的特点:JSP类似HTML。JSP和HTML的区别:纯HTML不能提供动态数据。而我们的JSP是可以嵌入JAVA代码的,所以说可以为用户提供动态的数据。 二.JSP原理探究对于服务器内部工作:我们之前有写过web...

一.什么是JSP?

JSP:Java Server Pages,这是一种动态web页面开发技术。

它使用JSP标记将java代码插入HTML页面。标签通常以<%开头,以%>结尾。

JSP的特点:

  • JSP类似HTML。

JSP和HTML的区别:

  • 纯HTML不能提供动态数据。

  • 而我们的JSP是可以嵌入JAVA代码的,所以说可以为用户提供动态的数据。

二.JSP原理探究

对于服务器内部工作:

我们之前有写过web容器——tomact里有一个work目录。

E:\Environment\apache-tomcat-9.0.65\work

但是我们进入之后发现里面没有任何东西,那是因为我一直是使用IDEA开发项目,所以如果是使用了IDEA开发的话会在IDEA中生成一个work目录。

这里记录一下,各位的IDEA里的tomcat默认安装的位置可能不一样,我们最好去运行项目,在控制台输出里去看一下:

image-20220825193536928

C:\Users\24190.SmartTomcat\xiao

如下我成功的找到了其项目存放文件目录:

image-20220825193634285

进入JSP里,查看一下,我的jsp地址为:

C:\Users\24190.SmartTomcat\xiao\servletr-session-chookie\work\Catalina\localhost\servletr-session-chookie\org\apache\jsp

看到了这里可以看到,JSP文件其实变成了JAVA程序:

image-20220825193749126

总结:

我们现在学的Javaweb其实无论是什么请求,都是在访问servlet。JSP最后也是转换为JAVA类来运行的。

2.1深入研究JSP源码

我们查看源码如下:发现JSP继承了应该叫做HttpJspBase的类。

class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
org.apache.jasper.runtime.JspSourceImports {

JSP初始化:

 public void _jspInit() {
  }

JSP销毁:

  public void _jspDestroy() {
  }

JSP服务——>请求和响应:

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

1.判断请求

2.分析JSP内置的一些对象:

页面的上下文对象:

final javax.servlet.jsp.PageContext pageContext;

Session对象:

javax.servlet.http.HttpSession session = null;

applicationContext对象:

final javax.servlet.ServletContext application;

config对象:

final javax.servlet.ServletConfig config;

out对象

javax.servlet.jsp.JspWriter out = null;

page,代表当前页:

final java.lang.Object page = this;

请求:HttpServletRequest request

响应:HttpServletResponse response

3.输出页面前源码之前的代码解析:

设置响应的页面类型:

response.setContentType("text/html; charset=utf-8");

下面这些对象,在上面可以找到:

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;

上面的这一大堆对象可以在JSP文件里直接使用。

image-20220825201113983

在JSP文件里,写JAVA代码之前,需要加<%JAVA代码这在这个里面%>。

我们在JSP文件里,写一段可以取出我们上节,学习Session写的名字。

如下:

<%
  String name = "菜猪";
%>

name<%=name%>

因为<%JAVA代码这在这个里面%>,所以我在前面定义了应该name变量,把菜猪存入变量。

下面写一个name,name后面是Java代码,输出name变量的值。

我们运行项目,发现输出如下:

image-20220825201450841

为了探究源码,我们再次访问完成之后,进入IDEA的项目里,查看JSP的源码:

C:\Users\24190.SmartTomcat\xiao\servletr-session-chookie\work\Catalina\localhost\servletr-session-chookie\org\apache\jsp

发现如下的JAVA,这里就很简单了:

image-20220825201826665

总结:

在JSP页面里,如果是HTML代码的话就会被自动转换为JAVA代码,如下的例子:

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

但是如果是JAVA代码的话,就不会变化,会原封不动的输出,如上面那个图例的:

  String name = "菜猪";

转换为这样才会输出个前端。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。