JSP

来源:互联网 发布:linux 修改文件时间戳 编辑:程序博客网 时间:2024/05/06 22:48

转自:http://blog.csdn.net/xcymorningsun/article/details/68942222?locationNum=5&fps=1

一、引言


一句话:jsp本质就是一个servlet。

程序员在开发过程中,发现Servlet做界面非常不方便,所以产生了jsp技术。JSP其实是对Servlet进行了包装而已。 
jsp + Java类(service、javabean)+ servlet,就会构成mvc的开发模式,mvc模式是目前软件公司中相当通用的开发模式。


二、JSP


JSP工作原理:


      当客户端浏览器向服务器请求一个 JSP 页面时,服务器收到该请求后,首先检查所请求的这个JSP 文件内容 ( 代码 ) 是否已经被更新,或者是否是 JSP 文件创建后的第一次被访问:

     1. 如果是,那么,这个 JSP 文件就会在服务器端的 JSP 引擎作用下转化为一个 Servlet 类的 Java 源代码文件,这个 Servlet 类会在 Java 编译器的作用下被编译成一个字节码文件,并装载到 jvm 解释执行。剩下的就等同于 Servlet 的处理过程了。

      2. 如果被请求的 JSP 文件内容 ( 代码 ) 没有被修改,那么它的处理过程也等同于一个 Servlet 的处理过程。即直接由服务器检索出与之对应的 Servlet 实例来处理。


      需要注意的是,JSP 文件不是在服务器启动的时候转换成 Servlet 类的。而是在被客户端访问的时候才可能发生转换的 ( 如 JSP 文件内容没有被更新等,就不再发生 Servlet 转换 )。就 Tomcat 而言,打开目录 %Tomcat%/work/%您的工程文件目录%,然后会看到里面有 3个子目录:org/apache/jsp,若没有这 3 个目录,说明项目的 JSP 文件还没有被访问过,打开进到 jsp 目录下,会看到一些 *_jsp.java 和 *_jsp.class 文件,这就是 JSP 文件被转换成Servlet 类的源文件和字节码文件了。


jsp文件

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <%@page import="java.util.Date"%>  
  2. <%@page language="java" pageEncoding="UTF-8"%>  
  3. <!-- lanuage表示嵌在JSP的的片段语言是什么,pageEncoding表示本页面的编码方式是什么 -->  
  4.   
  5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  6. <html>  
  7.   <head>  
  8.     <title>showTime</title>  
  9.     <!-- 控制让浏览器不要缓存 -->  
  10.     <meta http-equiv="pragma" content="no-cache">  
  11.     <meta http-equiv="cache-control" content="no-cache">  
  12.     <meta http-equiv="expires" content="0">     
  13.     <!-- keywords是让搜索引擎看的 -->   
  14.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  15.     <meta http-equiv="description" content="This is my page">  
  16.   </head>  
  17.   <body>  
  18.     <%   
  19.         // 在<% 之间可以写我们的Java代码,就和我们在Java文件中写Java代码是一样的  
  20.         // 为什么可以直接使用out对象,因为out是jsp的内置对象  
  21.         // 内置对象就是不需要我们创建就能使用的对象,jsp有9大内置对象  
  22.         out.println("当前时间是:"+new Date().toLocaleString());  
  23.      %>  
  24.   </body>  
  25. </html>  


对应转换的servlet类中_jspService方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)  
  2.         throws java.io.IOException, javax.servlet.ServletException {  
  3.   
  4. final java.lang.String _jspx_method = request.getMethod();  
  5. if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {  
  6. response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");  
  7. return;  
  8. }  
  9.   
  10.     final javax.servlet.jsp.PageContext pageContext;  
  11.     javax.servlet.http.HttpSession session = null;  
  12.     final javax.servlet.ServletContext application;  
  13.     final javax.servlet.ServletConfig config;  
  14.     javax.servlet.jsp.JspWriter out = null;  
  15.     final java.lang.Object page = this;  
  16.     javax.servlet.jsp.JspWriter _jspx_out = null;  
  17.     javax.servlet.jsp.PageContext _jspx_page_context = null;  
  18.   
  19.   
  20.     try {  
  21.       response.setContentType("text/html;charset=UTF-8");  
  22.       pageContext = _jspxFactory.getPageContext(this, request, response,  
  23.                 nulltrue8192true);  
  24.       _jspx_page_context = pageContext;  
  25.       application = pageContext.getServletContext();  
  26.       config = pageContext.getServletConfig();  
  27.       session = pageContext.getSession();  
  28.       out = pageContext.getOut();  
  29.       _jspx_out = out;  
  30.   
  31.       out.write("\r\n");  
  32.       out.write("\r\n");  
  33.       out.write("<!-- lanuage表示嵌在JSP的的片段语言是什么,pageEncoding表示本页面的编码方式是什么 -->\r\n");  
  34.       out.write("\r\n");  
  35.       out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");  
  36.       out.write("<html>\r\n");  
  37.       out.write("  <head>\r\n");  
  38.       out.write("    <title>showTime</title>\r\n");  
  39.       out.write("    <!-- 控制让浏览器不要缓存 -->\r\n");  
  40.       out.write("\t<meta http-equiv=\"pragma\" content=\"no-cache\">\r\n");  
  41.       out.write("\t<meta http-equiv=\"cache-control\" content=\"no-cache\">\r\n");  
  42.       out.write("\t<meta http-equiv=\"expires\" content=\"0\">   \r\n");  
  43.       out.write("\t<!-- keywords是让搜索引擎看的 --> \r\n");  
  44.       out.write("\t<meta http-equiv=\"keywords\" content=\"keyword1,keyword2,keyword3\">\r\n");  
  45.       out.write("\t<meta http-equiv=\"description\" content=\"This is my page\">\r\n");  
  46.       out.write("  </head>\r\n");  
  47.       out.write("  <body>\r\n");  
  48.       out.write("    ");  
  49.   
  50.         // 在<% 之间可以写我们的Java代码,就和我们在Java文件中写Java代码是一样的  
  51.         // 为什么可以直接使用out对象,因为out是jsp的内置对象  
  52.         // 内置对象就是不需要我们创建就能使用的对象,jsp有9大内置对象  
  53.         out.println("当前时间是:"+new Date().toLocaleString());  
  54.   
  55.       out.write("\r\n");  
  56.       out.write("  </body>\r\n");  
  57.       out.write("</html>\r\n");  
  58.     } catch (java.lang.Throwable t) {  
  59.       if (!(t instanceof javax.servlet.jsp.SkipPageException)){  
  60.         out = _jspx_out;  
  61.         if (out != null && out.getBufferSize() != 0)  
  62.           try {  
  63.             if (response.isCommitted()) {  
  64.               out.flush();  
  65.             } else {  
  66.               out.clearBuffer();  
  67.             }  
  68.           } catch (java.io.IOException e) {}  
  69.         if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);  
  70.         else throw new ServletException(t);  
  71.       }  
  72.     } finally {  
  73.       _jspxFactory.releasePageContext(_jspx_page_context);  
  74.     }  
  75.   }  



三、总结


  • JSP历史与作用

  • JSP工作原理

  • JSP与对应servlet类分析
0 0
原创粉丝点击