文章目录
JSP内置对象的含义是可以直接在JSP页面中使用的对象,使用前不需要声明他们
九大内置对象:
- 输入输出对象:request、response、out
- 作用域通信对象:session、application、pageCon text
- Servlet对象:page、config
- 异常对象:exception
JSP的四大作用域:
page、request、session、application这四大作用域,其实就是其九大内置对象中的四个,为什么说他们也是JSP的四大作用域呢?因为这四个对象都能存储数据,比如request.setAttribute()注意和request.setParameter()区分开来,一个是存储在域中的、一个是请求参数,session.setAttribute()、application其实就是SerlvetContext,自然也有setAttribute()方法。而page作用域的操作就需要依靠pageContext对象来进行了。在上面我们也有提到JSP的四大作用域,
-
page作用域:代表变量只能在当前页面上生效
-
request:代表变量能在一次请求中生效,一次请求可能包含一个页面,也可能包含多个页面,比如页面A请求转发到页面B
-
session:代表变量能在一次会话中生效,基本上就是能在web项目下都有效,session的使用也跟cookie有很大的关系。一般来说,只要浏览器不关闭,cookie就会一直生效,cookie生效,session的使用就不会受到影响。
-
application:代表变量能一个应用下(多个会话),在服务器下的多个项目之间都能够使用。比如baidu、wenku等共享帐号。
request对象
用户每访问一个页面,就会产生一个HTTP请求,这些请求中包含了请求所需的参数或者信息,可将request对象看做是客户端请求的一个实例,可以通过request来获取客户端和服务端的信息
方法 | 方法说明 |
---|---|
getHeader(String name) | 获取HTTP头文件中的指定值,例如accept、user-agent、content-type、content-length等 |
getHeaderNames() | 返回枚举类型,从而确定Header中包含哪些值 |
使用request对象接收请求参数
获取请求参数的方法有两种,分别是getParameter()、getParameterValues()
get方法提交参数、获取参数的例子:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>'getParameter.jsp'</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body >
<center>
<%
String name= new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8");
String city= new String(request.getParameter("city").getBytes("ISO-8859-1"),"utf-8");
if(name!=null&&city!=null)
{
%>
<p>Welcome <%=name %>,您所在的城市是<%=city %></p>
<%
}else{
%>
<p>欢迎访问本页面!</p>
<%
}
%>
</center>
</body>
</html>
post方法提交、获取参数的例子:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>'ex3_1.jsp'</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body >
<center>
<form action="getParameter.jsp" method="post">
<table>
<tr>
<td>姓名</td>
<td><input type="text" name="name" value=""/></td>
</tr>
<tr>
<td>城市</td>
<td><input type="text" name="city" value=""/></td>
</tr>
<tr>
<td><input type="submit" value="提交"/></td>
<td><input type="reset" value="重置"/></td>
</tr>
</table>
</form>
</center>
</body>
</html>
getParameter.jsp文件和前面一样
请求中文乱码处理的三种方法
- 在接收请求的页面中规定字符编码:
request.seCharacterEncoding(“utf-8”)
- 取得参数值后,通过转码的方式转为合适的字符集,例如:
String name=new String(request.getParameter(“name”).getBytes("ISO-8859-1"),"utf-8")
- 上述两种方法移植性较差,通过编写一个Servlet过滤器来解决中文乱码问题(后续介绍)
获取头部信息
- String getHeader(String name) 获取字符串的表头信息
- int getHeader(String name) 获得整型的表头信息
示例:
<%
Enumeration<String> enumeration = request.getHeaderNames();
while(enumeration.hasMoreElements()){
String name = enumeration.nextElement();
String value = request.getHeader(name);
if(value==null||"".equals(value)){
value="空字符串";
}
%>
<p>表头名称:<%=name %> 对应的值:<%=value %></p>
<%} %>
获取主机和客户机信息
- getRemoteAddr()获取客户机的IP
- getRemoteHost()获取客户主机的名称
- getLocalAddr()获取本地主机的IP
- getLocalName() 获取本地主机名称
- getLocalHost()获取本地主机名称
- (错,无此属性)getServerAddr()
- getServerName() 获取服务器名称
- getServerPort() 获取服务器端口
response对象
服务器对请求做出响应时调用的是response,response响应包实现的是
javax.servlet.HttpServletResponse
response常用方法
方法 | 说明 |
---|---|
setHeader(String name,String value) | 设置头信息 |
addCookie(Cookie args) | 添加Cookie信息 |
sendRedirect(String uri) | 实现页面重定向 |
setStatus(int arg)) | 设定页面的响应状态码 |
setContentType( String arg) | 设定页面MIME类型和字符集 |
setCharacterEncoding(arg) | 设定页面响应的编码类型 |
设置头信息
设置头信息包括设置页面返回的MIME类型、返回的字符集、页面中的meta等信息
有两种方法用于设置MIME类型和返回的字符集:
- response.setContentType(String type):其中type的值为“text/html;charset=utf-8”,或其他MIME类型和字符集(不影响其HTML代码中的中文)
- page指令:基本的固定格式为:
<%@page contentType=“text/html;charset=urf-8” language="java">
设置meta信息是指在HTML页面中存在于之间的信息
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0"> 设定网页的到期时间,一旦到期则必须到服务器上重新调用
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
设置meta信息的源代码示例:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'setMeta.jsp' starting page</title>
</head>
<body>
<center class="aa">
<p class="bb">
现在的时间为:<br/>
<%
out.print(""+ new Date());
response.setHeader("refresh","1");
response.setHeader("description","实时的显示当前时间");
response.setHeader("keywords","实时,显示,显示当前时间");
response.setHeader("cache-control","no-cache");
%>
<br/><br/>
copyright:2013
</center>
</body>
</html>
结果:显示当前时间,每1s刷新一次
设置页面重定向
response.sendRedirection(String url)
session对象
session对象用来判断是否为同一用户,还可以记录客户的连接信息等
session(会话):浏览器访问web服务器时,服务器会为每一个浏览器在服务器端的内存中分配空间,单独创建一个Session对象,该对象有一个ID属性,其值唯一,一般称之为SessionId,并且服务器会将这个SessionId(使用Cookie的方式)发送给浏览器,浏览器再次访问服务器时,会将SessionId发送给服务器,服务器可以依据SessionId找到对应的Session对象。
session对象的生命周期:当用户访问某个页面到关闭浏览器,这段时间称之为sesssion对象的生命周期
session与Cookie的关系:session对象和Cookie对象是一一对应的关系,JSP引擎会将创建好的sessionId存到Cookie中
session常用方法
方法 | 说明 |
---|---|
public Object getAttribute(String name) | 返回session对象中与指定名称绑定的对象,如果不存在则返回null |
public Enumeration getAttributeNames() | 返回session对象中所有的对象名称 |
public long getCreationTime() | 返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起 |
public String getId() | 返回session对象的ID |
public long getLastAccessedTime() | 返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起 |
public int getMaxInactiveInterval() | 返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开,即获取session的有效时间 |
public void invalidate() | 将session无效化,解绑任何与该session绑定的对象 |
public boolean isNew() | 返回是否为一个新的客户端,或者客户端是否拒绝加入session |
public void removeAttribute(String name) | 移除session中指定名称的对象 |
public void setAttribute(String name, Object value) | 使用指定的名称和值来产生一个对象并绑定到session中 |
public void setMaxInactiveInterval(int interval) | 用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效 |
获取sessionID值的核心代码
<%
String sessionID = session.getId();
String name = (String)session.getAttribute("name");//强制转为String类型
long time = session.getCreationTime();
Date date = new Date(time);
%>
<center>
<p>您访问的是ex3_3.jsp页面</br>
<%=name %>,您的session对象ID为:</br>
<%=sessionID%></br>
session对象创建时间:<%=date %></br>
</p>
<a href="ex3_2.jsp"><%=name %>,欢迎到ex3_2.jsp页面</a></br>
<a href="../ch03_2/ex3_4.jsp"><%=name %>,欢迎到ex3_4.jsp页面</a>
</center>
注意:一个Web应用的session对象的ID值是唯一的,两个应用之间的参数利用session对象无发获到
application对象
什么是application
-
当Web服务器启动时,Web服务器会自动创建一个application对象。application对象一旦创建,它将一直存在,直到Web服务器关闭。
一个Web服务器通常有多个Web服务目录 (网站),当Web服务器启动时,它自动为每个Web服务目录都创建一个application对象,这些application对象各自独立,而且和Web服务目录一一对应。
访问同一个网站的客户都共享一个application对象,因此,application对象可以实现多客户间的数据共享。访问不同网站的客户,对应的application对象不同。 -
application对象的生命周期:从Web服务器启动,直到Web服务器关闭。
注意:一个Web应用程序启动后,将会自动创建一个application对象,而且在整个应用程序的运行过程中只有一个application对象,也即所有访问该网站的客户都共享一个application对象。 -
application对象的作用范围:application对象是一个应用程序级的对象,它作用于当前Web应用程序,也即作用于当前网站,所有访问当前网站的客户都共享一个application对象。
-
application对象的基类是:javax.servlet.ServletContext类。
注意:有些Web服务器不直接支持使用application对象,必须用ServletContext类来声明application对象,再调用getServletContext()方法来获取当前页面的application对象。 -
ServletContext类:用于表示应用程序的上下文。
具体来说:在Web服务器中,提供了一个Web应用程序的运行时环境,专门负责Web应用程序的部署、编译、运行以及生命周期的管理,通过ServletContext类,可以获取Web应用程序的运行时环境信息。
session与application的区别
- 两者的作用范围不同:session对象是用户级的对象,而application对象是应用程序级的对象。
- 两者的生命周期不同:session对象的生命周期:用户首次访问网站创建,用户离开该网站 (不一定要关闭浏览器) 消亡。application对象的生命周期:启动Web服务器创建,关闭Web服务器销毁。
application对象的常用方法
方法 | 方法说明 |
---|---|
String getAttribute(String name) | 获取存放在application中的含有关键字name的对象 |
void setAttribute(String name, Object obj) | 将关键字name的指定对象obj放进application对象中 |
Ennumeration getAttributeNames() | 获取application中所有参数的名字,返回值是枚举类型 |
void removeAttribute(String name) | 移除application对象中name指定的参数值 |
String getServletInfo() | 获取Servlet的当前版本信息 |
ServletContext getContext(String url) | 获取url指定路径的ServletContext对象 |
String getRealPath(String name) | 获取指定文件的实际路径 |
String getMimeType(String name) | 获取指定的文件格式 |
String getContextPath() | 当前Web程序的根目录 |
out对象
out对象是继承javax.servlet.jsp.JspWriter类的一个输出对象
常用方法:
方法 | 方法说明 |
---|---|
append(char c) | 将字符添加到输出流中 |
clear() | 清空页面缓存中的内容 |
close() | 关闭网页流的输出 |
flush() | 网页流的刷新 |
println() | 将内容打印在HTML标记中 |
write() | 与println()相似,区别是println()可以输出各种类型的数据,而write方法只能输出与字符相关的数据,例如:字符、字符数组、字符串等 |
page对象
page代表转译后的Servlet,就好比普通类的this
常用方法:
方法 | 方法说明 |
---|---|
getClass() | 返回当时被转译的Servlet类 |
hashCode() | 返回此时被编译的Servlet类的哈希代码 |
toString() | 将此时被转译的Servlet类转译成字符串 |
… | … |
config对象
config对象实现了java.servlet.ServletConfig()接口,它一般用于在页面初始化时传递参数
方法 | 说明 |
---|---|
ServletContext getServletContext() | 返回所执行的 Servlet 的环境对象 |
String getServletName() | 返回所执行的 Servlet 的名字 |
String getInitParameter(String name) | 返回指定名字的初始参数值 |
Enumeration getlnitParameterNames() | 返回该 JSP 中所有初始参数名,一个枚举 |
WEB-INF文件下的web.xml文件的jsp/Servlet部分配置:
<servlet>
<servlet-name>
jspconfigdemo
</servlet-name>
<jsp-file>/config.jsp</jsp-file> <!-- 这里是JSP文件或者Servlet类 -->
<init-param>
<param-name>url</param-name>
<param-value>http://www.baidu.com</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>
jspconfigdemo
</servlet-name>
<url-pattern>/config.jsp</url-pattern>
</servlet-mapping>
pageContext
它是JSP页面的管理者(上下文),所以JSP中的内置对象呀,它统统能够获得,下面介绍它的api。
- 获得其它八大内置对象 getXxx()
pageContext.getOut(); //获得out对象
pageContext.getApplication(); //获得application对象
.......
- 对作用域的属性进行操作(四大作用域)
对默认作用域的属性进行操作。page
pageContext.getOut(); //获得out对象
pageContext.getApplication(); //获得application对象
pageContext.removeAttribute(name); //给page作用域移除内容
- 对指定作用域的属性进行操作
getAttribute(name,scope); //获得 指定作用域中的数据
setAttribute(name,value); //给指定作用域设置内容
removeAttribute(name ,scope) 移除指定作用域的内容(page/request/session/application)
例如:pageContext.removeAttribute("attrName", PAGE_SCOPE);
- 作用域常量
PageContext.PAGE_SCOPE page
PageContext.REQUEST_SCOPE request
PageContext.SESSION_SCOPE response
PageContext.APPLICATION_SCOPE application
- 一次获得指定名称内容
findAttribute(name); //依次从page、request、session、application 获得内容
exception对象
包含了异常的信息,使用它,必须结合page指令中的isErrorPage属性和errorPage属性
exception.jsp抛异常的一个NullPointException,并且跳转到error.jsp错误显示页面, errorPage属性的意思是如果发生未捕捉到的异常,将会跳转到error.jsp页面
error.jsp页面中isErrorPage属性说明该页面是一个错误显示页面,则可以使用exception对象
访问http://localhost:8080/test01/exception.jsp