3.1JSP内置对象的概述
为了简化Web程序开发过程,JSP提供了由容器实现和管理的内置对象,也可以将其称为固有对象,隐含对象。这些内置对象在所有的JSP页面中都可以直接使用,不需要JSP页面编写者来实例化。
JSP中采用Java语言作为脚本编程语言,这样不但是系统具有了强大的对象处理能力,还可以动态创建Web页面内容。但Java语法在使用一个对象之前进行实例化,比较繁琐,为了简化开发,JSP提供了一下内置对象,这也是JSP语法结构中的独特语句变量,又被称为JSP预定义变量。它们都是由系统容器实现和管理,在JSP页面中不需要定义,可以直接使用。
在JSP中一共预先定义了9个这样的对象。
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。
获取请求参数的值
(2)新建show.jsp页面,在其中通过getParameter()方法来获取id参数与name参数的值,并将其输出到页面中。
id参数的值为:<%=request.getParameter("id")%>
name参数的值为:<%=request.getParameter("name")%>
运行结果:
id参数的值为:001
name参数的值为:null
解决中文乱码
在显示参数值是中文内容时变成乱码,是因为请求参数文字编码方式与页面中的不一致造成的。所有的request请求都是iso-8859-1的,而在此页面采用的是GBK的编码方式。
要解决此问题,只要将获取到的数据通过String的构造方法使用指定的编码类型重新构造一个String对象即可正确地显示出中文。
(1)创建index.jsp页面,在其中加入一个超链接,并在该超链接中传递两个参数:name和sex,其值全部为中文。
<%@ page import="java.net.URLEncoder"%>
& sex=<%=URLEncoder("男")%>">解决中文乱码
在超链接中传递中文和参数时,这个中文的参数需要应用java.net.URLEncoder.encode()方法进行编码处理,否则在IE6浏览器运行时,有些文字会产生中文乱码。
(2)创建show.jsp页面,在其中将第一个参数name的值进行编码转换。
name的参数值为:<%=new String(request.getParameter("name").getBytes("iso-8859-1"),"gbk")%>
sex的参数值为:<%=request.getParameter("sex")%>
运行结果:
name的参赛值为:无语
sex的参数值为:??
获取Form表单的信息
在一个表单中会有不同的标签元素,对于文本元素,单选按钮,下拉列表框都可以使用getParameter()方法来获取其具体的值。
对于复选框以及多选列表框被选定内容就要使用getParameterValues()方法来获取了,该方法会返回一个字符串数组,通过循环遍历这个数组就可以得到用户选定的所有内容。
(1)创建index.jsp页面,在该页面中创建一个form表单。
(2)编写show.jsp页面,用来处理请求的。
- please input username:<%=new String(request.getParameter("name").getBytes("iso-8859-1","gbk")%>
- select sex: <%=new String(requset.getParameter("sex").getBytes("iso-8859-1","gbk")%>
- please choose question for password :<%=new String(request.getParameter("question").getBytes("iso-8859-1","gbk")%>
- please input the answer of question: <%=new String(request.getParameter("key").getBytes("iso-8859-1","gbk")%>
- please choose your habits:
<%
String[] like=request.getParameterValues("like");
for(int i=0;i
<%=new String(like[i].getBytes("iso-8859-1","gbk")+" "%>
<% }
%>
获取请求客户端信息
在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());
%>
- 获取Date属性:<%=request.getAttribute("date")%>
<%=request.removeAttribute("date");%>
- 删除后再获取Date属性:<%=request.getAttribute("date")%>
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
<%=info[0]+welcome %>
(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);
%>
表单提交成功
- 姓名:<%=name%>
- 出生日期:<%=birthday%>
- 邮箱:<%=mail%>
- 返回
第一次访问页面时用户表单中的信息是空的;当用户提交过一次表单之后,表单中的内容就会被记录到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) |
重定向是通过使用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种情况下,才会把缓冲区的内容写到客户端:
使用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范围内
<%
String sessionMessage="session test";
session.setAttribute("message",sessionMessage);
out.print("保存在session范围内的对象为:"+sessionMessage);
% >
(2)在default.jsp页面中,获取保存在session范围内的信息并在页面中显示
<%
String message=(String)session.getAttribute("message);
out.print("保存在session范围内的对象为:"+message);
% >
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对象提供了设置会话生命周期的方法:
session对象的应用
在index.jsp页面中,提供了用户输入用户名文本框;在session.jsp页面中,将用户输入的用户名保存在session对象中,用户在该页面中可以添加最喜欢去的地方;在result.jsp页面中,将用户输入的用户名与最想去的地方在页面中显示。
(1)index.jsp
(2)session.jsp
<%
String name=request.getParameter("name");
session.setAttribute("name",name);
%>
(3)result.jsp
<%
String name=(String)session.getAttribute("name");
String address=request.getParameter("address");
%>
3.5application对象
方法 | 返回值 | 说明 |
---|---|---|
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文件中通过配置