JavaWeb基础之JSP初探

作者: Acamy丶 | 来源:发表于2017-06-07 20:14 被阅读74次

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术,jsp文件相当于在html页面嵌套java代码,即方便排版又为用户提供了动态数据。

    1. 第一个JSP页面

    如下所示,我们在..WebRoot目录下面定义firstJSP.jsp并写下内容,布置到tomcat服务器后我们就可以像访问静态html页面一样去访问该页面。

    <%@ page language="java" import="java.util.*,java.text.*" pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head> 
        <title>第一个jsp页面</title>  
      </head>
      
      <body>
        <%
            //写java代码
            //获取当前时间
            SimpleDateFormat sdf = new SimpleDateFormat();
            String curDate = sdf.format(new Date());
            //输出内容到浏览器
            //response.getWriter().write("");
            out.write("当前时间为:"+curDate);
         %>
      </body>
    </html>
    

    效果如下:

    2.JSP页面执行过程

    我们接下来看下JSP页面是如何编绎嵌套在html里面的代码,并向浏览器输出。
    首先,tomcat服务器在浏览器每一次访问时就将jsp文件翻译成java文件,并把java文件编绎成class字节码文件,我们在tomcat的work对应项目目录下可以找到这两个文件:

    然后看一下firstJSP_jsp.java里面的内容:

    /*
     * Generated by the Jasper component of Apache Tomcat
     * Version: Apache Tomcat/7.0.57
     * Generated at: 2017-06-07 11:33:50 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.*;
    import java.util.*;
    import java.text.*;
    
    public final class firstJSP_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;
    
      private javax.el.ExpressionFactory _el_expressionfactory;
      private org.apache.tomcat.InstanceManager _jsp_instancemanager;
    
      public java.util.Map<java.lang.String,java.lang.Long> 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 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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\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("  \r\n");
          out.write("  <body>\r\n");
          out.write("    ");
    
            //写java代码
            //获取当前时间
            SimpleDateFormat sdf = new SimpleDateFormat();
            String curDate = sdf.format(new Date());
            //输出内容到浏览器
            //response.getWriter().write("");
            out.write("当前时间为:"+curDate);
         
          out.write("\r\n");
          out.write("  </body>\r\n");
          out.write("</html>\r\n");
        } 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);
        }
      }
    }
    

    通过上面的源码知道翻译成的java文件是一个HttpJspBase类,查看API可知该类继承于HttpServlet,到此为止我们基本上可以下一个结论:Jsp就是一个servlet程序
    当我们每次访问JSP页面时就会执行类里面的_jspService方法,可以看到这个方法包含了JSP页面的所有内容。并且放在一个try代码块里面。
    同Servlet的生命周期类似,该类的构造方法和_jspInit()方法只在每一次访问时执行,在tomcat服务器重新布署时执行_jspDestroy()方法。

    将JSP页面的执行过程用流程图的形式总结如下:

    3.JSP语法

    3.1 Jsp模板

    jsp页面中的html代码就是jsp的模板

    3.2 Jsp表达式

    语法:<%=变量或表达式%>
    举例:
    作用: 向浏览器输出变量的值或表达式计算的结果
    注意:
    1)表达式的原理就是翻译成out.print(“变量” );通过该方法向浏览器写出内容
    2)表达式后面不需要带分号结束。

    3.3 Jsp的脚本

    语法:<%java代码 %>
    作用: 执行java代码
    注意:
    1)原理把脚本中java代码原封不动拷贝到_jspService方法中执行。

    3.4 Jsp的声明

    语法:<%! 变量或方法 %>
    作用: 声明jsp的变量或方法
    注意:
    1)变量翻译成成员变量,方法翻译成成员方法。

    3.5 Jsp的注释

    语法: <%!-- jsp注释 --%>
    注意;
    1)html的注释会被翻译和执行。而jsp的注释不能被翻译和执行。

    4 Jsp的三大指令

    4.1 include指令

    作用: 在当前页面用于包含其他页面
    语法: <%@include file="common/header.jsp"%>
    注意:
    1)原理是把被包含的页面(header.jsp)的内容翻译到包含页面(index.jsp)中,合并成翻译成一个java源文件,再编译运行!!,这种包含叫静态包含(源码包含)
    2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、 body)

    4.2 page指令

    作用: 告诉tomcat服务器如何翻译jsp文件
    语法:
    <%@ page
    language="java" --告诉服务器使用什么动态语言来翻译jsp文件
    import="java.util.*" --告诉服务器java文件使用什么包,导入包,多个包之间用逗号分割
    pageEncoding="utf-8" --告诉服务器使用什么编码翻译jsp文件(成java文件)
    contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码
    注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题
    errorPage: 指定当前jsp页面的错误处理页面。
    isErorrPage: 指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用 exception内置对象;true,是错误处理页面,可以使用exception内置对象。
    配置全局的错误处理页面可在web.xml添加如下内容:

      <!-- 全局错误处理页面配置 -->
      <error-page>
        <error-code>500</error-code>
        <location>/common/500.jsp</location>
      </error-page>
      <error-page>
        <error-code>404</error-code>
        <location>/common/404.html</location>
      </error-page>
    

    session: 是否开启session功能。false,不能用session内置对象;true,可以使用session内置对象。
    buffer: jsp页面的缓存区大小。
    isELIgnore: 是否忽略EL表达式。
    %>

    4.3 taglib指令

    Taglib指令用于在JSP页面中导入标签库,后面再看

    5.JSP基本组成语法实例

    header.jsp:用于测试include指令

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
       头部页面的内容
    

    script.jsp:

    <!-- page指令  -->
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head> 
        <title>Jsp语法</title>  
      </head>
      
      <body>
        <!-- include指令  -->
        <%@include file="common/header.jsp"%>
        
        <!-- jsp表达式  -->
        <%
            //变量
            String name = "acamy";
            int a = 10;
            int b =20;
         %>
        <%=name %>  
        <br/>
        <%=(a-b) %>  
        <hr/>
        <!-- jsp脚本  -->
        <%
            //生成随机数
            Random ran = new Random();
            float num = ran.nextFloat();
         %>
         随机小数:<%=num %>
         <hr/>
         <!-- 穿插html代码 -->
         <%
            for(int i=1;i<=6;i++){  
          %>
            <h<%=i %>>标题<%=i %></h<%=i %>>
         <%
          }
          %>
          <hr/>
          <!-- 练习: 使用脚本和html代码显示99乘法表 -->
         <%
            for(int i=1;i<=9;i++){//行
                for(int j=1;j<=i;j++){//公式
         %>         
                <%=i %> x <%=j %>=<%=(i*j) %> 
            <%          
                }
            %>
               <br/>
            <%  
            }
          %>
          <%
            String age = "20";
            
            /* 脚本中不能声明方法
            public String getAge(){
                return age;
            }
            */
           %>
          
          
          <!-- jsp声明 -->
          <%!
           //变量
            String name = "jacky";
            
            public String getName(){
                return name;
            }
            
            /*jsp声明中不能重复定义翻译好的一些方法
            public void _jspInit(){
            
            }
            */
           %>
           <!-- html注释 -->
          <%-- <jsp:forward page="/01.hello.jsp"></jsp:forward> --%>
           <%-- jsp注释 --%>
           
         
      </body>
    </html>
    
    

    效果如下:

    相关文章

      网友评论

        本文标题:JavaWeb基础之JSP初探

        本文链接:https://www.haomeiwen.com/subject/qeuafxtx.html