JSP的内置对象
来源:互联网 发布:cf手游抢红包软件 编辑:程序博客网 时间:2024/05/16 17:01
本文是慕课网JAVA遇见HTML-JSP篇课程学习笔记。
在介绍JSP的内置对象之前,先看看web应用程序的请求响应模式。
上图就是web应用程序的请求与响应模式,由客户向web服务器发送HTTP请求(request),告知服务器请求的内容与关于客户的具体信息,然后web服务器向客户发送请求的内容即响应(response),这样,就构成了客户与服务器之间的会话。
以一个用户登录的例子来看,用户输入用户名和密码,然后向web服务器发送一个登录的请求,web服务器判断用户名和密码是否合法,如果合法就向客户发送一个响应,告知庸碌登录成功。
JSP的内置对象:
JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。
例如上面的代码,out对象并没有显示声明也可以使用,说明out是一个JSP内置对象。
JSP支持九大内置对象:
其中,request、response、out、session、和application这5个内置对象是比较常用的。
下面介绍这些内置对象。
1、out对象
out对象是jspWriter类的实例,是向客户端输出内容常用的对象。
out对象有如下几个常用函数:
- void println() 向客户端打印字符串;
- void clear() 清除缓冲区的内容,如果在flush之后调用会抛出异常;
- void clearBuffer() 清除缓冲区的内容,如果在flush之后调用不会抛出异常;
- void flush() 将缓冲区内容输出到客户端;
- int getBufferSize() 返回缓冲区的大小,以字节为单位,如果不设置则返回0;
- int getRemaining() 返回缓冲区剩余空间的字节数;
- boolean isAutoFlush() 返回当缓冲区已满时,是自动清空还是抛出异常;
- void close() 关闭输出流;
<body> <h1>out内置对象</h1><hr> <% out.println("<h2>柴鹿</h2>"); out.println("空山不见人,<br>"); out.println("但闻人语响。<br>"); out.println("返影入深林,<br>"); out.println("复照青苔上。<br>"); %>缓冲区大小:<%=out.getBufferSize() %>bytes<br>缓冲区剩余大小:<%=out.getRemaining() %>bytes<br>是否自动清空缓冲区:<%=out.isAutoFlush() %><br> </body>这里向页面打印一首唐诗,然后输出缓冲区的大小和剩余缓冲区的大小以及是否自动清空缓冲区。运行结果如下:
<body> <h1>out内置对象</h1><hr> <% out.println("<h2>柴鹿</h2>"); out.println("空山不见人,<br>"); out.println("但闻人语响。<br>"); out.flush(); out.println("返影入深林,<br>"); out.println("复照青苔上。<br>"); %>缓冲区大小:<%=out.getBufferSize() %>bytes<br>缓冲区剩余大小:<%=out.getRemaining() %>bytes<br>是否自动清空缓冲区:<%=out.isAutoFlush() %><br> </body>结果如下:
<% out.println("<h2>柴鹿</h2>"); out.println("空山不见人,<br>"); out.println("但闻人语响。<br>"); out.flush(); out.clear(); out.println("返影入深林,<br>"); out.println("复照青苔上。<br>"); %>结果:
- String getParameter(String name) 返回name指定参数的参数值;
- String[] getParameterValues(String name) 返回包含参数name的所有值的数组;
- void setAttribute(String,Object) 存储此请求中的属性;
- object getAttribute(String name) 返回指定属性的属性值;
- String getContentType() 得到请求题的MIME类型;
- String getProtocol() 返回请求用的协议类型及版本号;
- String getServerName() 返回接受请求的服务器主机名;
- int getServerPort() 返回服务器接受此请求所用的端口号;
- String getCharacterEncoding() 返回字符的编码方式;
- void setCharacterEncoding() 设置请求的字节编码方式;
- int getContentLength() 返回请求体的长度(以字节数);
- String getRemoveAddr()返回发送此请求的客户端IP地址;
- String getRealPath(String path) 返回一虚拟路径的真实路径;
- String request.getContextPath() 返回上下文路径;
<form name="regForm" action="request.jsp" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>爱好:</td> <td> <input type="checkbox" name="favorite" value="read">读书 <input type="checkbox" name="favorite" value="music">音乐 <input type="checkbox" name="favorite" value="movie">电影 <input type="checkbox" name="favorite" value="internet">上网 </td> </tr> <tr> <td colspan="2"><input type="submit" value="提交"/></td> </tr> </table> </form>在这里,用户输入用户名,并添加爱好(为了演示getParameterValues方法),然后使用post方式提交,使用request.jsp页面进行处理。在request.jsp页面中,加入如下代码:
<body> <h1>request内置对象</h1><hr> 用户名:<%=request.getParameter("username") %> 爱好:<% String[] favorites=request.getParameterValues("favorite"); for(int i=0;i<favorites.length;i++) { out.println(favorites[i]+" "); } %> </body>在上面代码中,request对象使用getParameter方法获得用户名username,注意getParameter方法中的参数要和reg.jsp表单中的input的name(即username)相同,然后使用getParameterValues方法获得爱好,在打印出来。结果如下:
<% request.setCharacterEncoding("utf-8"); %>结果如下:
同时,还可以使用URL来传递参数,下面演示使用URL传递参数交给request对象来处置。
在reg.jsp页面中添加如下代码:
<br> <br> <a href="request.jsp?username=lisi">URL传递参数</a>在request.jsp页面中添加判断:
爱好:<% String[] favorites=request.getParameterValues("favorite"); if(favorites!=null) { for(int i=0;i<favorites.length;i++) { out.println(favorites[i]+" "); } }在reg.jsp中效果如下:
点击超链接后,request.jsp中处理结果如下:
可以在URL地址中看见username=lisi。如果传递中文看如何:
出现中文乱码,这种通过URL传递参数引起的中文乱码问题,request对象的setCharacterEncoding方法就不能解决了。需要修改Tomcat的配置信息,在Tomcat安装目录中的conf目录下,打开server.xml文件,在Connector中添加如下内如:URIEncoding="utf-8",如下所示:
然后重启服务器,再次运行结果如下:
这样就解决了中文乱码问题。
对于剩下的其它的函数,这里就不演示了,函数很简单。
3、response对象
response对象包含了相应客户端七牛的的有关信息,不过在JSP中很少直接用到它。它是HttpServletResponse类的实例。response对象具有页面作用域,也就是说访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。
response对象有如下常用方法:
- String getCharacterEncoding() 返回响应使用的是哪种字符编码;
- void setContentType(String type) 设置相应的MIME类型;
- PrintWriter getWriter() 返回可以向客户端输出字符的一个对象(与out内置对象有区别);
- sendRedirect(String location) 重新定向客户端的请求;
<%@ page language="java" import="java.util.*,java.io.*" contentType="text/html; charset=utf-8"%><% response.setContentType("text/html;charset=utf-8"); out.println("<h1>response内置对象</h1>"); out.println("<hr>"); PrintWriter outer = response.getWriter(); //获得输出流对象 outer.println("我是response对象生成的输出流outer对象");%>其中,这里没有常见的html标签,通过setContentType()来设置MIME类型。然后使用out内置对象在页面上打印内容,之后调用getWriter函数获得一个可以向客户端写内容的PrintWriter对象outer,使用outer向页面打印一句话。结果如下:
如果想使out对象打印的内容在outer之前,可以在out.println()之后使用out对象的flush方法清空缓冲区,同时还会降缓冲区的内容强制写入页面中。如下:
out.println("<h1>response内置对象</h1>"); out.println("<hr>"); out.flush();结果如下:
sendRedeirect(String location)是请求重定向,可以将客户端的响应重定向到参数指定的location处。
4、session对象
首先应该知道,什么是session?
session
(1)session表示客户端与服务器之间的一次会话;
(2)web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的时间,也就是说用户浏览这个网站所花费的时间;
(3)也就是说,session实际上是一个特定的时间概念;
当具体到生活中的实例时,可以拿网上购物来看,购物时需要登录,进入商品页面挑选商品,选择商品然后付款完成,整个流程属于一个session。
还有就是,session保存在服务器的内存中,服务器在内存中为每一个用户保存一个session,如下图:
然后看一下JSP中的session内置对象:
- session对象是一个JSP内置对象;
- session对象在第一个JSP页面被装载时自动创建,完成会话期管理;
- 从一个客户打开浏览器并链接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话;
- 当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象;
- session对象是HttpSession类的实例;
- long getCreationTime() 返回session的创建时间(单位是毫秒);
- public String getId() 返回session创建时JSP引擎为它设置的唯一的ID号;
- public Object setAttribute(String name,Object value) 使用指定名称将对象绑定到此会话;
- public Object getAttribute(String name) 返回与此会话中指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null;
- String[] getValueNames() 返回一个包含次session所有可用属性的数组;
- int getMaxInactiveInterval() 返回两次请求间隔多长时间次session被取消(以秒为单位);
- setMaxInactiveInterval(int arg0) 设置多长时间内没有请求会取消session(单位是秒);
<body> <h1>session内置对象</h1> <hr> <% SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date d = new Date(session.getCreationTime()); session.setAttribute("username", "admin"); session.setAttribute("password", "123456"); session.setAttribute("age", 20); %> Session创建时间:<%=sdf.format(d)%><br> Session的ID编号:<%=session.getId()%><BR> 从Session中获取用户名:<%=session.getAttribute("username") %><br> <a href="session_page2.jsp" target="_blank">跳转到Session_page2.jsp</a> </body>session_page2.jsp:
<body> <h1>session内置对象</h1> <hr> Session的ID编号:<%=session.getId()%><BR> 从Session中获取用户名:<%=session.getAttribute("username") %><br> Session中保存的属性有:<% String[] names =session.getValueNames(); for(int i=0;i<names.length;i++) { out.println(names[i]+" "); } %> <br> </body>在session_page1.jsp中,可以得到session的创建时间,通过setAttribute设置属性,通过getAttribute获得属性。因为session表示一个会话,在通过URL链接到session_page2.jsp时,sessionID应该一样,同时在session_page2.jsp中也能获得保存的属性:
虽然session表示一个会话,如果浏览器不关闭的话session会保存在服务器的内存中,不过session也有一个期限,可以使用getMaxInactiveInterval()获得这个期限,也可以使用setMaxInactiveInterval()来设置这个期限。在session_page1.jsp中来设置期限:
<% SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date d = new Date(session.getCreationTime()); session.setAttribute("username", "admin"); session.setAttribute("password", "123456"); session.setAttribute("age", 20); //设置当前session最大生成期限单位是秒 session.setMaxInactiveInterval(10);//10秒钟 %>设置最大生存期限为10秒,结果如下:
可以看到,在两个页面中的sessionID不同,说明是两个不同的session,第一个页面创建的session由于过了生存期限被取消了,在第二个页面中新建了一个session,而且第一个session保存的属性也不存在了。
session的生命周期
session的生命周期有如下几个阶段:
(1)创建阶段
在创建阶段,当客户端第一次访问某个jsp页面或者servlet时,服务器就会为当前会话创建一个sessionID,每次客户端向服务器发送请求时,都会携带此sessionID,服务器会对这个sessionID进行校验,来判断是否属于同一个会话;
(2)活动阶段
在活动阶段中有如下几种情况,
- 某次会话当中通过超链接打开的新页面属于同一次会话;
- 只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话;
- 除非本次会话的所有页面都关闭后再重新访问某个jsp或servlet将会创建新的会话;
- 调用session.invalidate()方法;
- session过期(超时);
- 服务器重启(会销毁所有的session);
- 调用session.setMaxInactiveInterval(int arg0),单位是秒;
- 配置web.xml,添加下面的内容:
<session-config> <session-timeout>1</session-timtout></session-config>单位是分钟。
application对象有如下几种方法:
- public void setAttribute(String name,Object value) 使用指定名称将对象绑定到此会话;
- public Object getAttribute(String name) 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null;
- Enumeration getAttributeNames() 返回所有可用属性名的枚举;
- String getServerInfo() 返回JSP(Servlet)引擎名及版本号;
6、page对象
page对象就是指向当前JSP页面本身,就像类中的this指针,它是java.lang.Object类的实例,常用方法也就是说Object类的常用方法。
7、pageContext对象
pageContext对象是pageContext类的实例,提供了对JSP页面内所有的对象及名字空间的访问,不但可以访问到本页面所在的session,也可以获得本页面所在的application中的某一个属性值。所以pageContext的功能很大。
pageContext对象的常用方法如下:
- JspWriter getOut() 返回当前页面的out对象;
- HttpSession getSession() 返回当前页面的session对象;
- Object getPage() 返回当前页面的page对象;
- ServletRequest getRequest() 返回当前页面的request对象;
- ServletResponse getResponse() 返回当前页面的response对象;
- void setAttribute(String name,Object attribute) 设置属性及属性值;
- Object getAttribute(String name,int scope) 在指定范围内取属性的值;
- int getAttributeScope(String name) 返回某属性的作用范围;
- void forward(String relativeUrlPath) 使当前页面重导到另一页面;
- void include(String relativeUrlPath) 在当前位置包含另一文件;
8、config对象
config对象是在一个servlet初始化时,JSP引擎向它传递信息用的,此信息包括servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象),常用方法如下:
- ServletContext getServletContext() 返回凡有服务器相关信息的ServletContext对象;
- String getInitParameter(String name) 返回初始化参数的值;
- Enumeration getInitParameterNames() 返回servlet初始化所需所有参数的枚举;
exception对象是java.lang.Throwable的实例,是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。常用方法如下:
- String getMessage() 返回描述异常的消息;
- String toString() 返回关于异常的尖端描述消息;
- void printStackTrace() 显示异常及其栈轨迹;
- Throwable FillInStackTrace() 重写异常的执行栈轨迹;
由于要处理异常,首先要产生一个异常,最简单的就是除零,这是一个运行时错误,也叫算数错误。exception_test.jsp页面代码如下:
<body> <h1>测试异常的页面</h1> <hr> <% System.out.println(100/0); %> </body>由于这个页面产生异常,需要指定一个页面来处理这个异常,需要在第一行添加如下内容:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" errorPage="exception.jsp"%>后面的errorPage="exception.jsp"指定了exception.jsp页面来处理这个异常。
exception.jsp页面代码如下:
<body> <h1>exception内置对象</h1> <hr> 异常的消息是:<%=exception.getMessage()%><BR> 异常的字符串描述:<%=exception.toString()%><br> </body>需要在第一行添加如下内容:
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" isErrorPage="true" %>后面的isErrorPage="true"是必须的。
结果如下:
当访问exception_test.jsp页面时,产生异常,然后交给exception.jsp页面处理,打印出异常消息,同时可以看到,地址栏中的URL地址并没有变化。
以上就是9个内置对象的总结。
- JSP的内置对象
- JSP的内置对象
- JSP的内置对象
- JSP的内置对象!
- jsp的内置对象
- JSP的内置对象
- jsp的内置对象
- JSP的内置对象
- JSP的内置对象
- jsp的内置对象
- jsp的内置对象
- jsp的内置对象
- jsp的内置对象
- jsp的内置对象
- jsp的内置对象
- JSP的内置对象
- JSP的内置对象:
- JSP的内置对象
- Jstl <c:forEach varStatus="status">中 varStatus的属性简介
- Android 通知栏Notification
- iOS 通过定位获取常驻后台
- 【python】scrapy安装
- Git新手入门与上传项目到远程仓库GitHub
- JSP的内置对象
- #HDU 2680 Choose the best route 【SPFA最短路】
- ViewFlipperDemo左右切换
- <手机控>开发过程记录
- 关于Android的一个常见错误:Unable to add window
- 关于IE6中无法使用margin:0 auto居中的问题解决方案
- google大法!
- Android Studio 虚拟机设置/启动失败之consider using a system image...
- Leetcode Q8