jsp转换成servlet的详解

此知识点实在手写tomcat的时候衍生出来的东西,想要真正搞懂这个东西,就有此博客。

jsp与servlet 的关系:

首先jsp(javaServer Pages)与servlet都是用在JavaEE环境中创建动态web内容的技术,他们有着紧密的关系和不同的用途。

1.servlet:

  a. 是一个Java类,用于处理http请求并生成响应内容,当然开发者可以通过Java代码完全控制响应的内容。

  b.通常处理复杂的业务逻辑控制流和处理表单数据。

2.JSP

a.是一种基于HTML的模板技术。但是在他的里面可以编写Java代码(用<% %>括起来)这样也是更加容易创建动态的web的页面。

b.JSP本质上是Servlet 的简化形式,他的目的是是页面开发更加直观高效。

关系:jsp在第一次被请求的时候,会被转化成Servlet,然后编译执行,在某种意义上说,jsp是servlet 的高级抽象,专注于视图层,而Servlet猪猪与控制和逻辑处理层。

在JavaEE中jsp与servlet的跳转的流程:

工作流程:

 1.请求URL:客户端浏览器发出/hello请求。
2.Servlet映射:根据web.xml中的<servlet-mapping>配置,将该请求映射到helloJsp Servlet。
3.处理请求:helloJsp Servlet将请求转发到指定的/hello.jsp文件。
4.生成响应:JSP文件被编译为Servlet并执行,生成动态的HTML响应返回给客户端。
  这种配置方式通过web.xml文件,可以灵活地管理和组织Web应用中的JSP页面和Servlet,有助于实现清晰的URL映射和组件配置。

除了配置xml文件之外,还有注解:@WebServlet ("/s1")

jsp与servlet转换的代码事例:

   示例JSP文件 (hello.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>Hello JSP</title>
</head>
<body>
    <h1>Hello, JSP World!</h1>
    <%
        String user = request.getParameter("user");
        if (user == null) {
            user = "Guest";
        }
        out.println("Hello, " + user + "!");
    %>
</body>
</html>

   转换后的Servlet (hello_jsp.java)

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

  private static java.util.List<String> _jspx_dependants;

  private org.glassfish.jsp.api.ResourceInjector _jspx_resourceInjector;

  public java.util.List<String> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

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

    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;

    try {
      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;
      _jspx_resourceInjector = (org.glassfish.jsp.api.ResourceInjector) application.getAttribute("com.sun.appserv.jsp.resource.injector");

      out.write("\n");
      out.write("<!DOCTYPE html>\n");
      out.write("<html>\n");
      out.write("<head>\n");
      out.write("    <title>Hello JSP</title>\n");
      out.write("</head>\n");
      out.write("<body>\n");
      out.write("    <h1>Hello, JSP World!</h1>\n");
      out.write("    ");
        String user = request.getParameter("user");
        if (user == null) {
            user = "Guest";
        }
        out.println("Hello, " + user + "!");
      out.write("\n");
      out.write("</body>\n");
      out.write("</html>\n");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          out.clearBuffer();
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

解释

 Servlet:通过纯Java代码来实现业务逻辑和响应内容的生成。它适合处理复杂的逻辑和控制层操作。
JSP:通过嵌入Java代码到HTML中,更方便地创建动态Web页面。它适合用于视图层,呈现数据。
  通过JSP和Servlet的配合,开发者可以实现清晰的MVC(Model-View-Controller)模式,使得Web应用的开发更加结构化和可维护。

在Apache Tomcat中:

将JSP页面转换为Servlet是通过Jasper引擎完成的。Jasper是Tomcat的JSP编译器,它将JSP文件编译成Java源文件(Servlet),然后再编译成字节码,最终运行在Tomcat中。

结合使用:

  在实际应用中,JSP和Servlet通常结合使用。Servlet负责处理请求和业务逻辑,JSP负责生成动态网页内容。Servlet可以将处理后的数据传递给JSP,JSP负责将数据展示给用户。


转换过程:

Tomcat在运行时会将JSP页面转换为Servlet进行处理。这意味着每个JSP页面实际上都是一个Servlet,Tomcat在第一次请求时会自动进行转换并编译。转换后的Servlet与普通Servlet一样运行,生成动态内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值