• JSP 内置对象(上)


    JSP 内置对象是 Web 容器创建的一组对象,不使用 new 关键字就可以直接使用的对象。如上一章中使用脚本实现打印九九乘法表中的out对象

    <%-- 脚本:out对象是JSPWriter类的实例,用于向客户端输出内容 --%>
    <%
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <=i; j++) {
                out.print(i + "*" + j + "=" + (i*j) + "&nbsp;&nbsp;");
            }
            out.println("</br>");
        }
    %>

    JSP 共有九大内置对象

    常用(5个): out, request, response, session, application

    不常用(4个): page, pageContext, execption, config

    缓冲区(Buffer)

    所谓缓冲区就是内存的一块区域用来保存临时数据。下图中,可以把一粒一粒米饭想象成字节,把盛米饭的容器想象成缓冲区

    out 对象

    out 对象是 JspWriter 类的实例,是向客户端输出内容

    常用方法如下:

    1、void println() 向客户端打印字符串

    2、void clear() 清除缓冲区的内容,如果在 flush 之后调用会抛出异常

    3、void clearBuffer() 清除缓冲区的内容,如果在 flush 之后调用不会抛出异常

    4、void flush() 将缓冲区内容输出到客户端

    5、int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0

    6、int getRemaining() 返回缓冲区还剩余多少可用

    7、boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常

    8、void close() 关闭输出流 

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%
        out.println("<h2>静夜思<h2>");
        out.println("床前明月光<br>");
        out.println("疑是地上霜<br>");
        out.println("举头望明月<br>");
        out.println("低头思故乡<br>");
    %>
    <hr>
    获取缓冲区大小:<%=out.getBufferSize() %> size; <br>
    获取缓冲区可用大小:<%=out.getRemaining() %> size; <br>
    是否自动清空缓冲区:<%=out.isAutoFlush() %>
    </body>
    </html>

    页面输出结果:

    下面在静夜思中间加入flush,虽然页面输出不受影响,但是可用剩余缓冲区变大。然后分别试图在其后运行 out.clear() 和 out.clearBuffer()

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%
        out.println("<h2>静夜思<h2>");
        out.println("床前明月光<br>");
        out.println("疑是地上霜<br>");
        out.flush();
        // out.clear(); // Error: Attempt to clear a buffer that's already been flushed
        // out.clearBuffer();
        out.println("举头望明月<br>");
        out.println("低头思故乡<br>");
    %>
    <hr>
    获取缓冲区大小:<%=out.getBufferSize() %> size; <br>
    获取缓冲区可用大小:<%=out.getRemaining() %> size; <br>
    是否自动清空缓冲区:<%=out.isAutoFlush() %>
    </body>
    </html>

    request 对象

    客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。request是HttpServerletRequest类的实例。

    request 对象具有请求域,即完成客户端的请求之前,该对象一直有效。常用方法如下:

    • String getParameters(String name): 返回name 指定参数的参数值
    • String[] getParameterValues(String name): 返回包含参数name 的所有值的数组
    • void setAtrribute(String, Object): 存储此请求中的属性
    • Object getAttribute(String name): 返回指定属性的属性值
    • String getContentType(): 得到请求体的MIME 类型
    • String getProtocol(): 返回请求用的协议类型及版本号
    • String getServerName(): 返回接受请求的服务器主机名
    • int getServerPort(): 返回服务器接受此请求所用的端口号
    • String getCharacterEncoding(): 返回字符编码的方式
    • void setCharacterEncoding(): 设置请求的字符编码方式
    • int getContentLength(): 返回请求体的长度(以字节数)
    • String getRemoteAddr(): 返回发送此请求的客户端IP地址
    • String getRealPath(String path): 返回一虚拟路径的真实路径
    • String request.getContextPath(): 返回上下文路径

    创建一个简单用户注册表单: login.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form name="loginForm" action="request.jsp" method="post">
        用户名:<input type="text" name="username"><br>
        爱好:<input type="checkbox" name="favorite" value="reading">阅读
            <input type="checkbox" name="favorite" value="singing">唱歌
            <input type="checkbox" name="favorite" value="basketball">篮球
            <input type="checkbox" name="favorite" value="swimming">游泳<br>
            <input type="submit" value="提交">
    </form>
    
    </body>
    </html>

    创建一个处理数据的 request.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%
        request.setCharacterEncoding("utf-8"); // 解决中文乱码问题
    %>
    用户名:<%=request.getParameter("username") %><br>
    
    爱好:<%
        String[] favorites = request.getParameterValues("favorite");
        for (String favorite:favorites) {
            out.println(favorite);
        }
    %>
    
    </body>
    </html>

    页面展示效果如图:

    现在查看下通过a链接跳转页面,不走form表单提交的情况,把login.jsp 稍改下

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form name="loginForm" action="request.jsp" method="post">
        用户名:<input type="text" name="username"><br>
        爱好:<input type="checkbox" name="favorite" value="reading">阅读
            <input type="checkbox" name="favorite" value="singing">唱歌
            <input type="checkbox" name="favorite" value="basketball">篮球
            <input type="checkbox" name="favorite" value="swimming">游泳<br>
            <input type="submit" value="提交">
    </form>
    
    <a href="request.jsp?username=Kobe">测试URL传参数</a>
    </body>
    </html>

    由于a链接的带参参数中只测试username,所以favorite为空的情况下会报错的,要对request.jsp 稍作修改

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%
        request.setCharacterEncoding("utf-8"); // 解决中文乱码问题
    %>
    用户名:<%=request.getParameter("username") %><br>
    爱好:<%
            if (request.getParameterValues("favorite") != null) {
                String[] favorites = request.getParameterValues("favorite");
                for (String favorite:favorites) {
                    out.println(favorite + "&nbsp;&nbsp;");
                }
            }
        %>
        
    
    </body>
    </html>

    查看页面运行效果:

    但是当 a 链接参数中传参为中文时就会出现乱码

    虽然通过request.setCharacterEncoding() 为 utf-8,但是仅限于 request 作用域。要解决 url 中文乱码问题,就要修改tomcat 的server.xml了

    <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    
    ----> 增加 URIEncoding属性
    <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" URIEncoding="utf-8" />

    右键删除 eclipse 控制台 server下的服务器,重新启动 Tomcat 服务器后,再次运行:

    接下来测试其它的request方法:

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%
        request.setCharacterEncoding("utf-8"); // 解决中文乱码问题
        request.setAttribute("password", "123456");
    %>
    用户名:<%=request.getParameter("username") %><br>
    爱好:<%
            if (request.getParameterValues("favorite") != null) {
                String[] favorites = request.getParameterValues("favorite");
                for (String favorite:favorites) {
                    out.println(favorite + "&nbsp;&nbsp;");
                }
            }
        %><br>
    密码:<%=request.getAttribute("password") %><br>
    MIME类型:<%=request.getContentType() %><br>
    协议类型及版本号:<%=request.getProtocol() %><br>
    服务器主机名:<%=request.getServerName() %><br>
    端口号:<%=request.getServerPort() %><br>
    字符编码方式:<%=request.getCharacterEncoding() %><br>
    请求体长度:<%=request.getContentLength() %>bytes<br>
    客户端IP地址:<%=request.getRemoteAddr() %><br>
    虚拟路径的真实路径:<%=request.getRealPath("request.jsp") %><br>
    上下文路径:<%=request.getContextPath() %>
    
    </body>
    </html>

    页面输出结果:

    response 对象

    response对象包含了响应客户请求的相关信息,但在JSP 中很少直接用到它,它是HTTPServletResponse 类的实例。

    response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。

    常用方法:

    • String getCharacterEncoding(): 返回响应的是何种字符编码方式
    • void setContentType(String type): 设置响应的MIME 类型
    • PrintWriter getWriter(): 返回可以向客户端输出字符的一个对象(注意比较:PrintWriter 与内置out对象的区别)
    • sendRedirect(java.lang.String location): 重新定向客户端的请求
    <%@ page language="java" import="java.io.*" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    
        <%
            response.setContentType("text/html; charset=utf-8"); // 设置响应的MIME类型
            
            out.println("<h1>response 内置对象</h1>");
            out.println("<hr>");
            
            PrintWriter outer = response.getWriter(); // 获得输出流对象
            outer.println("看看我的位置在哪里");
        %>

    向客户端输出字符串对象,printWriter 输出总是提前于 jspWriter 的内置 out 对象

    如果想让让 jspWriter 优于 printWriter 向客户端输出字符串对象,可以使用 out.flush() 方法,flush的作用是强制把前面的内容输入

    <%@ page language="java" import="java.io.*" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    
        <%
            response.setContentType("text/html; charset=utf-8"); // 设置响应的MIME类型
            
            out.println("<h1>response 内置对象</h1>");
            out.println("<hr>");
            
            out.flush(); // 注意看页面字符串的先后顺序
            
            PrintWriter outer = response.getWriter(); // 获得输出流对象
            outer.println("看看我的位置在哪里");
        %>

    注意与上面对比页面字符串的输出顺序:

    再来看下重定向方法:

    <%@ page language="java" import="java.io.*" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    
        <%
            response.setContentType("text/html; charset=utf-8"); // 设置响应的MIME类型
            
            out.println("<h1>response 内置对象</h1>");
            out.println("<hr>");
            
            PrintWriter outer = response.getWriter(); // 获得输出流对象
            outer.println("看看我的位置在哪里");
            response.sendRedirect("login.jsp"); // 请求重定向
        %>

    页面跳转了:

    请求重定向 和 请求转发的区别

    请求重定向:

    • 客户端行为
    • response.sendRedirect()
    • 从本质上讲,等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变

    请求转发:

    • 服务器行为
    • request.getRequestDispatcher().forward(req, res)
    • 是一次请求,转发后请求对象会保存,地址栏的URL地址不会发生改变

  • 相关阅读:
    websocket实现简单的两端双向实时通信
    Carla自动驾驶仿真模拟器基本概念
    vue出镜率比较高的十大面试题
    solidity开发3类型1
    分苹果
    批清除VC临时文件
    ORM框架SQLAchemy的使用
    Yapi————安装部署
    C#中的语句
    C#中的类型转换
  • 原文地址:https://www.cnblogs.com/rogerwu/p/8524702.html
Copyright © 2020-2023  润新知