JSP中存在三个指令,其中page指令最为复杂,

  • page
  • include
  • taglib

 

page指令

  一个JSP页面中可以存在多个page指令,page指令的格式:<%@page language="java" contentType="text/html;charset="UTF-8""%>

  一个page指令中可以存在多个属性:

  • pageEncoding:设置当前页面的编码,当服务器把JSP编译成java文件时,需要使用这个编码
  • contentType:设置页面MIME类型,表示添加一个响应头,等同于response.setContentType();

  这两个属性,如果只设置了一个,那么另一个属性默认为设置了的那一个,如果两个属性都没有设置,默认为ISO编码,

  • import:导包
  • errorPage:当前页面如果抛出异常,转发(不是重定向,地址栏不发生变化)到哪一个页面由errorPage指定,,errorPage="errorPage.jsp",
  • isErrorPage:表示当前页面是处理错误的页面,若这个属性为true,这个页面会设置状态码为500,而且可以使用9大内置对象的Exception  

  还可以在web.xml中设置错误页面 

    <error-page>
        <error-code>404</error-code>
        <location>/error404.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error500.jsp</location>
    </error-page>
    <error-page>
        <exception-type>java.lang.RuntimeException</exception-type>
        <location>/error.jsp</location>
    </error-page>  
  • autoFlush:指定JSP的输出流的缓冲区满时,是否自动刷新,默认为true,若设置为false,那么缓冲区满时,将抛出异常,
  • buffer:指定缓冲区大小,默认为8kb,一般不需要修改
  • isELIgonred:是否忽略EL表达式,默认为true,即支持EL表达式
  • language:指定当前JSP编译后的语言类型,默认为java
  • info:信息
  • isThreadSafe:当前JSP页面是否支持并发访问, 默认为false,
  • session:当前页面是否支持session,如果为false,那么当前页面的_jspService方法中就不存在session这个内置对象了
  • extends:让当前JSP生成的servlet继承某一个类

 

include指令

  include指令的形式:<%@include file="xxxxxx"%>%>,

  与RequestDispatcher的include方法有些相似,但是又存在区别,include指令是在JSP编译成java文件时完成的, 

  假设a.jsp中包含了,b.jsp,即在a.jsp的页面中有这么一段代码:

  <%@include file="b.jsp"%>%>,那么这两个JSP文件会被编译成一个java文件,它们共同生成一个java文件,就是一个Servlet,在还没有运行之前,就已经合并了,

  RequestDispatcher的include方法,包含与被包含的是两个Servlet,只是这两个Servlet使用同一个resquest和response,它们将响应在运行时合并了,来看一个例子:

  以下是hel.jsp的代码:

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    String name = "Hello";
%>
<%@include file="lo.jsp" %>
</body>
</html>

  以下是lo.jsp的代码:  

<%
    out.print(name);
%>

  我们使用浏览器访问hel.jsp,页面显示Hello,然后查看tomcat生成的java文件,文件名是hel_jsp.java,查看源码,发现lo.jsp中的内容被包含在了同一个java文件中,

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

final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}

    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("\n");
      out.write("<html>\n");
      out.write("<head>\n");
      out.write("    <title>Title</title>\n");
      out.write("</head>\n");
      out.write("<body>\n");

    String name = "yusi";

      out.write('\n');

    out.print(name);

      out.write('\n');
      out.write("\n");
      out.write("</body>\n");
      out.write("</html>\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);
    }
  }

  不过要注意include指令使用的位置,静态包含可以将页面分解,使用包含的方式组合在一个一起,这样页面中不变的页面就可以独立出来一个jsp页面,我们只要处理变化的页面就可以了,这个一来,工作就减少了。

 

taglib指令

  指令格式如下:

  <%@taglib prefix="xxxx" uri="xxxx" %>

 

  prefix:指定标签库在本页面中的前缀,自己指定

  uri:指定标签库的位置

 

posted on 2018-10-11 20:08  yusiming  阅读(471)  评论(0)    收藏  举报