Jsp和Servlet有什么区别?

感谢大佬:https://www.zhihu.com/question/37962386

Github:https://github.com/ZhongFuCheng3y/3y
公众号:Java3y
非常感谢这位哥的整理!!!小弟感激不尽!!!

什么是Servlet?

Servlet其实就是一个遵循Servlet开发的java类。Servlet是由服务器调用的,运行在服务器端

为什么要用到Servlet?

我们编写java程序想要在网上实现 聊天、发帖、这样一些的交互功能,普通的java技术是非常难完成的。sun公司就提供了Servlet这种技术供我们使用。

什么是JSP?

JSP全名为Java Server Pages,java服务器页面。JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在!

为什么需要JSP?

JSP是为了简化Servlet的工作出现的替代品,Servlet输出HTML非常困难,JSP就是替代Servlet输出HTML的。

JSP的工作原理

  • 在Tomcat博客中我提到过:Tomcat访问任何的资源都是在访问Servlet!,当然了,JSP也不例外!**JSP本身就是一种Servlet。**为什么我说JSP本身就是一种Servlet呢?其实JSP在第一次被访问的时候会被编译为HttpJspPage类(该类是HttpServlet的一个子类)
  • 刚才我简单使用了一下JSP,它被编译成了这么一个Servlet:
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.Date;

public final class _1_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 javax.el.ExpressionFactory _el_expressionfactory;
 private org.apache.tomcat.InstanceManager _jsp_instancemanager;

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

 public void _jspInit() {
   _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
   _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
 }

 public void _jspDestroy() {
 }

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

   final PageContext pageContext;
   HttpSession session = null;
   final ServletContext application;
   final ServletConfig config;
   JspWriter out = null;
   final 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;

     out.write("\r\n");
     out.write("\r\n");
     out.write("<html>\r\n");
     out.write("<head>\r\n");
     out.write("    <title>简单使用JSP</title>\r\n");
     out.write("</head>\r\n");
     out.write("<body>\r\n");

   String s = "HelloWorda";
   out.println(s);

     out.write("\r\n");
     out.write("</body>\r\n");
     out.write("</html>\r\n");
   } catch (Throwable t) {
     if (!(t instanceof SkipPageException)){
       out = _jspx_out;
       if (out != null && out.getBufferSize() != 0)
         try { out.clearBuffer(); } catch (java.io.IOException e) {}
       if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
     }
   } finally {
     _jspxFactory.releasePageContext(_jspx_page_context);
   }
 }
}
  • 编译过程是这样子的:浏览器第一次请求1.jsp时,Tomcat会将1.jsp转化成1_jsp.java这么一个类,并将该文件编译成class文件。编译完毕后再运行class文件来响应浏览器的请求。
  • 以后访问1.jsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。当然了,如果Tomcat检测到JSP页面改动了的话,会重新编译的。
  • 既然JSP是一个Servlet,那**JSP页面中的HTML排版标签是怎么样被发送到浏览器的?**我们来看下上面1_jsp.java的源码就知道了。原来就是用write()出去的罢了。说到底,JSP就是封装了Servlet的java程序罢了。
out.write("\r\n");
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>简单使用JSP</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
  • 有人可能也会问:**JSP页面的代码服务器是怎么执行的?**再看回1_jsp.java文件,java代码就直接在类中的service()中。
    String s = "HelloWorda";
    out.println(s);
  • JSP比Servlet更方便更简单的一个重要原因就是:内置了9个对象!内置对象有:out、session、response、request、config、page、application、pageContext、exception,这几个内置对象不在这里讲。现在先知道一下即可!

更多原创资料:

Servlet+Tomcat

在这里插入图片描述

JSP

在这里插入图片描述

posted @ 2020-02-22 13:20  超级小白龙  阅读(422)  评论(0编辑  收藏  举报