上篇博文介绍了JSP的一些基础知识,本篇博文将主要对JSP的9大内置对象进行讲解。
JSP内置对象,是指可以不加声明和创建就可以在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量。
通过JSP的定义,我们可以大概知道JSP的作用。
我们都知道,java语法在使用一个对象之前,需要先进行实例化。为了简化这种开发,JSP提供了一些内置对象,使得程序开发者在使用JSP对象时,可以不预先定义,直接使用即可。
request对象可以获取客户端信息。它封装了由客户端生成的HTTP请求的所有细节,主要包括HTTP头信息、系统信息、请求方式和请求参数等。通过request对象提供的相应方法可以处理客户端浏览器提交的HTTP请求中的各项参数。
<a href="delete.jsp?id=1">删除a>
<%
request.getParameter("id");
%>
type="text" name="username">
type="radio" name="sex" value="man">男
type="radio" name="sex" value="woman">女
String name=request.getParameter("username"); //文本框使用getParameter
String[] sexArr=request.getParameterValues("sex"); //单选框和复选框使用getParameterValues
通过request对象可以获取到客户端的相关信息。例如,HTTP报头信息,客户信息提交方式,客户端主机IP地址、端口号等。
request获取客户端信息的常用方法:
方法 | 说明 |
---|---|
getHeader(String name) | 获取http协议定义的文件头信息 |
getHeaders(String name) | 返回指定名称的request Header的所有值,结果是一个枚举的实例 |
getHeadersNames() | 返回所有request Header的名称,结构是一个枚举型的实例 |
getMethod() | 获得客户端向服务器传送的数据方式:get、post、header、trace等 |
getProtocol() | 获得客户端向服务器传送数据所依据的协议名称 |
getRequestURI() | 获取发出请求字符串的客户端地址,不包括请求的参数 |
getRequestURL() | 获取发出请求字符串的客户端地址 |
getRealPath() | 返回请求文件的绝对路径 |
getRemoteHost() | 获取客户端的主机名 |
getRemoteAddr() | 获取客户端的ip地址 |
getServerName() | 获取服务器的名字 |
getServerPath() | 获取客户端所有请求的脚本文件的文件路径 |
getServerPort() | 获取客户端的端口号 |
cookie是小段的文本信息,在网络服务器上生成,发送给浏览器。通过使用cookie可以标识用户身份、记录用户名和密码、跟踪重复用户等。浏览器将cookie以key/value的形式保存在客户机的某个指定目录中。
Cookies[] cookies=request.getCookies(); //获得所有cookie对象的集合
cookies[i].getName() //获得指定名称的cookie
cookies[i].getValue() //获得cookie对象的值
response.addCookies(); //将一个cookie对象发送到客户端
//————————————————修改前的编码:ISO-8859-1,修改后:UTF-8————————————————
//1.获取访问请求参数时乱码
String name=new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
//2.获取表单提交的信息乱码
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("username");
//1.保存变量的值
////Request.setAttribute(String name,Object object);
request.setAttribute("userName",name);
request.setAttribute("sex",sex);
//2.获取变量的值
////request.getAttribute(String name);
request.getAttribute("userName");
request.getAttribute("sex");
Response对象用于响应客户请求,向客户端输出信息。它封装了jsp产生的响应,并发送到客户端以响应客户端的请求。请求的数据可以是各种数据类型,甚至文件。
重定向操作支持将地址重定向到不同的主机上,在客户端浏览器上将会得到跳转的地址,并重新发送请求链接,用户可以从浏览器的地址栏看到跳转后的地址。
进行重定向操作后,request中的属性全部失效,并开始一个新的request对象。
//path:用于指定目标路径,可以是相对路径,也可以是不同主机的其他url地址
response.sendRedirect(String path);
//示例
response.sendRedirect("login.jsp");
response.sendRedirect("www.baidu.com");
2.2.1 设置响应的内容类型
通过指定响应的内容类型可以让网页内容以不同的格式输出到浏览器中,默认为text/html。
//type可选类型:text/html、text/plain、application/x_msexcel、application/msword等
response.setContentType(String type);
2.2.2 禁用缓存
默认情况下,浏览器将会对显示的网页内容放入缓存,这样,当用户再次访问相同的网页时,浏览器会判断网页是否有变化,如果没有变化则之间显示缓存的内容,这样可以提高效率。但对于一些安全性要求较高的网站,通常需要禁用缓存。
<%
response.setHeader(“Cache-Control”,”no-store”);
response.setDateHeader(“Expires”,0);
%>
2.2.3 设置页面自动刷新
<%response.setHeader(“refresh”,"10");%> //网页每10秒刷新一次
2.2.4 定时跳转网页
<%response.setHeader(“refresh”,”5;url=login.jsp”);%> //网页5秒跳转到指定页面
通常情况下,服务器要输出到客户端的内容不会直接写入客户端,而是先写到一个缓冲区,只有以下几种情况,才会把缓冲区的内容写到客户端。
1)缓冲区已满
2)JSP页面的输出信息已经全部写到了缓冲区
3)在JSP页面中,调用了response对象的flushbuffer()方法或out对象的flush()方法。
对缓冲区进行配置的方法如下:
方法 | 说明 |
---|---|
flushBuffer | 强制把当前缓冲区内容输出到客户端 |
getBufferSize | 返回缓冲区大小 |
setBufferSize(int size) | 设置缓冲区大小 |
reset() | 清除缓冲区大小 |
isCommited() | 监测服务器端是否已经把数据写入到了客户端 |
out对象可以用来向客户端浏览器输出信息,并且管理应用服务器上的输出缓冲区。
<% Out.print(String string) %>
<% Out.println(String string) %> //区别在于它的换行功能,显示需要<pre>标签
方法 | 说明 |
---|---|
flush | 强制输出缓冲区数据 |
clear | 清除缓冲区中数据,不输出到客户端 |
clearBuffer | 清除当前缓冲区中数据,输出到客户端 |
isAutoFlush | 检测当前缓冲区已满时是自动清空,还是抛出异常 |
getBufferSize | 获取缓冲区大小 |
我们经常会听到“重定向”和“转发”这两次词语,那么它们的区别是什么呢?response属于重定向请求,request属于转发请求。
重定向(redirect) | 转发(forward) | |
---|---|---|
地址栏 | URL会改变 | URL不会改变 |
请求次数 | 浏览器发送两次请求,两次响应 | 发送一次请求,一次响应 |
数据共享 | 不能共享数据 | 可以共享request里面的数据 |
适用范围 | 增删改操作(由于转发之后地址栏和请求内容不变,再次刷新页面时,请求将再次发送,重复执行操作,造成错误) | 查询操作(重定向后请求会将原本的查询请求覆盖,刷新之后将得不到要查询的数据) |
优点 | 能跳转到其他的服务器上的资源 | 相对高效,隐藏实际链接地址 |
这部分的内容比较重要,比较容易出现混淆,希望总结出来可以加深理解。