JSP内置对象,JSP提供了由容器实现和管理的内置对象,也可以称之为隐含对象,这些内置对象不需要通过
JSP页面编写来实例化,在所有的JSP页面中都可以直接使用,它起到了简化页面的作用。
在JSP中一共预先定义了9个这样的对象,分别为request、response、session、applicition、out、
pageContext、config、page和exception。
request对象
request对象封装了由客户端生成的HTTP请求的所有细节,主要包括HTTP头信息、系统信息、请求方式
和请求参数等。通过request对象提供的相应方法可以处理客户端浏览器提交的HTTP请求中的各项参数。
1.访问请求参数
当通过超链接的形式发送请求时,可以为该请求传递参数,这可以在超链接后加“?”来实现。(注意这
个问号为英文半角符号)。
例1:
说明:如果同时指定多个参数,参数之间用符号“&”分隔。
例2:在delete.jsp页面,可以提供request对象的getParameter()方法获取传递的参数值
<%
request.getParameter("id");
%>
说明:在使用request.getParameter()方法获取传递的参数时,如果指定的参数不存在,将返回null,
如果指定了参数名,但未指定参数值,将返回空字符串("")。
例3:index.jsp向deal.jsp传参数
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Indextitle> head> <body> <a href="deal.jsp?id=1&&user=">处理页a> body> html>
deal.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Dealtitle> head> <body> <% String id = request.getParameter("id"); String user = request.getParameter("user"); String pwd = request.getParameter("pwd"); %> id值为:<%=id %> <br> user值为:<%=user %> <br> pwd值为:<%=pwd %> body> html>
结果:
2.在作用域中管理属性
在进行请求转发时,需要把一些数据传递到转发后的页面进行处理。这时,就需要request对象的
setAttribute()方法将数据保存到request范围内的变量中。
语法格式:
request.setAttribute(String name,Object object);
参数说明:
name: 表示变量名,为String类型,在转发后的页面取数据时,通过这个变量名来获取数据;
object:用于指定需要在request范围内传递的数据,为Object类型;
将数据保存到request范围内的变量中后,可以通过request对象的getAttribute()方法获取改变量的
值,语法格式如下:
request.getAttribute(String name);
例1:
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Indextitle> head> <body> <% try{ int money = 100; int number = 0; request.setAttribute("result",money/number); }catch(Exception e){ request.setAttribute("result", "页面产生错误!"); } %> <jsp:forward page="deal.jsp"/> body> html>
deal.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Dealtitle> head> <body> <%String message = request.getAttribute("result").toString();%> <%=message %> body> html>
3.获取cookie
在Web中cookie的意思的小段的文本信息,在网络服务器上生成,并发送给浏览器。通过使用cookie可以
标识用户身份,记录用户名和密码,跟踪重复用户等。浏览器将cookie以key/value的形式保存到客户机的某
个指定目录内。
cookie.getCookie()可获取所有cookie对象的集合;
cookie.getName()可以获得指定名称的cookie;
cookie.getValue()可获得cookie对象的值;
response.addCookie()将一个cookie对象发送到客户端;
在向cookie中保存信息时,如果包含中文,则需要调用java.net.URLEncoder类的encode()方法将要保
存到cookie中的信息进行编码;在读取cookie的内容时,应用java.net.URLDecoder类中的decode()方法进
行解码。
例1:通过cookie保存并读取用户登录信息。
index.jsp
<%@page import="java.net.URLDecoder"%> <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Indextitle> head> <body> <% Cookie[] cookies = request.getCookies(); String user = ""; String date = ""; if (cookies != null) { for (int i = 0; i < cookies.length; i++) if (cookies[i].getName().equals("myCookie")){ String url = cookies[i].getValue().split("#")[0]; user = URLDecoder.decode(url,"UTF-8"); date = cookies[i].getValue().split("#")[1]; } } if ("".equals(user) && "".equals(date)) { %> 欢迎光临! <form action="deal.jsp" method="post"> 输入姓名:<input name="user" type="text" value=""> <input type="submit" value="确定"> form> <% }else{ %> 欢迎<strong><%=user %>strong>,注册时间为:<%=date %> <% } %> body> html>
deal.jsp
<%@page import="java.util.Date"%> <%@page import="java.net.URLEncoder"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Dealtitle> head> <body> <% request.setCharacterEncoding("UTF-8"); String user = URLEncoder.encode(request.getParameter("user"), "UTF-8"); //这里URLEncoder会出现解析错误,重写为java.net.URLEncoder.encode()后错误消失 String s = user+'#'+new java.util.Date().toLocaleString(); Cookie cookie = new Cookie("myCookie",s.trim().replaceAll(" ","")); cookie.setMaxAge(60*60*24*30); response.addCookie(cookie); //出现错误java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value //根本问题cookie中不接受非法字符,非法字符,如堆栈中所述,[32],可以查询32对应的ASCII码,如此处是:空格。 //解决方法如上17行代码所示,去掉空格 %> <script type="text/javascript">window.location.href="index.jsp"script> body> html>
4.获取客户端信息
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Indextitle> head> <body> 获取客户端信息 <br>获得Http协议定义的 文件头信息Host的值:<%=request.getHeader("host") %> <br>获得Http协议定义的 文件头信息User-Agent的值:<%=request.getHeader("user-agent") %> <br>获得Http协议定义的 文件头信息accept-language的值:<%=request.getHeader("accept-language") %> <br>客户提交信息的方式:<%=request.getMethod() %> <br>使用的协议:<%=request.getProtocol() %> <br>获取发出请求字符串的客户端地址:<%=request.getRequestURI() %> <br>获取发出请求字符串的客户端地址:<%=request.getRequestURL() %> <br>获得请求文件的绝对路径:<%=request.getRealPath("index.jsp") %> <br>获取提交数据的客户端的IP地址:<%=request.getRemoteAddr() %> <br>获取客户端的主机名:<%=request.getRemoteHost() %> <br>获取服务器的名称:<%=request.getServerName() %> <br>获取服务器的端口号:<%=request.getServerPort() %> <br>获取客户端所请求的脚本文件的文件路径:<%=request.getServletPath() %> body> html>
结果显示:
5.页面信息国际化
浏览器可以通过accept-language的HTTP报头向Web服务器指明它所使用的本地语言。request对象中的
getLocale()和getLocales()方法允许开发人员获得此信息,获取的信息属于java.util.Locale类型。
java.util.Locale类型的对象封装了一个国家或地区所使用的语言。
<% java.util.Locale locale=request.getLocale(); String str=""; if (locale.equals(java.util.Locale.US)) str="Welcome to my web!"; if (locale.equals(java.util.Locale.CHINA)) str="欢迎访问我的网站!"; %> <%=str %>
response对象
response对象用于响应客户请求,向客户端输出信息。它封装了JSP产生的响应,并发送到客户端以响应
客户端的请求。请求的数据可以是各种类型,甚至是文件。request对象在JSP页面内有效。
1.重定向页面
使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面。重定向操作支持将地址
重定向到不同的主机,这一点与转发不同。在客户端浏览器上将会得到跳转的地址,并重新发送请求链接。进
行重定向操作后,request中的属性全部失效,并开始一个新的request对象。
语法格式:
response.senRedirect(String path)
2.处理HTTP文件头
通过response对象可以设置HTTP的响应报头,下面介绍最常用的操作。
a.禁用缓存
在默认情况下,浏览器会对显示的网页内容进行缓存。这样,当用户再次访问相关网页时,浏览器会
判断网页是否发生变化,如果没有变化则直接显示缓存中的内容,这样可以提高网页的显示速度。对于一
些安全性较高的网站,通常需要禁用缓存。
<% response.setHeader("Cache-Control","no-store"); response.setDateHeader("Expires",0); %>
b.页面自动刷新
<% response.setHeader("refresh","10")//秒 %>
c.定时跳转页面
<% response.setHeader("refresh","5;URL=login.jsp"); %>
3.设置输出缓存
通常情况下,服务器要输出到客户端的内容不会直接写到客户端,而是先写到一个输出缓冲区(暂时放置
输入输出内容的内存)。当满足以下三种情况时,就会把缓冲区的内容写到客户端:
(1)Jsp页面的输出信息已经全部写入到了缓冲区
(2)缓冲区已满
(3)Jsp中调用了response.flushBuffer()或out.flush()
response对象提供的方法:
flushBuffer() 强制将缓冲区的内容输出到客户端
getBufferSize() 获取响应所使用的缓冲区实际大小,如果没有缓冲区则返回0
setBufferSize() 设置缓冲区的大小
reset() 清除缓冲区的内容,同时清除状态码和报头
isCommitted() 检查服务器端是否已经把数据写入到了客户端
session对象
session在网络中被称为会话。由于HTTP协议是一种无状态协议,也就是当一个客户端向服务器发出请求,
服务器接收请求,并返回响应后,该连接就结束了,而服务器并不保存相关的信息。为了弥补这一缺点,HTTP
协议提供了session。提供session可以在应用程序的Web页面间进行跳转时,保存用户的状态,使整个用户会
话一直存在下去,知道关闭浏览器。但是如果再一个会话中,客户端长时间不向服务器发出请求,session对象
就会自动消失。这个时间取决于服务器,比如Tomcat服务器默认为30min。
保存信息:
session.setAttribute(String name,Object obj)
name :指定在session中的变量名
obj:保存的对象
获取信息:
session.getAttribute(String name)
getAttribute()返回的是Object类型
移除信息:
session.removeAttribute(String name)
销毁session:
session.invalidate()
生命周期:
getLastAccessedTime(); 返回客户端最后一次与会话相关联的请求
getMaxInactiveInterval(); 以秒为单位返回一个会话内两个请求的最大时间间隔
setMaxInactiveInterval(); 以秒为单位设置session的有效时间
application对象
application对象用于保存所有应用程序的公有数据。它在服务器启动时自动创建,在服务器停止时销毁。
当application对象没有被销毁时,所有用户都可以共享该application对象。与session相比,application
生命周期更长,类似于“全局变量”。
1.访问应用程序的初始化参数
应用程序初始化参数在web.xml文件中设置,web.xml文件位于Web应用所在目录下的WEB-INF子目录
中,在web.xml文件中通过标记配置初始化参数。
application.getInitParameter(String name); 返回已命名的参数值
application.getAttributeNames(); 返回所有已定义的参数名的枚举
......
out对象
out对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
1.输出数据
out.print("");
out.println("");
输出时,println的换行并不会显示,可以用
来显示效果
2.管理响应缓冲
out.clear() 清除缓冲区内容,类似重置响应流,如果响应已提交,则会产生异常
out.clearBuffer() 清除当前缓冲区内容,即使已提交,也能使用
out.flush() 刷新流
out.isAutoFlush() 监测当前缓冲区已满时是自动清空还是抛出异常
out.getBufferSize() 获取缓冲区大小
pageContext对象
通过它获取JSP页面的其他对象,实际开发很少使用
config对象
主要用于取得服务器的配置信息
page对象
page对象代表Jsp本身
exception对象
处理异常对象