zoukankan      html  css  js  c++  java
  • JSP基础语法:注释、Scriptlet、编译指令


    JSP(Java Server Page)

    JSP简单的说就是HTML+JAVA代码,文件后缀为.jsp的文件。

    JSP和Servlet是JavaEE的重要基础,看起来JSP和Servlet是两个完全不同的东西,但是JSP其实就是Servlet的一种形式,JSP最终需要被编译成Servlet;

    JSP页面必须部署到web容器中才能够访问,因为单单的JSP页面时没有用处的;必须要转换成Servlet才能够使用;

    JSP是面向对象的,因为最后会变成Servlet,而Servlet是一个类,这个可能不好理解,下面会有讲解.


    而用户访问JSP页面看到的输出时Servlet输出流的结果;

    JSP可以不处理异常,因为如果产生异常有两种处理方法:

    1.在浏览器页面显示;

    2.跳转到errorPage;


    JSP到Servlet的转换


    当第一次访问某个JSP文件时,web服务器会将JSP文件转换成Servlet,再由Servlet提供输出流将HTML输出给客户.因此客户接触的只是HTML而已,而JSP的处理过程都是在服务器完成的;

    注意:每个Servlet类的对象在容器中只有一个,因此每个客户访问的同一个JSP页面都是一个Servlet对象;

    假设有null.jsp文件,此文件内容为空,如下所示:

    <%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8" info="This is a JSP " %>
    <html>
    	<body>
    	</body>
    </html>

    在tomcat的work目录中会生成null_jsp.java和null_jsp.class,null_jsp.java的代码如下:

    package org.apache.jsp;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.jsp.*;
    
    
    //HttpJspBase是Servlet的子类
    /*
    此类主要有三个方法组成:
    1.init();   初始化
    2.destroy(): 销毁
    3.service();  接收客户端请求并处理
    */
    
    
    public final class null_jsp extends org.apache.jasper.runtime.HttpJspBase
        implements org.apache.jasper.runtime.JspSourceDependent {
    
      public String getServletInfo() {
        return "This is a JSP ";
      }
    
      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 {
    //生成JSP内置对象
        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;
    //输出JSP页面中的显示
          out.write("\r\n");
          out.write("<html>\r\n");
          out.write("\t<body>\r\n");
          out.write("\r\n");
          out.write("\t</body>\r\n");
          out.write("</html>");
        } 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);
        }
      }
    }
    

    从以上代码就可以很清晰地看出JSP和Servlet的关系了,JSP编写的<%%>  <%=%>  和 html代码都是在Service函数中实现;

    而<%!  %>中的代码作为Servlet类的成员变量和成员方法;

    JSP内置对象就是在这个文件中被创建的。


    一、注释


    一种语言都会有注释,而这里JSP有两种类型的注释,用户能够查看网页源代码看见显式注释,而看不见隐式注释。

    (1)显式注释:<!--显式注释 -->
    (2)隐式注释:

    //隐式注释

    /*隐式注释*/

    <%--隐式注释   --%>


    二、在HTML中插入JAVA代码方法:


    1.Scriptlet:脚本小程序


    (1)<%...%>:可以插入一些语句。

        举例:<% out.println("<h2>Hello world</h2>");  %>表明向网页输出一个Hello world语句。

    (2)<%! ...  %>:只能放置全局变量、全局常量、类、函数。

        举例:

    <%!

        public static final String INFO="HELLO WORLD";

        class Person{

            .....

        }

    %>

    注意:<%! %>中不能使用内置对象!

    (3)<%= ... %>:只能放置一个变量、常量。

        举例:<%="Hello world"%>


    2.<jsp:scriptlet>标签


        在<jsp:scriptlet></jsp:scriptlet>中插入语句即可。


    三、编译指令


    编译指令模板:<%@ 指令     %>

    1.page指令


    page指令放在jsp文件的最上方,描述一些信息,以<%@ page 属性="值"%>的形式出现;

    属性能够有:

    (1)contentType:网页的内容类型,即MIME类型,通常为 contentType="text/html";里面还能设定字符集,经常为 contentType="text/html;charset=GBK";

    (2)language:表示脚本所用语言,目前只能为 language="java";

    (3)pageEncoding:表示页面的编码方式,通常为 pageEncoding="GBK";

    (4)import:表示在写java代码时需要导入的包,比如需要使用JDBC,则需要导入java.sql.*,则为 import= "java.sql.*";

    (5)errorPage:当错误时需要跳转到的页面,但是同时那个错误页必须设置isErrorPage属性。

            注意:通常在错误页中需要首先设置response.setStatus(200);   错误页跳转是服务器跳转


    JSP不需要处理异常的原因就是因为有errorPage属性,errorPage属性类似于catch{  },有异常,则跳转到错误页面


    (6)isErrorPage:如果某页为错误页,则必须设置为 isErrorPage="true";

    在整个虚拟目录中添加错误页、异常处理页等:

    在虚拟目录中的web.xml中添加:

    <error-page>

    <error-code>404</error-code>

    <location>/error/clientError.jsp</location>

    </error-page>

    <error-page>

    <exception-type>java.lang.NullPointerException</exception-type>

     <location>/error/exception.jsp</location>

    </error-page>

    注意:配置完web.xml后需要重启tomcat服务器;

    综合举例:

    <%@ page language="java" contentType="text/html;charset=GB2312" pageEncoding="GB2312" import="java.util.*" errorPage="error.html"%>


    注意点:


    (1)如果需要让页面识别中文,则必须设置pageEncoding属性。

    (2)MIME类型:key--->value,key表示文件后缀,而value表示打开这个后缀的应用程序类型。在tomcat的conf/web.xml中可以查看MIME类型及其打开方式。

    比如,如果设置为application/msword,则说明用word打开,键入网页后会先下载,下载后能够用word打开。

    更改名称:通过response.setHeader("Content-Disposition","attachment;filename=xiazdong.doc"); 即可;

    (3)html和htm是一样的。

    (4)pageEncoding指定JSP的页面编码,而contentType是客户端的编码。


    2.include指令

    <%@ include file="filename"%>

    这是静态包含,即将被包含的文件融入成为一个文件,因此从tomcat生成的java文件中可以看出。

    而动态包含则是调用了include函数将一个文件包含进来,而不是融为一体;

    以上区别在外部是看不出的,需要观察自动生成的Servlet类才能看出;

    静态包含的缺点就是不能传递参数;


    四、客户端跳转和服务器跳转:


    (1)客户端跳转:这种形式的跳转会使得地址栏的地址改变为跳转的地址,比如a.jsp--->b.jsp,原本地址栏是a.jsp,跳转之后地址栏变成b.jsp,则这种跳转属于客户端跳转。

    (2)服务器跳转:跳转后地址栏没有改变,并且不会丢失请求参数。比如a.jsp-->b.jsp,则地址栏一直维持a.jsp,则称为服务器跳转。

    而我们刚才遇到的errorPage跳转就是服务器跳转。


    五、数据库连接:


    这里以mySQL为例,配置步骤为把mySQL的JDBC驱动程序放到tomcat/lib中,通常我们把第三方的jar包都放在这里。

    需要注意的是需要加入try语句,其他的和JDBC差不多,就不介绍了。


    六、包含指令(include)

    简单的来说就是包含一个html/jsp/htm文件,包含分为两种:

    (1)静态包含:先包含,再编译。形如:<%@ include file="demo.html"%>

            举例:有a.jsp、b.jsp、c.jsp,在a.jsp中静态包含b.jsp、c.jsp意味着先将b.jsp、c.jsp的代码都写入a.jsp,然后编译生成class文件。

    (2)动态包含:对于一个动态页面,先编译,后包含。形如:<jsp:include page="demo.jsp"/>

            举例:有a.jsp、b.jsp、c.jsp,在a.jsp中动态包含b.jsp、c.jsp意味着编译生成class文件,然后再包含在一起。

    动态包含还能够传递参数,注意,是包含页面--->被包含页面,形如:

        <jsp:include page = "demo.jsp"/>

                <jsp:param name="name" value="xiazdong"/>

                <jsp:param name="age" value="20"/>

        </jsp:include>

    被包含页通过request.getParameter()接收。


    七、跳转指令(<jsp:forward>) 服务器跳转


    (1)没传递参数的跳转指令:


            <jsp:forward page="demo.jsp"/>


    (2)传递参数的跳转指令:


            <jsp:forward page="demo.jsp">

                    <jsp:param name="name" value="xiazdong"/>

                    <jsp:param name="age" value="20">

            </jsp:forward>

     参数通过request.getParameter("");接收,其实由于此跳转为服务器端跳转,所以也可以通过设置request内置对象设置属性进行传递,JSP内置对象后面会讲到。

    补充:JSP生命周期

    1.web容器读取web.xml中的配置信息;

    2.当客户发出jsp请求时,JSP翻译成Servlet,并编译成class文件;

    3.容器加载Servlet;

    4.容器实例化Servlet,并调用jspInit()方法;

    5.容器创建Servlet线程,调用Service方法;

    6.调用destroy();

    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    Python eval 函数妙用
    502与504故障分析与解决方法
    [转]谈谈select, iocp, epoll,kqueue及各种网络I/O复用机制
    计算阶乘n!末尾0的个数
    C++中的Overload、Override和Overwrite
    C++中的空类与空结构体大小
    多线程编程之优先级翻转问题
    数据库原理之事务(二)
    数据库原理之事务(一)
    NoSQL之基础篇
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058365.html
Copyright © 2011-2022 走看看