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地址不会发生改变

原文地址:https://www.cnblogs.com/rogerwu/p/8524702.html

时间: 2024-09-28 07:54:40

JSP 内置对象(上)的相关文章

【JavaWeb】学习笔记五 JSP内置对象(上)

1.常用的JSP内置对象 2.out对象 out对象是JspWriter类的实例,是向客户端输出内容常用的对象 编号 方法 说明 1 void clear() 清除缓冲区的内容 2 void clearBuffer() 清除缓冲区的当前内容 3 void flush() 清空流 4 int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0 5 int getRemaining() 返回缓冲区还剩余多少可用 6 boolean isAutoFlush() 返回缓冲区满时

JAVA遇见HTML——JSP篇(JSP内置对象上)

action:表单交给哪个动作去处理 上下文路径默认的就是项目的虚拟路径 这个问题要解决我们需要配置tomcat服务器,需要修改tomcat服务器配置文档server.xml 修改完这个配置文档,tomcat服务器需要重启,否则不会生效 例如: 测试1: 测试结果: 测试2: 测试结果: 原文地址:https://www.cnblogs.com/songsongblue/p/9751761.html

【转】JSP内置对象详细介绍(上)

第一个问题: JSP有多少类内置对象? 要想回答好这个问题,首先是对JSP的基本知识和技术有深刻的理解和掌握.主要有九个 内置对象:application对象,config对象,exception对象,out对象,page对象,pageContext对象,request对象,reponse对象,session对象. 第二个问题:JSP的内置对象都是什么类型的?这些对象的作用是什么?它们常用的方法是什么呢? (1)application对象:javax.servlet.ServletContext

JSP内置对象详细介绍(上)&lt;转载&gt;

第一个问题: JSP有多少类内置对象? 要想回答好这个问题,首先是对JSP的基本知识和技术有深刻的理解和掌握.主要有九个 内置对象:application对象,config对象,exception对象,out对象,page对象,pageContext对象,request对象,reponse对象,session对象. 第二个问题:JSP的内置对象都是什么类型的?这些对象的作用是什么?它们常用的方法是什么呢? (1)application对象:javax.servlet.ServletContext

JSP内置对象(上)

在JSP中为了简化页面的开发提供了一些内置的对象.这些对象不需要由JSP的编写者通过new关键字实例化,他们都由容器实现和管理,在所有的JSP页面中都可以使用内置对象. JSP中共有9大内置对象: out对象 requset对象 response对象 session对象 pageContext对象 application对象 config对象 page对象 exception对象 JSP内置对象(下):http://wxmimperio.coding.io/?p=329 PS: [web对象的请

jsp 内置对象(五)

1.Request对象 该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息,即使用该对象可以 获取用户提交的信息. 当Request对象获取客户提交的汉字字符时,会出现乱码问题,必须进行特殊处理.首先,将获取的 字符串用ISO-8859-1进行编码,并将编码存发岛一个字节数组中,然后再将这个数组转化为字符串对象 即可.如下: String textContent=request.getParameter("boy") byte b[]=textContent.get

JSP内置对象详解

jsp中内置对象:request.response.session.applecation.out.pagecontesx.config.page.exception.cookie 1.request:是javax.servlet.httpservletRequest类型的对象,该对象是用户客户端的请求信息,主要用户接受客户端通过http协议传送到服务器的数据! (包括头部信息.系统信息.请求方式以及请求信息参数),jsp内置对象Web容器所创建的一组对象! 生命周期:jsp发出请求一个requ

尴尬!Jsp内置对象

今天挺尴尬的,上网络安全课做错了ppt ,尴尬到头皮发麻. JSP内置对象 JSP内置对象是Web容器创建的一组对象,不使用new关就可以使用的内置对象. <%int[ ]value= {60,70,80 };for (int i: value) {out.println(i);%> WEB程序的请求响应模式,用户发送请求,服务器给用户响应

JSP内置对象—session

什么是session? session对象是用来在每一个用户之间分别保存每一个用户信息的对象,以便跟踪用户的操作状态.session的信息保存在服务器端,session的id保存在客户端的cookie中. 例如我们乘坐火车就可以看做是一个session.当我们乘坐火车的时候,我们需要持有一张车票.车票就相当于是一个cookie.而车票上的座位号就相当于是sessionId.当我们需要访问列车的时候,检票员会事先检查我们是否持有cookie,如果有就根据cookie里的内容(sessionId)

JavaWeb之 JSP:内置对象,EL表达式,JSP标签基础

JSP的内置对象 什么是JSP的内置对象呢? 在JSP页面进行编程的时候,如果我们要使用一些对象,如:HttpSession,ServletConfig,ServletContext这些对象,如果每次都要先创建这些对象,然后再去使用它们,这样就显得十分繁琐了,为了方便使用者,Sun公司在开发JSP的时候,把一些对象设置为内置对象,开发者在JSP页面编程的时候不必声明这些对象就能直接使用,这就是JSP的内置对象. 那么JSP对象有哪些呢? JSP内置对象          对应的类型   备注 R