jsp的本质是servlet,你是听说还是亲眼所见?

本文详细解析JSP的工作机制,包括JSP如何将Java代码嵌入到HTML中,其内部对象的功能,以及JSP指令的使用。通过实际示例,展示了JSP文件如何被编译成Servlet,揭示了JSP的运行过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

更多java学习笔记
在学习jsp时,老师说jsp很强大,可以在前端写一些java的代码

<%java代码%> 内部的java代码翻译到service方法内部
<%=java变量或表达式%> 会被翻译到service方法内部out.print();
<%!java代码%> 会被翻译成servlet的成员的内容

一开始学习的时候没有追踪溯源,知识记住怎么去做,怎么去使用,随后的学习中对于原理还是不够理解,直到现在追溯原理发现源码才是真的艺术。
对于如何创建项目不做具体的描述。

eclipse中jsp的位置(eclipse目录)

Eclipse查看自己项目编译后的jsp文件转换成的java源码,其放置路径
\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\自己的项目名\org\apache\jsp

idea中的位置(系统位置)

C:\Users\Administrator.IntelliJIdea2018.2\system\tomcat\自己的项目名\work\Catalina\localhost_\org\apache\jsp

index.jsp程序

<%@ page language="java" contentType="text/html; UTF-8" pageEncoding="UTF-8" %>
<html>
<body>
<h2>Hello xxx World!</h2>
    <%
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        String name = "冯雁星";
        int age = 25;
    %>
    name:<%=name%>
    age:<%=age%>
</body>
</html>

经过翻译后得到index.jsp转换成了index.java
新的类继承HttpJspBase,其是HttpServlet的子类

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {
    //实现的方法
}

jsp翻译后所拥有的方法

 //初始化
 public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }
  //销毁方法
  public void _jspDestroy() {
  }
  //Service方法
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {
  //逻辑代码
  }

源码中看内置对象,在jsp中定义了内置对象

 final javax.servlet.jsp.PageContext pageContext;//上下文对象
    javax.servlet.http.HttpSession session = null;//session对象
    final javax.servlet.ServletContext application;//applicationContext对象
    final javax.servlet.ServletConfig config;//config对象
    javax.servlet.jsp.JspWriter out = null;//out对象
    final java.lang.Object page = this;//page对象
   还有service传入的参数request对象个response对象
···
源码中页面输出的对象有:
```java
response.setContentType("text/html; UTF-8;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;

页面中嵌入的java代码被翻译后的样子:使用out对象向页面写回

  out.write("<html>\n");
      out.write("<body>\n");
      out.write("<h2>Hello xxx World!</h2>\n");
      out.write("    ");

        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        String name = "冯雁星";
        int age = 25;
    
      out.write("\n");
      out.write("    name:");
      out.print(name);
      out.write("\n");
      out.write("    age:");
      out.print(age);
      out.write("\n");
      out.write("</body>\n");
      out.write("</html>\n");

jsp指令(三大指令):
1)page指令(jsp上边显示的几行):
<%@page 属性名1=‘属性值1’ 属性名二=‘属性值2’ …%>
常用属性:语言language文本类型contentType;
2)include指令:<%@ include file=“另一个页面”%>
3)taglib指令:引入标签库,格式:<%@taglib uri=“标签库地址” prefix=“前缀”%>

jsp的九大内置对象

out:页面输出;
rquest:得到用户请求;
response:用于服务器响应
page:指当前页面转换后的Servlet类的实例;
pageContext:jsp页面容器
application:所有用户的共享信息;
session:用来保存用户的信息
config:服务器配置,可以取得初始化参数;
exception:表示jsp页面所发生异常;

注:out缓冲区默认为8kb;out缓冲区的数据会被放置在response缓冲区
jsp四大作用域:

application:整个web应用
request:一次ttp请求
session:一次会话
page:当前jsp页面范围

学无止境,学海无涯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值