初识JSP

这几天琐事太多,影响学习了,好在已经解决,还是继续,考研最后的冲刺阶段,我也跟随考研党们最后冲刺一波,三楼西的很多人都已经眼熟,愿你们一个月后有一个好的结果。

 jsp用过好久了,这次又看了一遍,还是搞明白了很多以前半知半解的东西。

什么是jsp呢?

jsp=html+java脚本+jsp标签(指令)

为什么会出现它呢?

首先看看servlet:

之前学习的时候知道,它是服务器用来接收请求并响应请求的,想一下,响应的时候它是怎么把html的响应体发给浏览器的呢?是通过response.getWriter()得到的这个流对象输出到浏览器,如果每一句html都需要这么办,那不是要浪费很多代码吗?

这时候想可以用html啊,可是html是静态页面,并不能包含变量啊,它并不支持动态响应啊。那这也不行那么不行该怎么办呢

这时候jsp就出现了,它是在html的基础上添加java脚本,也就是把两者的优点混合了。

既然有jsp了,还要servlet干嘛?

想一想如果你所有的处理都用jsp,那么用户在页面一看F12,你怎么弄的这玩意不就都知道了吗。

所有jsp和servlet是明确分工的:

jsp:作为请求发起页面。

      作为请求结束页面

servlet:请求中处理数据的环节。

那jsp为什么能干servlet的活呢?

这是因为jsp其实就是一个servlet,当jsp被第一次访问的时候,服务器会把jsp编译成java文件(这个java文件其实就是一个servlet类),然后再把java编译成.class,然后创建该类对象,最后调用他的service()方法,第二次请求统一jsp时,直接访问service()方法。

服务器是怎么知道要把jsp变成servlet的?

这也是需要明白的,在web.xml中进行配置,

这样所有的jsp也就是*.jsp这个url路径进来,会找到servlet-name对应的servlet-class,也就是JspServlet,通过这个类就能把jsp转换成servlet。

现在先看看一个jsp页面包含的东西再看看编译成servlet之后的代码。

jsp=html+java脚本+jsp标签(指令)

html就不用说了,来看看java脚本。

 

jsp指令也有三种:

jsp标签:

两者的作用都是处理所需要的文件,但处理方式和处理时间不同。
include指令标记是在编译阶段就处理所需要的文件,被处理的文件在逻辑和语法上依赖于当前的jsp页面,优点是执行速度快。
include动作标记在jsp页面运行时才被处理的文件,被处理的文件在逻辑和语法上独立与当前的JSP页面,其优点是可以使用param子标记更灵活的处理所需要的文件,缺点是执行要慢一点



自己写一个简单的jsp

我们到tomcat服务器下的work文件夹里面找到这个目录看一下

看到生成了两个servlet,说明动作标签是编译后再到一个页面上显示的。看看生成的这个NewFile.java,里面这个jsp页面到底变成了什么样

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/7.0.82
 * Generated at: 2017-11-15 02:16:31 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

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

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

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  static {
    _jspx_dependants = new java.util.HashMap<java.lang.String,java.lang.Long>(1);
    _jspx_dependants.put("/b.jsp", Long.valueOf(1510712186569L));
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

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

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.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("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write(" <p>我的jsp</p>\r\n");
      out.write(" ");
 int a=0;
    while(a<5){
        a++;
    }  
   
      out.write("\r\n");
      out.write("   ");
      out.print(a );
      out.write("\r\n");
      out.write("   ");
      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "a.jsp", out, false);
      out.write("\r\n");
      out.write("   ");
      out.write("\r\n");
      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
      out.write("<title>Insert title here</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("<p>B被包含了</p>\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

 

代码有点多,只看看这几点,首先是
html代码在里面是怎么表示的,然后是java脚本是怎么显示的。

 

然后第二点是看看

这里定义的是什么呢?

这里面就涉及到另一个东西了,那就是jsp的九大内置对象。

这九大内置对象是不用在jsp中定义就可以直接使用的,现在知道为什么了么?在转换之后它会给你自动定义。来看看这九大内置对象

 

posted @ 2017-11-15 10:37  竹马今安在  阅读(293)  评论(0编辑  收藏  举报