• 1.3(学习笔记)JSP(Java Server Pages)内置对象


    一、内置对象

      内置对象又称内建对象、隐式对象,是由服务器自动创建实例化的,

      用户在使用时不需要显示的创建,可直接使用。

      jsp内置对象名称,类型及作用域

      

      Scope代表该内置对象的作用范围,page表示当前界面有效,application表示当前web程序范围内有效。

      作用范围从小到大为 page->request->session->application

    内置对象 request:request是一个HttpServletRequest的实例化对象,当客户端请求JSP页面时,容器会自动创建一个request对象代表当前的请求。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <%
           String url = request.getRequestURL().toString();//获取请求的URL地址
           //返回URL中协议名称到查询字符串之间的部分,API中是这样说的。
           //但我认为看作是,URL中服务器到请求参数之间,表示一个资源的标识的字符串更好理解。
           String uri = request.getRequestURI();
           String scheme = request.getScheme();//返回用于发出此请求的方案的名称,例如http、https或ftp。
           String serverName = request.getServerName();//返回请求发送到的服务器的主机名。
           int serverPort = request.getServerPort(); //返回请求发送到的端口号。它是主机头值(如果有)中“:”之后部分的值
           String contextPath = request.getContextPath();//获取上下文路径
           String query = request.getQueryString();  //获取请求URL中包含的查询字符串。
           // URL: scheme://host[:port#]/path/.../[;url-params][?query-string][#anchor]
        %>
        <table>
            <tr>
                <td>
                    URL
                </td>
                <td>
                    <%=url %>
                </td>
            </tr>
            <tr>
                <td>
                    URI
                </td>
                <td>
                    <%=uri %>
                </td>
            </tr>
            <tr>
                <td>
                    scheme
                </td>
                <td>
                    <%=scheme %>
                </td>
            </tr>
            <tr>
                <td>
                    serName
                </td>
                <td>
                    <%=serverName %>
                </td>
            </tr>
            <tr>
                <td>
                    serverPort
                </td>
                <td>
                    <%=serverPort %>
                </td>
            </tr>
            <tr>
                <td>
                    contextPath
                </td>
                <td>
                    <%=contextPath %>
                </td>
            </tr>
            <tr>
                <td>
                    query
                </td>
                <td>
                    <%=query %>
                </td>
            </tr>
            
            
        </table>
    </body>
    </html>

    上述主要是reques获取路径相关的方法。

    reques中其他关于请求转发、包含、Session,Cookie的方法,

    request.getSession();//获取Session,如果没有则创建Session

    request.getCookies();//获取所有Cookie对象

    request.getRequestDispatcher("xxx.jsp").forward(request,response);//请求转发到其他页面

    request.setAttribute(String name, Object value);//将指定name和对应的value绑定到此request。

    request.getAttribute(String name);//获取此request中指定name对应的value。

    具体使用可参阅:

    页面跳转(请求转发request.getDispatcher().forward(),请求包含requese.getDispatcher().include(),重定向response.sendRedirect())

    URL和URI的区别:

    首先我们看下名称,URL统一资源定位符,RUI统一资源标识符。

    一个代表定位,一个代表标识。

    标识是一个抽象的概念,比如我可以说张三是一个人对应的标识。

    这个世界上可以有很多人叫张三,

    内置对象 response:当服务器创建request对象时会同时创建用于响应这个客户端的response对象。


    void sendRedirect(java.lang.string位置)

    使用指定的重定向位置URL向客户端发送临时重定向响应。

    void addcookie(cookie cookie)

    将指定的cookie添加到响应中。

    response.setStatue(xxx);
    设置状态码,例如设置状态为404,执行后界面会显示错误.

    还有一些关于头信息的操作此处就不一一列举了,有兴趣可参阅AIP。

    我们看下setStatue这个方法:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" isErrorPage = "true"%>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <% response.setStatus(404); %>
    </body>
    </html>

    页面本身的内容和资源都没有问题,但由于设置了响应状态码为404,

    访问时会显示404错误。

    :测试是最好采用IE浏览器,本例测试时采用Chrome无法显示404错误页面。

    内置对象 out:JspWriter类的实例,用于把结果输出至网页上.out里面主要是一些print、println和其他方法。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" isErrorPage = "true"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <%     
            out.println("缓冲区空间:" + out.getBufferSize());
            out.print("缓冲区剩余空间:" + out.getRemaining());
            out.flush();//刷新缓冲区
            out.newLine();//输出一个换行
            out.println(new char[]{'1','2','3'});
            out.newLine();//输出一个换行
            out.println("是否自动刷新:" + out.isAutoFlush());
            out.newLine();//输出一个换行
            out.println("out");
        %>
    </body>
    </html>

    newLine方法输出的换行不会在界面显示出来,但可以通过查看源代码看到。

    内置对象 session:session对象是 javax.servlet.http.HttpSession 类的实例。

    和Java Servlets中的session对象有一样的行为。

    session.getId();获取SessionID。

    session.setAttrubute(String name, Object value);//使用指定的name将value绑定到此Session。

    session.getAttrubute(String name);根据此session中指定的name对应的value。

    session.invalidate();销毁此session。

    具体使用可参阅:Session

    内置对象 application:是javax.servlet.ServletContext 类的实例。

    javax.servlet.ServletContext类:

    定义servlet用于与其servlet容器通信的一组方法,例如,获取文件的mime类型、分派请求或写入日志文件。

    每个Java虚拟机每一个“Web应用程序”都有一个上下文。

    <%@ page language="java" contentType="text/html; charset=GBK"
        pageEncoding="UTF-8" isErrorPage = "true"%>
    <%@ page import = "com.filter.SimpleFilter" %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <% 
            int majorVersion = application.getMajorVersion();//返回此servlet容器支持的JavaServlet API的主要版本。
            int minorVersion = application.getMinorVersion();//返回此servlet容器支持的servlet API的次要版本。
            String mimeType = application.getMimeType("web.xml");//获取指定文件的MIME类型,如果类型未知返回null
            String path = application.getRealPath("out.jsp");//取得给定文件、文件夹的本地端绝对地址
            
            out.println(majorVersion + "<br>");
            out.println(minorVersion + "<br>");
            out.println(mimeType + "<br>");
            out.println(path + "<br>");
        %>
        
    </body>
    </html>

    getRealPath获取的是本地端(服务器端)上的指定文件的绝对地址。

    所以显示的是服务器本地的绝对路径,而不是URL地址。

    内置对象:pageContext:

    pageContext实例提供对与JSP页关联的所有名称空间的访问,提供对多个页面属性的访问

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import = "javax.servlet.jsp.*" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
            <%
            //获取request对象,并设置值
            ServletRequest re = pageContext.getRequest();
            re.setAttribute("attributeName", "request");
            //获取session对象,并设置值
            HttpSession se = pageContext.getSession();
            se.setAttribute("attributeName", "session");
            //获取ServletContext(application)对象,并设置值
            ServletContext sc = pageContext.getServletContext();
            sc.setAttribute("attributeName","servletContext");
            
            //获取本页面指定name对应的值
            out.println(pageContext.getAttribute("attributeName"));
            //获取session-scope中指定name对应的value
            out.println(pageContext.getAttribute("attributeName",pageContext.SESSION_SCOPE));
            %>
    </body>
    </html>

    第一个是获取当前页面中的“attribute”对应的value,由于当前页面没有设置,所以为null。

    第二个是获取指定scope中指定name对应的value,所以是“session”。

    既然有添加Attribute的方法,对应的也有移除的方法。

    pageContext.removeAttribute("attrName", PAGE_SCOPE);

     上列代码就代表移除指定scope中制定的attrName对应的值。

    pageContext中还提供

    forward(String relativeUrlPath);//转发到指定路径

    inclde(String firelativeUrlPathe)//包含指定路径文件

     pageContext.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import = "javax.servlet.jsp.*" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
            <%
            //获取request对象,并设置值
            ServletRequest re = pageContext.getRequest();
            re.setAttribute("attributeName", "request");
            //获取session对象,并设置值
            HttpSession se = pageContext.getSession();
            se.setAttribute("attributeName", "session");
            //获取ServletContext(application)对象,并设置值
            ServletContext sc = pageContext.getServletContext();
            sc.setAttribute("attributeName","servletContext");
            
            //转发到out.jps页面
            pageContext.forward("out.jsp");
            %>
    </body>
    </html>

    out.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" isErrorPage = "true"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <%   //获取request和session中设置的值  
            out.println(request.getAttribute("attributeName"));
            out.println(session.getAttribute("attributeName"));
        %>
    </body>
    </html>

    include()方法有兴趣的可以自行测试。  

    内置对象 config:config对象是 javax.servlet.ServletConfig 类的实例,直接包装了servlet的ServletConfig类的对象。

    ServletConfig主要用Servlet初始化时传递一些信息。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <%
            ServletContext sc = config.getServletContext();//获取ServletContext
            out.println(config.getServletName()); //获取servletname
            out.println(config.getInitParameter("fork"));//获取初始化参数
        %>
    </body>
    </html>

    jsp的servlet配置在tomcat下的web.xml中。

    内置对象 exception:对象包装了从先前页面中抛出的异常信息。它通常被用来产生对出错条件的适当响应。

    exception是java.lang.Throwable类的实例化对象,主要用于输出异常性息。

    exception只有在页面设置了 <@Page isErroePage = "true"> exception内置对象才会被实例化,

    如果没有设置isErrorPage = "true",当前jsp生成的Servlet中不会实例化exception,页面也无法使用exception。

    JSP对应Servlet中实例化语句:

    实例化中有一个request作为参数,当前exception可以接收从先前页面抛出的异常,request就是先前页面的request。

    我们来看下代码:

    index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!-- 设置错误跳转页面,如果发生错误会跳转到exception.jsp-->    
    <%@ page errorPage = "exception.jsp" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <%
            String str = null;
            //request设置一个值
            request.setAttribute("attribute", "indexRequest");
            str.equals("123");//此处有空指针异常,由于设置了错误跳转页面,会跳转到指定页面。
        %>
    </body>
    </html>

    exception.jsp 

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" isErrorPage = "true"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
            <h2> This exception page </h2>
         <!-- 输出异常信息 --> <%=exception.toString() %> <%//获取request值,并输出 out.print("<br>"); out.println(request.getAttribute("attribute")); %> </body> </html>

    可以看到跳转到exception.jsp后输出了前一个页面的异常信息,并且获得去前一个页面request设置的值。

    page:page代表当前JSP对应的Servlet本身。

    这段话可能不太好理解,我们来看下当前JSP生成的Servlet中对page的定义。

    可以看到page就代表当前对象,这个平常不怎么用。

    生成的Servelt中的属性基本都是private修饰的,不再当前Servlet中用page也无法访问。

    page只有Object类中定义的一些方法,例如hashCode()、equals()、toString()等。

  • 相关阅读:
    Merlin 的魔力: SpringLayout 管理器
    setOpaque(true);设置控件不透明
    运用 BoxLayout 进行 Swing 控件布局
    李洪强iOS开发本人集成环信的经验总结_02_基本配置
    李洪强iOS开发之-PCH文件的配置
    李洪强iOS开发本人集成环信的经验总结_01环信SDK的导入
    iOS开发UI篇—Quartz2D使用(矩阵操作)
    iOS开发UI篇—Quartz2D使用(图形上下文栈)
    iOS开发UI篇—Quartz2D简单使用(二)
    iOS开发UI篇—Quartz2D简单使用(一)
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/10334901.html
Copyright © 2020-2023  润新知