1 定义
内置对象指的是已经由jsp内部默认内置好的,由容器统一实现和管理,使用者不用自己定义即可使用的一系列对象集合。
如下例子是其中out对象的使用用例。
<% int[] values = {10,20,30}; for(int value : values) { out.println(value); //out 为 JSP 中的内置对象 } %>
2 特点
- 由JSP规范提供,不用编写者实例化。
- 通过Web容器实现和管理。
- 所有JSP页面均可使用。
- 只有在脚本元素的表达式或代码段中才可使用,如(<%=使用内置对象%>或<%使用内置对象%>)
3 按照功能分类
- 输出输入对象:requestion对象、application对象;
- 通信控制对象:pageContext对象、session对象、application对象;
- Servlet对象:page对象、config对象;
- 错误处理对象:exception对象。
注:在实际开发中,常用的内置对象有out、request、response、session、application,而内置对象pageContext、page、exception、config使用的频率不高。
4 web程序的请求与响应模式
web程序是基于http协议的,使用请求/响应的模式来实现交互。
这里面涉及到两个角色,一个是客户端,另一个是服务端。客户端向服务端发起请求,就是我们平常说的Request,服务端收到请求后,响应客户端并发送应答,就是我们平常说的response。
这个过程就是一个请求,一个应答。
5 out对象的用途
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
5.1 out对象使用场景(一)
向客户端输出信息是out对象的常用功能,实例代码如下:
<% out.print("我来自于out对象。"); out.println("我来自于out对象,但我后面还跟着一个换行符。"); %>
上面两行代码会向浏览器输出对应的字符串。
输出结果同如下html。
<body> 我来自于out对象。我来自于out对象,但我后面还跟着一个换行符。 </body>
管理响应缓冲,是out对象的一个重要使用场景。可以重置相应流,以便重新开始输出,主要的方法如下表格:
方法 |
说明 |
clear() |
清除缓冲区中的内容。如果响应已经提交,则会有产生IOException异常 |
clearBuffer() |
清除当前缓冲区中的内容。 |
flush() |
刷新流。 |
isAutoFlush() |
检测当前缓冲区已满时是自动清空,还是抛出异常。 |
getBufferSize() |
获取缓冲区的大小。 |
6 get与post提交方式的区别
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET请求只能进行url编码,一般编码为application/x-www-form-urlencoded,而POST支持多种编码方式.application/x-www-form-urlencoded或者multipart/form-data,并且可以对二进制请求体用多种编码方式。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求在URL中传送的参数是有长度限制的,一般为2K,而POST没有限制。
- GET请求参数只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
7 request对象的作用
request对象封装了由客户端生成的HTTP请求的所有细节,主要包括HTTP头信息、系统信息、请求方式和请求参数等。通过request对象提供的相应方法可以处理客户端浏览器提交的HTTP请求中的各项参数。
request对象的作用域为一次请求。
一些常用的方法如下:
方法 | 说明 |
String getParameter(String name) | 根据页面表单组件名称获取页面提交数据。 |
String[] getParameterValues(String name) | 获取一个页面表单组件对于多个值时的用户的请求数据。 |
void setCharacterEncoding(String env) | 指定每个请求的编码,在调用 request.getParameter() 方法之前进行设定,可以用于解决中文乱码问题。 |
request.getRequestDispatcher(String path) | 返回一个 RequestDispatcher 对象,该对象的 forward 方法用于转发请求。 |
void setAttribute(String name,Object object) | 将数据保存到request范围内的变量中。 |
Object getAttribute(String name) | 获取request范围内的变量中的数据。 |
void removeAttribute(String name) | 删除request范围内的变量中的数据。 |
Cookie[] getCookies() | 获取到所有cookie对象的集合。 |
7.1 使用场景-获取请求参数
获取请求参数是request对象的常用接口之一。
下面用代码来演示在一个GET请求中的常规使用。
- 客户端user.jsp通过如下代码提交删除请求。
<a href='delete.jsp?id=123'>删除</a>
2. 在delete.jsp中,我们可以通过如下代码获取客户端提交的id参数值。
<% String userId = request.getParameter('id'); // 根据userId进行后续的操作 %>
7.2 使用场景-在作用域管理属性
因为request的作用域是一次请求有效,在进行请求转发时,需要把第一次请求的数据重新设置,以便这是数据能到达后面跳转处理的页面。
用一个登录跳转的例子简单说明。
我们有一个登录页面login.jsp,处理登录的页面do_login.jsp,登录成功后的页面index.jsp。
在login.jsp中有用户名(userName)、密码两个参数(password),提交到do_login.jsp后,我们用如下代码获取参数并重新设置参数,要不然登录后跳转到index.jsp页面无法获取到这两个参数。 <%
<% // 获取login.jsp提交过来的参数 String userName = request.getParameter("userName"); String password = request.getParameter("password"); // 在作用域里重新设置参数 if (userName != null) { request.setAttribute("userName", userName); } if (password != null) { request.setAttribute("password", password); } // 跳转到index.jsp request.getRequestDispatcher("index.jsp").forward(request, response); %>
7.3 使用场景-操作cookie
由于http协议是无状态的,所以客户端(浏览器)需要用一种机制(cookie)来保存一些服务端发过来的一些数据,如用户登录信息,用户的一些跟踪操作,用户名密码等。cookie是以key/value的形式保存在客户端的某个指定目录下。
写入cookie:
<% //写入cookie对象 request.setCharacterEncoding("UTF-8"); //设置请求的编码 Cookie cookie = new Cookie("w3c","你好,欢迎来到w3c课堂"); //创建并实例化cookie对象 cookie.setMaxAge(60*60*24*10); //设置cookie有效期为10天 response.addCookie(cookie); //保存cookie对象 %>
读取cookie:
<% //读取cookie值 Cookie[] cookies = request.getCookies(); //从request中获取cookie对象的集合 String user = ""; if(cookies != null) { //遍历cookie对象集合 for(Cookie cookie : cookies) { if(cookieItem.getName().equals("w3c")) { user = cookieItem.getValue(); //读取cookie对象的的值 } } } %>
7.4 使用场景-设置编码
对于unicode字符串来说,在传递过程中容易产生乱码,如中文,韩文,日文等。这是因为请求参数的文字编码方式与页面不一致所造成的,请求参数都是ISO-8859-1国际编码,而页面一般采用的是UTF-8编码。因此,只要将获取到的请求参数用UTF-8重新编码参数即可。具体见如下代码:
请求链接为:
<a href='decode.jsp?name=程序猿&country=CN'>中文参数链接</a>
则在decode.jsp页面可通过如下代码获取参数:
<div> 名字:<%= new String(request.getParameter("name").getBytes("ios-8859-1"), "UTF-8") %> 国籍:<%= request.getParameter("name") %> </div>
7.5 使用场景-获取客户端信息
获取客户端的信息,如ip, 请求头等,可获取的接口如下:
方法 | 说明 |
getHeader(String name) | 获取HTTP协议定义的文件头信息。 |
getHeader(String name) | 返回指定名字的request Header的所有值,其结果是一个枚举型的示例。 |
getHeaderNames() | 返回所有request Header的名字,其结果是一个枚举型的实例。 |
getMethod() | 获取客户端向服务器端传送数据的方法,如get、post、header、trace等。 |
getProtocol() | 获取客户端向服务器端传送数据所依据的协议名称。 |
getRequestURI() | 获取发出请求字符串的客户端地址,不包括请求参数。 |
getRequestURL() | 获取发出请求字符串的客户端地址。 |
getRealPath(String path) | 返回当前请求文件的绝对路径。 |
getRemoteAddr() | 获取客户端的IP地址。 |
getRemoteHost() | 获取客户端的主机名。 |
getServerName() | 获取服务器的名字。 |
getServletPath() | 获取客户端所请求的脚本文件的文件路径。 |
getServerPort() | 获取服务器的端口号。 |
7.6 使用场景-国际化
如果你的站点需全球站点,需要国际化,这个接口你就会用到。getLocal和getLocals接口返回的是浏览器在accept-language请求头里的指定的语言,这个字段是向服务端表明客户端浏览器的本地语言是什么。由此来决定返回合适的语言。
<% java.util.Locale locale = request.getLocale(); String str = ""; if(locale.equals(java.util.Locale.US)) { str = "Hello, Welcome to w3c international website!"; } else if(locale.equals(java.util.Locale.CHINA)) { str = "您好,欢迎访问w3c中国站点!"; } %> <%= str %>
8 response对象是什么
response对象用于响应客户请求,向客户端输出信息。它封装了JSP产生的响应,并发送到客户端以响应客户端的请求。请求的数据可以是各种数据类型,包括文件。
作用域为jsp页面内。
8.1 使用场景-重定向
重定向是一个常用的处理逻辑。
使用sendRedirect()方法可以将网页重定向到另一个页面。重定向操作支持跨域,这一点与转发不同。从客户端来说相当于重新发送一个请求。用户可以从浏览器的地址栏中看到跳转后的地址。进行重定向后,原有请求request失效,开始一个新的request对象。
比如一个常用场景是登录成功后会重定向到首页。
<% response.sendRedirect("index.jsp"); %>
8.2 使用场景-添加响应头
通过response对象可以设置HTTP响应头,其中最常用的是禁用缓存、设置页面自动刷新和定时跳转网页,还有就是一些协议响应头。
<% //禁用缓存,告诉客户端浏览器,不要缓存此次响应 response.setHeader("Cache-Control", "no-store"); response.setDateHeader("Expires", 0); //设置页面自动刷新,可以实现页面的自动刷新 response.setHeader("refresh", "10"); //定时跳转网页,5s后跳转到首页 response.setHeader("refresh", "5;URL=index.jsp"); %>
8.3 使用场景-设置输出缓冲
通常情况下,服务器要输出到客户端的内容不会直接写到客户端,而是先写到一个输出缓冲区。
response对象提供的对缓冲区进行配置的方法:
方法 | 说明 |
flushBuffer() | 强制将缓冲区的内容输出到客户端。 |
getBufferSize() | 获取响应所使用的缓冲区的实际大小,如果没有使用缓冲区,则返回0。 |
setBufferSize(int size) | 设置缓冲区大小。单位为K,0代表不缓冲。 |
reset() | 清除缓冲区的内容,同时清除状态码和报头。 |
isCommitted() | 检查服务器端是否已经把数据写入到可客户端。 |