3.1JSP内置对象的概述
为了简化Web程序开发过程,JSP提供了由容器实现和管理的内置对象,也可以将其称为固有对象,隐含对象。这些内置对象在所有的JSP页面中都可以直接使用,不需要JSP页面编写者来实例化。
JSP中采用Java语言作为脚本编程语言,这样不但是系统具有了强大的对象处理能力,还可以动态创建Web页面内容。但Java语法在使用一个对象之前进行实例化,比较繁琐,为了简化开发,JSP提供了一下内置对象,这也是JSP语法结构中的独特语句变量,又被称为JSP预定义变量。它们都是由系统容器实现和管理,在JSP页面中不需要定义,可以直接使用。
在JSP中一共预先定义了9个这样的对象。
- request
- response
- session
- application
- out
- pageContext
- config
- page
- exception
3.2request对象
request对象是javax.servlet.http.HttpServletRequest类型的对象。该对象代表了客户端的请求信息,主要用于接收通过HTTP协议传送到服务器端的数据(包括头信息,系统信息,请求方式以及请求参数等)。request对象的作用域为一次请求。
获取请求参数值
在一个请求中,可以通过“?”的方式来传递参数,然后通过request对象的getParameter()方法来获取参数的值。
String id=request.getParameter("id");
使用getParameter()方法从request对象中获取参数id的值,如果request对象中不存在此参数,那么该方法将返回null.
(1)创建index.jsp页面,在其中加入一个超链接按钮用来请求show.jsp页面,并在请求后加一个参数id。
<body>
<a href="show.jsp"?id=001">获取请求参数的值</a>
</body>
(2)新建show.jsp页面,在其中通过getParameter()方法来获取id参数与name参数的值,并将其输出到页面中。
<body>
id参数的值为:<%=request.getParameter("id")%><br>
name参数的值为:<%=request.getParameter("name")%>
</body>
运行结果:
id参数的值为:001
name参数的值为:null
解决中文乱码
在显示参数值是中文内容时变成乱码,是因为请求参数文字编码方式与页面中的不一致造成的。所有的request请求都是iso-8859-1的,而在此页面采用的是GBK的编码方式。
要解决此问题,只要将获取到的数据通过String的构造方法使用指定的编码类型重新构造一个String对象即可正确地显示出中文。
(1)创建index.jsp页面,在其中加入一个超链接,并在该超链接中传递两个参数:name和sex,其值全部为中文。
<%@ page import="java.net.URLEncoder"%>
<body>
<a href ="show.jsp?name=<%=URLEncoder.encode("无语")%> & sex=<%=URLEncoder("男")%>">解决中文乱码</a>
</body>
在超链接中传递中文和参数时,这个中文的参数需要应用java.net.URLEncoder.encode()方法进行编码处理,否则在IE6浏览器运行时,有些文字会产生中文乱码。
(2)创建show.jsp页面,在其中将第一个参数name的值进行编码转换。
<body>
name的参数值为:<%=new String(request.getParameter("name").getBytes("iso-8859-1"),"gbk")%>
sex的参数值为:<%=request.getParameter("sex")%>
</body>
运行结果:
name的参赛值为:无语
sex的参数值为:??
获取Form表单的信息
除了获取请求参数中传递的值之外,还可以使用request对象获取从表单中提交过来的信息。
在一个表单中会有不同的标签元素,对于文本元素,单选按钮,下拉列表框都可以使用getParameter()方法来获取其具体的值。
对于复选框以及多选列表框被选定内容就要使用getParameterValues()方法来获取了,该方法会返回一个字符串数组,通过循环遍历这个数组就可以得到用户选定的所有内容。
(1)创建index.jsp页面,在该页面中创建一个form表单。
<form action="show.jsp" method="post">
<ul style="list-style:none;line-height:30px">
<li>please input username:<input type="text" name="name"/><br></li>
<li>select sex:
<input name="sex" type="radio" value="男"/>男
<input name="sex" type="radio" value="女"/>女
</li>
<li>
please choose question for password :
<select name="question">生日</option>
<option value="name">姓名</option>
</select>
</li>
<li>please input the answer of question: <input type="text" name="key"/></li>
<li>
please choose your habits:
<div style="width:400px">
<input name="like" type="chexbox" value="dance"/>跳舞
<input name="like" type="chexbox" value="sing"/>唱歌
<input name="like" type="chexbox" value="read"/>阅读
</div>
</li>
<li><input type="submit" value="submit"/></li>
</ul>
</form>
(2)编写show.jsp页面,用来处理请求的。
<ul style="list-style:none;line-height:30px">
<li>please input username:<%=new String(request.getParameter("name").getBytes("iso-8859-1","gbk")%></li>
<li>select sex: <%=new String(requset.getParameter("sex").getBytes("iso-8859-1","gbk")%></li>
<li>please choose question for password :<%=new String(request.getParameter("question").getBytes("iso-8859-1","gbk")%></li>
<li>please input the answer of question: <%=new String(request.getParameter("key").getBytes("iso-8859-1","gbk")%></li>
<li>please choose your habits:
<%
String[] like=request.getParameterValues("like");
for(int i=0;i<like.length;i++){
%>
<%=new String(like[i].getBytes("iso-8859-1","gbk")+" "%>
<% }
%>
</li>
</ul>
获取请求客户端信息
在request对象中通过相关的方法,还可以获取客户端的相关信息,如HTTP报头信息,客户信息提交方式,客户端主机IP地址,端口号等
方法 | 返回值 | 说明 |
---|---|---|
getHeader(String name) | String | 返回指定名称的HTTP头信息 |
getMethod() | String | 获取客户端向服务器发送请求的方法 |
getContextPath() | String | 返回请求路径 |
getProtocol() | String | 返回请求使用的协议 |
getRemoteAddr() | String | 返回客户端IP地址 |
getRemoteHost() | String | 返回客户端主机名称 |
getRemotePort() | int | 返回客户端发出请求端口号 |
getServletPath() | String | 返回接受客户提交信息的页面 |
getRequestURI() | String | 返回部分客户端请求的地址,不包括请求的参数 |
getRequestURL() | StringBuffer | 返回客户端请求地址 |
在作用域中管理属性
通过使用setAttribute()方法可以在request对象的属性列表中添加一个属性,然后在request对象的作用域范围内通过使用getAttribute()方法将其属性取出。
还可以使用removeAttribute()方法将一个属性删除掉。
request对象的作用域为一次请求,超出作用域后属性列表中的属性即会失效。
<%
request.setAttribute("date",new Date());
%>
<ul style="line-height:24px">
<li>获取Date属性:<%=request.getAttribute("date")%></li>
<!--将属性删除--!>
<%=request.removeAttribute("date");%>
<li>删除后再获取Date属性:<%=request.getAttribute("date")%></li>
</ul>
cookie管理
cookie是小段的文本信息,通过使用cookie可以标识用户身份,记录用户名及密码,跟踪重复用户。
cookie在服务器端生成并发送给浏览器,浏览器将cookie的key/value保存到某个指定的目录中,服务器的名称与值可以由服务器端定义。
通过cookie的getCookies()方法可以获取所有的cookie对象集合,然后通过cookie对象的getName()方法获取到指定名称的cookie,再通过getValue()方法即可获取到cookie对象的值。
将一个cookie对象发送到客户端使用了response对象的addCookies()方法。
(1)创建index.jsp页面,在其中创建form表单。从request对象中获取cookie,判断是否含有此服务器发送过的cookie,如果没有,则说明该用户第一次访问本站,如果有,则直接将值读取出来,并赋给对应的表单
<%
String welcome="第一次访问";
String[] info =new String[]{"","",""};
Cookie[] cook=request.getCookies();
if(cook!=null){
for(int i=0;i<cook.length;i++){
if(cook[i].getName().equals("mrCooklnfo")){
info=cook[i].getValue.split("#");
welcome="欢迎回来!";
}
}
}
%>
<%=info[0]+welcome %>
<form action="show.jsp" method="post">
<ul style="line-height:23px">
<li>姓 名:<input name="name" type="text" value="<%=info[0]%>"></li>
<li>出生日期:<input name="birthday" type="text" value="<%=info[1]%>"></li>
<li>邮箱地址:<input name="mail" type="text" value="<%=info[2]%>"></li>
<li><input type="submit" value="提交"></li>
</ul>
</form>
(2)创建show.jsp页面文件,在该页面中通过request对象将用户输入的表单信息提取出来;创建一个cookie对象,并通过response对象的addCookie()方法将其发送到客户端。
<%
String name=request.getParameter("name");
String birthday=request.getParameter("birthday");
String mail=request.getParameter("mail");
Cookie myCook=new Cookie("mrCooklnfo",name+"#"+birthday+"#"+mail);
myCook.setMaxAge(60*60*24*365);//设置cookie有效期
response.addCookie(myCook);
%>
表单提交成功
<ul style="line-height:24px">
<li>姓名:<%=name%></li>
<li>出生日期:<%=birthday%></li>
<li>邮箱:<%=mail%></li>
<li><a href ="index.jsp">返回</a>
</ul>
第一次访问页面时用户表单中的信息是空的;当用户提交过一次表单之后,表单中的内容就会被记录到cookie对象中,再次访问时会从cookie中获取用户输入的表单信息并显示在表单中。
获取浏览器使用的语言
在一个支持国际化的站点中,一般都是根据浏览器设定的语言来显示对应内容,只需通过getLocale()方法就可以获取客户端浏览器的语言类型。
3.3response对象
response代表的是对客户端的响应,主要将JSP容器处理过的对象传回客户端。response对象也具有作用域,它只在JSP页面内有效。
方法 | 返回值 | 说明 |
---|---|---|
addHeader(String name,String value) | void | 添加HTTP文件头,如果同名的头存在,则覆盖 |
setHeader(String name,String value) | void | 设定指定名称的文件头的值,如果存在则覆盖 |
addCookie(Cookie cookie) |
向客户端添加一个cookie对象 | ||
sendError(int sc,String msg) | void | 向客户端发送错误信息,如404网页找不到 |
sendRedirect(String location) | void | 发送请求到另一个指定位置 |
getOutputStream() | ServletOutputStream | 获取客户端输出流对象 |
setBufferSize(int size) | void | 设置缓冲区大小 |
重定向是通过使用sendRedirct()方法,将响应发送到另一个指定位置进行处理。
重定向可以将地址重新定向到不同的主机上,在客户端浏览器上将会得到跳转的地址,并重新发送请求链接。用户可以从浏览器的地址栏中看到跳转后的地址。
进行重定向操作后,request中的属性全部失效,并且进入一个新的request对象的作用域。
response.sendRedirect("www.baidu.com");将重定向到百度
注意:在JSP页面中使用该方法前面不要有HTML代码,并且在重定向操作之后紧跟一个return,因为重定向之后下面的代码已经没有意义啦,并且还可能产生错误。
处理HTTP文件头
setHeader()方法通过两个参数——头名称与参数值的方式类设置HTTP文件头。
response.setHeader("refresh","5");//设置网页每5秒自动刷新一次
response.setHeader("refresh","2;URL=welcome.jsp");//设置网页2秒后自动跳转至指定页面
refresh参数并不是HTTP1.1规范中的标准参数,但IE与Netscape浏览器都支持该参数。
response.setContentType("text/html");//设置响应类型
设置输出缓冲
通常情况下,,服务器要输出到客户端的内容不会直接写到客户端,而是先写到一个输出缓冲区。
只有以下3种情况下,才会把缓冲区的内容写到客户端:
- JSP页面的输出信息已经全部写入缓冲区。
- 缓冲区已满
- 在JSP页面中调用了flushbuffer()方法或out对象的flush()方法。
使用response对象的setBufferSize()方法可以设置缓冲区的大小。
response.setBufferSize(2KB);//缓冲区大小为2KB
还可以使用isCommitted()方法来检测服务器是否已经把数据写入到了客户端。
3.4session对象
session对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生产一个session对象,用于保存该用户的信息,跟踪用户的操作状态。
session对象内部使用Map类来保存数据,因此保存数据的格式为key/value。
session对象的value可以是复杂的对象类型,而不仅仅局限于字符串类型。
方法 | 返回值 | 说明 |
---|---|---|
getAttribute(String name) | Object | 获得指定名字的属性 |
getAttributeNames() | Enumeration | 获得session中所以属性对象 |
getCreationTime() | long | 获得session对象创建时间 |
getId() | String | 获得session对象唯一编号 |
getLastAccessdTime() | long | 获得session对象最后一次被操作的时间 |
getMaxInactiveInterval() | int | 获得session对象有效时间 |
isNew() | boolean | 获得session对象是否为新创建的 |
removeAttribute(String name) | void | 获得session对象中指定名称的属性 |
invalidate() | void | 获得session对象 |
setMaxInactiveInterval(int interval) | void | 设置session对象的最大有效时间 |
setAttribute(String key,Object obj) | void | 将obj以key名称保存在session中 |
session是请求有关的会话对象,是java.servlet.http.HttpSession对象,用于保存和存储页面的请求信息。
session对象的setAttribute(String key,Object obj)方法可实现将信息保存在session范围内,而通过getAttribute(String name)方法可以获取保存在session范围内的信息。
setAttribute(String key,Object obj):key:保存在session范围内的关键字,obj:保存在session范围内的对象
getAttribute(String name) name:指定保存在session范围内的关键字
(1)在index.jsp页面中,实现将文字信息保存在session范围内
<span id="_xhe_cursor"></span><span id="_xhe_temp" width="0" height="0"></span><body>
<%
String sessionMessage="session test";
session.setAttribute("message",sessionMessage);
out.print("保存在session范围内的对象为:"+sessionMessage);
% >
</body>
(2)在default.jsp页面中,获取保存在session范围内的信息并在页面中显示
<body>
<%
String message=(String)session.getAttribute("message);
out.print("保存在session范围内的对象为:"+message);
% >
</body>
session默认在服务器上的存储时间为30分钟,当客户端停止操作30分钟后,session中存储的信息会自动失效。此时调用getAttribute()等方法,将出现异常。
从会话中移除指定的绑定对象
对于存储在session会话中的对象,如果想将其从session会话中移除,可以使用session对象的removeAttribute()方法。
removeAttribute(String key);key:保存在session范围内的关键字
销毁session
当调用session对象的invalidate()方法后,表示session对象被删除,即不可以再使用session对象。
session.invalidate();
如果调用了session对象的invalidate()方法,之后再调用session对象的任何其他方法时,都将报出Session already invalidated异常。
会话超时管理
应用session对象时应注意session的生命周期。一般来说,session的生命周期在20-30分钟。
当用户首次访问时将产生一个新的会话,以后服务器就可以记住这个会话状态,当会话生命周期超时时,或者服务器端强制使会话失效时,这个session就不能使用了。
为了避免用户登录网站后在session失效时操作,在开发系统时应该对session的有效性进行判断。
session对象提供了设置会话生命周期的方法:
- getLastAccessedTime():返回客户端最后一次与会话相关联的请求时间。
- getMaxInactiveInterval():以秒为单位返回一个会话内两个请求最大时间间隔。超过这个范围session将失效。
- setMaxInactiveInterval():以秒为单位设置session的有效时间。
session对象的应用
在index.jsp页面中,提供了用户输入用户名文本框;在session.jsp页面中,将用户输入的用户名保存在session对象中,用户在该页面中可以添加最喜欢去的地方;在result.jsp页面中,将用户输入的用户名与最想去的地方在页面中显示。
(1)index.jsp
<form name="form1" id="form1" action="session.jsp" method="post">
<div align="center">
<table width="23%" border="0">
<tr>
<td width="36%"><div align="center">您的名字是:</div></td>
<td width="64%">
<lable>
<div align="center">
<input type="text" name="name"/>
</div>
</lable>
</td>
</tr>
<tr>
<td colspan="2">
<lable>
<div align="center">
<input type="submit" name="submit" value="提交"/>
</div>
</lable>
</td>
</tr>
</table>
</div>
</form>
(2)session.jsp
<%
String name=request.getParameter("name");
session.setAttribute("name",name);
%>
<div align="center">
<form id="form1" name="form1" method="post" action="result.jsp">
<table width="28%" border="0">
<tr>
<td>您的名字是:</td>
<td><%=name%></td>
</tr>
<tr>
<td>您喜欢去的地方是:</td>
<td><lable>
<input type="text" name="address"/>
</lable></td>
</tr>
<tr>
<td colspan="2"><lable>
<div align="center">
<input type="submit" value="提交" name="submit"/>
</div></lable>
</td>
</tr>
</table>
</form>
</div>
(3)result.jsp
<%
String name=(String)session.getAttribute("name");
String address=request.getParameter("address");
%>
<form id="form1" name="form1" method="post" action="">
<table width="28%" border="0">
<tr>
<td colspan="2"><div align="center"><strong>显示</strong></div></td>
</tr>
<tr>
<td width="49%"><div align="left">您的名字是:</div></td>
<td width="51%><lable>
<div align="left"><%=name%></div>
</lable></td>
</tr>
<tr>
<td><lable>
<div align="left">您喜欢去的地方是:</div>
</lable></td>
<td><div align="left"><%=address%></div></td>
</tr>
</table>
</form>
3.5application对象
application对象可以将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象的生命周期更长,类似于系统的“全局变量”。
方法 | 返回值 | 说明 |
---|---|---|
getAttribute(String name) | Object | 通过关键字返回保存在application对象中的信息 |
getAttributeNames() | Enumeration | 获取所有application对象使用的属性名 |
setAttribute(String key,Object obj) | void | 通过指定的名称将一个对象保存在application对象中 |
getMajorVersion() | int | 获取服务器支持的Servlet版本号 |
getServerInfo() | String | 返回JSP引擎的相关信息 |
removeAttribute(String name) | void | 删除application对象中指定名称的属性 |
getRealPath() | String | 返回虚拟路径的真实路径 |
getInitParameter(String name) | String | 获取指定name的application对象属性的初始值 |
application提供了对应用程序环境属性访问的访问。application对象访问应用程序初始化参数的方法如下:
getInitParameter(String name):返回一个已命名的参数值
getAttributeNames():返回所有已定义的应用程序初始化名称的枚举
例:访问应用程序初始化参数
(1)在web.xml文件中通过配置<context-param>元素初始化参数
<context-param> <!--定义连接数据库的URL--!>
<param-name>url</param-name>
<param-value>jdbc:mysql//locathost:3306/jrsoft</param-value>
</context-param>
<context-param> <!--定义连接数据库的用户名--!>
<param-name>name</param-name>
<param-value>root/param-value>
</context-param>
<context-param> <!--定义连接数据库的密码--!>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>
(2)在index.jsp页面中,访问web.xml文件获取初始化参数
<%
String url=application.getInitParameter("url");
String name=application.getInitParameter("name");
String password=application.getInitParameter("password");<span id="_xhe_temp" width="0" height="0"></span>
Out.print("URL :"+url+"<br>");
<span id="_xhe_temp" width="0" height="0"></span><pre name="code" class="java"> Out.print("name :"+name+"<br>");<span id="_xhe_temp" width="0" height="0"></span><pre name="code" class="java"> Out.print("password :"+password+"<br>");
%>
管理应用程序环境属性
与session对象相同,可以在application对象中设置属性。
与session对象不同,session只是在当前客户的会话范围内有效,当超过保存时间,session对象就被收回。而application对象在整个应用区域中都有效。
application对象管理应用程序环境属性方法如下:
- getAttributeNames():获得所有application对象使用的属性名
- getAttribute(String name):从application对象中获取指定对象名
- setAttribute(String key,Object obj):使用指定名称和指定对象在application对象中进行关联
- removeAttribute(String name):从application对象中去掉指定名称的属性
3.6Out对象
out对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。使用out对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
管理响应缓冲
使用out输出数据时,需要使用clear()方法清除缓冲区内容,以便重新开始操作。也可通过clearBuffer()方法清除缓冲区的内容。
两者区别是:通过clear()方法清除缓冲区,如果相应内容已经提交,则会报出IOException异常;
而使用clearBuffer()方法,即使内容已经提交给客户端,也能够访问该方法。
方法 | 返回值 | 说明 |
---|---|---|
clear() | void | 清除缓冲区中尚存的内容 |
clearBuffer() | void | 清除当前缓冲区中尚存的内容 |
flush() | void | 刷新流 |
isAutoFlush() | boolean | 检查当前缓冲区是自动清空,还是满了就抛出异常 |
getBufferSize() | int | 获取缓冲区的大小 |
out对象的另一个重要的功能就是向客户端写入数据。
out对象提供了以下两个像爷们中输出信息的方法:
- print():在页面中打印字符串信息,不换行
- println():在页面中打印字符串信息,并且换行
3.7其他内置对象
获取会话范围的pageContext对象
pageContext对象的作用是取得任何范围的参数,通过它可以获取JSP页面的out,request,response,session,application等对象。
pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用pageContext对象。
方法 | 返回值 | 说明 |
---|---|---|
forward(String path) | void | 将JSP页面重新定向至另一个页面 |
getAttribute(String name) | Object | 获取参数值 |
getAttributeNamesInScope(int scope) | Enumeration | 获取某范围的参数名称集合 |
getRequest() | ServletRequest | 获取request对象 |
getResponse() | ServletResponse | 获取response对象 |
getOut() | JspWriter | 获取out对象 |
getSession() | HttpSession | 获取session对象 |
getPage() | Object | 获取page对象 |
setAttribute(String name,Object value) | void | 设置指定参数属性 |
读取web.xml配置信息的config对象
config对象主要作用是取得服务器的配置信息。通过pageContext对象的getServletConfig()方法可以获取一个config对象。当一个Servlet初始化时,容器把某些信息通过config对象传递给这个Servlet。
方法 | 返回值 | 说明 |
---|---|---|
getInitParameter(String name) | String | 获取服务器指定参数的初始值 |
getInitParameterNames() | Enumeration | 获取服务器所有初始参数名称 |
getServletContext() | ServletContext | 获取Servlet上下文 |
getServletName() | String | 获取Servlet服务器名 |
应答或请求的page对象
page对象代表JSP本身,只有在JSP页面内才是合法的。page隐含对象本质上包含当前Servlet接口引用的变量,类似于java编程中的this指针。
方法 | 返回值 | 说明 |
---|---|---|
getClass() | Object | 返回当前Object的类 |
hashCode() | Object | 返回此Object的哈希代码 |
toString() | String | 将此Object类转换成字符串对象 |
equals(Object obj) | boolean | 比较此对象与指定对象是否相等 |
获取异常信息的exception对象
exception对象的作用是显示异常信息,只有在isErrorPage="true"的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。
exception对象和java所有对象一样,都具有系统的继承结构。exception对象几乎可以定义所有异常情况。在JSP页面中出现没有捕捉到的异常,就会生成exception对象,并把exception对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的exception对象。
方法 | 说明 |
---|---|
getMessage() | 返回exception对象的异常信息字符串 |
getLocalizedmessage() | 返回本地化的异常错误 |
toString() | 返回关于异常错误的简单信息描述 |
fillInStackTrace() | 重写异常错误的栈执行轨迹 |
(1)创建index.jsp页面,在该页面中编写代码,并通过errorPage属性指定有异常信息时系统将转发至error.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="gbk" errorPage="error.jsp">
<%
int apple =Integer.parseInt("ad");
Out.print("苹果每斤+apple+"元");
%>
(2)error.jsp页面,用于接收传递过来的异常信息
<%@ page language="java" import="java.util.*" pageEncoding="gbk" isErrorPage="true"%>
<body>
错误提示为:<%=exception.getMessage()%>
</body>
由于将字符串ad转换为int型变量会发生异常,因此系统会转发至error.jsp页面。