• jsp隐式对象


    隐式对象使用位置

      隐式对象在转译为Servlet后,是_jspService()中的局部变量。隐式对象只能在<%与%>之间,或<%=与%>之间直接使用。
      无法在<%!与%>之间直接使用隐式对象;但可以给它传递进去,比如:

    <%@page contentType="text/html" pageEncoding="UTF-8" %>
    <%@page import="javax.servlet.*, java.io.PrintWriter, java.util.HashMap, java.util.Map, java.util.Set" %>
    <%!
        // 方法对数是传递过来的请求和响应对象
        public void allBooks (HttpServletRequest request, HttpServletResponse response) {
            Map<String, String> bookMap = new HashMap<String, String>();
            bookMap.put("三国演义", "小说");
            bookMap.put("资治通鉴", "历史");
            bookMap.put("窦娥冤", "戏剧");
            request.setAttribute("books", bookMap);
        }
    %>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>在线书籍</title>
    </head>
    <body>
    <table style="text-align:left; 100%;" border="0">
        <tbody>
        <tr>
            <td style="background-color: rgb(51, 255, 255);">书名</td>
            <td style="background-color: rgb(51, 255, 255);">分类</td>
        </tr>
        <%
            // 给声明的方法把请求、响应对象传递进去
            allBooks(request, response);
            Map<String, String> books = (Map<String, String>)request.getAttribute("books");
            Set<Map.Entry<String, String>> entries = books.entrySet();
            for (Map.Entry<String, String> entry : entries) {
        %>
        <tr>
            <td><%= entry.getKey() %></td>
            <td><%= entry.getValue()%></td>
        </tr>
        <%
            }
        %>
        </tbody>
    </table>
    </body>
    </html>
    View Code

    1、page隐式对象

      对应于转译后Java类中的this对象。主要为不熟悉Java的网页设计师设计。


    2、pageContext隐式对象

      对应于转译后servlet的javax.servlet.jsp.PageContext类型的对象。

    作用:

      (1)所有的隐式对象都可以通过pageContext来取得
      (2)pageContext还可以使用setAttribute()、getAttribute()与removeAttribute()来设置页面范围属性,默认是设置或取得页面范围的属性
      如果传入scope参数,指定常数:pageContext.PAGE_SCOPE、pageContext.REQUEST_SCOPE、pageContext.SESSION_SCOPE、pageContext.APPLICATION_SCOPE后,分别表示在页面、请求、会话与应用程序范围内设置或取得属性。例如,设置会话范围的属性:pageContext.setAttribute("name", "zhangsan", pageContext.SESSION_SCOPE);
      当不知道属性的范围时,也可以使用pageContext的findAttribute()方法来找出属性,只要指定属性名称即可。findAttribute()会依序从页面、请求、会话、应用程序范围寻找对应的属性,先找到就返回。例如:Object attr = pageContext.findAttribute("attr");
      (3)pageContext隐式对象还具有forward()与include()方法。


    3、request隐式对象

      对应于转译后servlet的HttpServletRequest类型的对象。


    4、response隐式对象

      对应于转译后servlet的HttpServletResponse类型的对象。


    5、session隐式对象

      对应于转译后servlet的HttpSession类型的对象。


    6、application隐式对象

      对应于转译后servlet的ServletContext类型的对象。


    7.out隐式对象

      不直接对应于HttpServletResponse取得的PrintWriter对象。out隐式对象在转译之后,会对应于javax.servlet.jsp.JspWriter类的实例。JspWriter直接继承自java.io.Writer类。JspWriter主要模拟了BufferedWriter与PrintWriter的功能。JspWriter在内部也是使用PrintWriter来进行输出,但JspWriter具有缓冲区功能。
      在编写JSP页面时,可以通过page指示元素的buffer属性来设置缓冲区的大小,默认值是8kb。缓冲区满了之后该采取哪种行为,则是由autoFlush属性决定值,默认值是true,表示满了就直接清除。如果设置为false,则要自行调用JspWriter的flush()方法来清除缓冲区,如果缓冲区满了却还没调用flush()将数据送出至客户端,调用println()时将会抛出IOException异常。


    8. exception隐式对象

      如果在存取应用程序的时候发生了异常或错误,而没有在Servlet/JSP中处理这个异常或错误,则最后会由容器加以处理,一般容器就是直接显示异常信息与堆栈跟踪信息。

      (1)自定义异常范例,在指示元素中指定要使用的错误页面:

    add.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8" errorPage="error.jsp" %>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>加法网页</title>
    </head>
    <body>
        <%
            String a = request.getParameter("a");
            String b = request.getParameter("b");
            out.println("a + b = " + (Integer.parseInt(a) + Integer.parseInt(b)));
        %>
    </body>
    </html>
    View Code

    error.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8" isErrorPage="true" %>
    <%@page import="java.io.PrintWriter" %>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>錯誤</title>
    </head>
    <body>
        <%= exception %>
        <h2>顯示例外堆疊追蹤:</h2>
        <% exception.printStackTrace(new PrintWriter(out)); %>
    </body>
    </html>
    View Code

      测试地址:http://127.0.0.1/add.jsp?a=1&b=9

      由add.jsp抛出的异常对象信息就包括在exception中。只有isErrorPage设置为true的页面才可以使用exception隐式对象。
      在这个error.jsp中的标题上,只是简单地显示exception调用toString()之后的信息,也就是<%=exception%>显示的内容;另外也可将异常堆栈跟踪显示出来。printStackTrace()接受一个PrintWriter对象作为参数,所以使用out隐式对象构造PrintWriter对象,然后再使用exception的printStackTrace()方法来显示异常堆栈跟踪。

      (2)自定义异常范例,在web.xml中指定要使用的错误页面:

      a、如果希望容器发现这类异常或错误时,可以自动转发至某个URL,则可以做如下设置。

    web.xml

    <?xml version="1.1" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
             version="3.0">
        <display-name>Web Application</display-name>
    
        <error-page>
            <exception-type>java.lang.NullPointerException</exception-type>
            <location>/null.jsp</location>
        </error-page>
    
    </web-app>
    View Code

    如果在<location>中设置的是JSP页面,则该页面必须设置isErrorPage属性为true,才可以使用exception隐式对象。

    index.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>空指向测试</title>
    </head>
    <body>
        <%
            String str = null;
            out.println(str.toString());
        %>
    </body>
    </html>
    View Code

    null.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8" isErrorPage="true" %>
    <%@page import="java.io.PrintWriter" %>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>空指向异常</title>
    </head>
    <body>
        <h1>网页发生错误:</h1>
        <%= exception %>
        <h2>显示异常堆栈跟踪:</h2>
        <% exception.printStackTrace(new PrintWriter(out)); %>
    </body>
    </html>
    View Code

      测试地址:http://127.0.0.1/index.jsp

      b、如果想要基于HTTP错误状态码转发至处理页面,则是搭配<error-code>来设置。例如,在找不到文件而发出404状态码时,希望都交由某个页面处理。

    web.xml

    <?xml version="1.1" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
             version="3.0">
        <display-name>Web Application</display-name>
    
        <error-page>
            <error-code>404</error-code>
            <location>/NotFind.jsp</location>
        </error-page>
    
    </web-app>
    View Code

    NotFind.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8" isErrorPage="true" %>
    <%@page import="java.io.PrintWriter" %>
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>自定义404</title>
    </head>
    <body>
        <h1>发生错误:404</h1>
        <%= exception %>
    </body>
    </html>
    View Code

      这个设置,在自行使用HttpServletResponse的sendError()送出错误状态码时也有作用,因为sendError()只是告知容器,以容器的默认方式或web.xml中的设置来产生错误状态码的信息。


    9.config隐式对象 

       对应于转译后servlet的ServletConfig对象。

  • 相关阅读:
    Qt中的QString和QStringList常用方法
    Qt界面编程基本操作
    vs+qt编程相关
    C++的一些关键字用法
    Java学习-hashcode综合练习
    Java学习-HashMap练习
    Java学习-HashSet练习
    Java学习-HashMap性能简单测试
    Java学习-排序二叉树性能简单测试
    java学习-排序二叉树
  • 原文地址:https://www.cnblogs.com/Mike_Chang/p/10080847.html
Copyright © 2020-2023  润新知