目录
JSP提供了由容器实现和管理的内置对象,也可以称之为隐含对象,由于JSP使用Java作为脚本语言,所以JSP将具有强大的对象处理能力,并且可以动态创建Web页面内容。但Java语法在使用一个对象前,需要先实例化这个对象,这其实是一件比较烦琐的事情。JSP为了简化开发,提供了一些内置对象,用来实现很多JSP应用。在使用JSP内置对象时,不需要先定义这些对象,直接使用即可。
在JSP中一共预先定义了9个这样的对象,分别为request、response、session、application、out、pageContext、config、page和exception。
内置对象:就是在JSP中无需创建就可使用的称为内置对象,它是有容器创建的(如Tomcat、JBoss、weblgic等容器创建)。
JSP九大内置对象分别为:out、request、response、session、application、pageContext、page、config、exception。
1、out对象
向客户端输出信息,它是JspWriter类的一个实例。
常用的有out.print();或out.println();
2、request对象
获取客户端传递到服务器的信息。request对象实现了HttpServletRequest接口,而此接口又继承与ServletRequest接口。由于接口是不能创建对象的,所以可以通过反射(request.getClass().getName())来获得request对象属于具体的哪个类,不同的容器(服务器)会产生不一样的结果。
request对象常用的方法:
- getParameter():获得客户端传递给服务器一个参数的值。
- getParameterNames():获得客户端传递给服务器的所有参数的名字。
- getParameterValues():获取一个参数的所有值(如checkBox的情况)。
- getRequestRequestDispatcher(String path).forward(request,response):请求转发。
- setAttribute(),getAttribute(),removeAttribute():这三个方法主要用于struts框架中,必须在同一个请求中设置的属性才能获得。
- getCookies():从请求中读取Cookie数据,把个人信息存放到客户端。
- setCharacterEncoding()/getCharacterEncoding():设置/获得字符编码。
- getContextLength():获得整个网页的长度(长度不确定时返回-1).
- getRequestURL():返回当前网页的地址(http://localhost:8080/项目名/具体页面.jsp)。
- getRequestURI():返回项目名/具体网页.jsp。
- getMethod():获得网页提交的方法,默认为get,还可以设置为post。
- getRemoteAddr():获得远程地址。
- getRemoteHost():获得远程主机的名称。
- getServerPort():端口号(一般默认是8080)。
- getServerName():获取服务器的名字。
- getScheme():获取当前链接使用的协议,如http。
- getServletPath():/具体网页.jsp。 getContextPath():/项目名,获得的是上下文路径。
- getHeader(),getHeaders(),getHeaderNames():request.getHeader (“Referer”);获得来自的网页。
3、response对象
向客户端浏览器输出信息,对客户的请求进行响应。它是实现了HttpServletResponse接口,此接口继承与ServletResponse,与request对象类似,根据反射机制,由于服务器不同,具体的类也不一样。
response对象常用的方法:
- void addCookie(Cookie cookie):向客户端添加Cookie
- void setContentType(String type):设置HTTP响应的contentType类型
- void setCharacterEncoding(String charset):设置响应采用的字符编码类型
- void sendRedirect(String location):将请求重新定位到一个新的URL上
4、session对象
会话对象,它是实现HttpSession接口。它们有会话失效时间,tomcat默认是30分钟,可以设置。每个用户的会话空间是隔离的,例如用户商城网站,每个人买的东西都不一样,他们各自把选的商品放在各自的购物车中,互不影响。
session对象常用的方法:
- String getId():获取sessionid
- long getCreationTime():返回session对象被创建的时间,以毫秒为单位
- void setMaxInactiveInterval(int interval):设定session的有效非活动时间,以秒为单位
- int getMaxInactiveInterval():获取session的有效非活动时间,以秒为单位
- void invalidate():设置session对象失效
- void setAttribute(String key,Object value):以key/value的形式将对象保存到session中
- ObjectAttribute(String key):通过key获取session中保存的对象
- void removeAttribute(String key):从session中删除指定key对应的对象
5、application对象
应用对象,它是实现ServletContext接口。Application、Session、request都可以通过setAttribute来设置属性,通过getAttribute来获取属性的值。但是它们的可见范围是不一样的。
1. Application对象所设置的属性不会过期,它在整个服务器运行过程中都是有效的,直到服务器重启。
2. Session对象所设置的属性只有在同一个session中可见。 request对象所设置的属性只有在同一次请求之间可见。
通过Application.getRealPath();可以获得其真实路径。如c:\workspace.metadate.plugins\org.eclipse.wst.server.core\temp0\wtpwebapps\项目名(这是项目最后部署完成的一个目录)。
application对象常用的方法:
- void setAttribute(String key,Object value):以key/value的形式将对象保存到application中
- ObjectAttribute(String key):通过key获取application中保存的对象
- String getRealPath(String path):返回相对路径的真实路径
6、page对象
JSP网页在翻译时会转换成一个servlet(而此servlet是一个类)。
它是JSP网页本身,page对象是当前网页转换后的servlet类的实例。
7、config对象
一般用来配置指定的JSP参数,它是实现了ServletConfig接口。
8、exception对象
在可能产生错误的文件中用page指令指定errorPage(例如在test.jsp页面中设置errorPage=”error.jsp”),然后在error.jsp页面中指定isErrorPage=”true”,用exception对象获取错误信息。
9、pageContext对象
它是PageContext类的一个实例。
它主要有以下两个作用:
1. 获取其它八大对象的句柄
pageContext.getOut(); //获得out对象的句柄
pageContext.getRequest(); //获得request对象的句柄
pageContext.getResponse(); //获得response对象的句柄
pageContext.getSession(); //获得session对象的句柄
pageContext.getServletContext();//获得application对象的句柄
pageContext.getServletConfig(); //获得config对象的句柄
pageContext.getException(); //获得exception对象的句柄
pageContext.getPage(); //获得page对象的句柄
2. 设置或获取4(page,request,session,application)个不同范围的值
pageContext.setAttribute("name","zhang"); //只在本页面有效
pageContext.setAttribute("name","zhang",PageContext.REQUEST_SCOPE);
相当于request.setAttribute("name","zhang"); //只在同一次请求中有效
pageContext.setAttribute("name","zhang",PageContext.SESSION_SCOPE);
相当于session.setAttribute("name","zhang"); //只在同一次会话中有效
pageContext.setAttribute("name","zhang",PageContext.APPLICATION_SCOPE);
相当于application.setAttribute("name","zhang"); //在整个应用中都有效
10丶保存会话Cookie和Session的区别:
注:Cookie不是内置对象
区别 | Cookie | Session |
存在 | Cookie是客户端技术,通常保存在客户端,即本地,IE浏览器把Cookie信息保存在类似于C:\windows\cookies的目录下。因为Cookie在客户端所以可以编辑伪造,不是十分安全 | Session是服务器端技术,在服务端,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务 |
存储数据 | 只能存储 String 类型的对象 | 能够存储任意的 java 对象 |
性能 | Cookie存在客户端对服务器没影响 | Session过多时会消耗服务器资源,大型网站会有专门Session服务器 |
作用域 | Cookie通过设置指定作用域只能在指定作用域有效 | Session在整个网页都有效 |
作用时间 | Cookie可以通过 setMaxAge设置有效时间,即使浏览器关闭了仍然存在 | 关闭网页Session就结束了 |
Java提供的操作Cookie的API
NO | 方法 | 类型 | 描述 |
1 | Cookie(String name, String value) | 构造方法 | 实例化Cookie对象,设置Cookie的名称和cookie的值 |
2 | public String getName() | 普通方法 | 取得Cookie的名字 |
3 | public String getValue() | 普通方法 | 取得Cookie的值 |
4 | public void setValue(String newValue) | 普通方法 | 设置Cookie的值 |
5 | public void setMaxAge(int expiry) | 普通方法 | 设置Cookie的最大保存时间,即cookie的有效期,当服务器给浏览器回送一个cookie时,如果在服务器端没有调用setMaxAge方法设置cookie的有效期,那么cookie的有效期只在一次会话过程中有效,用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一次会话,当用户关闭浏览器,会话就结束了,此时cookie就会失效,如果在服务器端使用setMaxAge方法设置了cookie的有效期,比如设置了30分钟,那么当服务器把cookie发送给浏览器时,此时cookie就会在客户端的硬盘上存储30分钟,在30分钟内,即使浏览器关了,cookie依然存在,在30分钟内,打开浏览器访问服务器时,浏览器都会把cookie一起带上,这样就可以在服务器端获取到客户端浏览器传递过来的cookie里面的信息了,这就是cookie设置maxAge和不设置maxAge的区别,不设置maxAge,那么cookie就只在一次会话中有效,一旦用户关闭了浏览器,那么cookie就没有了,那么浏览器是怎么做到这一点的呢,我们启动一个浏览器,就相当于启动一个应用程序,而服务器回送的cookie首先是存在浏览器的缓存中的,当浏览器关闭时,浏览器的缓存自然就没有了,所以存储在缓存中的cookie自然就被清掉了,而如果设置了cookie的有效期,那么浏览器在关闭时,就会把缓存中的cookie写到硬盘上存储起来,这样cookie就能够一直存在了。 |
6 | public int getMaxAge() | 普通方法 | 获取Cookies的有效期 |
7 | public void setPath(String uri) | 普通方法 | 设置cookie的有效路径,比如把cookie的有效路径设置为"/xdp",那么浏览器访问"xdp"目录下的web资源时,都会带上cookie,再比如把cookie的有效路径设置为"/xdp/gacl",那么浏览器只有在访问"xdp"目录下的"gacl"这个目录里面的web资源时才会带上cookie一起访问,而当访问"xdp"目录下的web资源时,浏览器是不带cookie的 |
8 | public String getPath() | 普通方法 | 获取cookie的有效路径 |
9 | public void setDomain(String pattern) | 普通方法 | 设置cookie的有效域 |
10 | public String getDomain() | 普通方法 | 获取cookie的有效域 |
cookie实现原理:
session实现原理:
11丶JSP4大作用域
首先要声明一点,所谓“作用域”就是“信息共享的范围”,也就是说一个信息能够在多大的范围内有效。4个JSP内置对象的作用域分别为:application、session、request、page 。JSP内置对象作用域表如下:
名称 | 作用域 |
application | 在所有应用程序中有效 |
session | 在当前会话中有效 |
request | 在当前请求中有效 |
page | 在当前页面有效 |
按作用域从小到大排序:
page<request<session<application
12丶转发与重定向的区别
一、请求转发和重定向
1)请求转发:request.getRequestDispatcher(URL地址).forward(request, response)
处理流程:
- 客户端发送请求,Servlet做出业务逻辑处理。
- Servlet调用forword()方法,服务器Servlet把目标资源返回给客户端浏览器。
2)重定向:response.sendRedirect(URL地址)
处理流程:
- 客户端发送请求,Servlet做出业务逻辑处理。
- Servlet调用response.sendReadirect()方法,把要访问的目标资源作为response响应头信息发给客户端浏览器。
- 客户端浏览器重新访问服务器资源xxx.jsp,服务器再次对客户端浏览器做出响应。
以上两种情况,你都需要考虑Servlet处理完后,数据如何在jsp页面上呈现。图例是请求、响应的流程,没有标明数据如何处理、展现。
二、转发和重定向的路径问题
1)使用相对路径在重定向和转发中没有区别
2)重定向和请求转发使用绝对路径时,根/路径代表了不同含义
重定向response.sendRedirect("xxx")是服务器向客户端发送一个请求头信息,由客户端再请求一次服务器。/指的Tomcat的根目录,写绝对路径应该写成"/当前Web程序根名称/资源名" 。如"/WebModule/login.jsp","/bbs/servlet/LoginServlet"
转发是在服务器内部进行的,写绝对路径/开头指的是当前的Web应用程序。绝对路径写法就是"/login.jsp"或"/servlet/LoginServlet"。
总结:以上要注意是区分是从服务器外的请求,还在是内部转发,从服务器外的请求,从Tomcat根写起(就是要包括当前Web的根);是服务器内部的转发,很简单了,因为在当前服务器内,/写起指的就是当前Web的根目录。
三、转发和重定向的区别
-
request.getRequestDispatcher()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;服务器内部转发,整个过程处于同一个请求当中。
response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。不在同一个请求。重定向,实际上客户端会向服务器端发送两个请求。
所以转发中数据的存取可以用request作用域:request.setAttribute(), request.getAttribute()
,重定向是取不到request中的数据的。只能用session。 -
forward()更加高效,在可以满足需要时,尽量使用RequestDispatcher.forward()方法。(思考一下为什么?)
-
RequestDispatcher是通过调用HttpServletRequest对象的getRequestDispatcher()方法得到的,是属于请求对象的方法。
sendRedirect()是HttpServletResponse对象的方法,即响应对象的方法,既然调用了响应对象的方法,那就表明整个请求过程已经结束了,服务器开始向客户端返回执行的结果。 - 重定向可以跨域访问,而转发是在web服务器内部进行的,不能跨域访问。
本章总结
- 所谓内置对象就是由Web容器加载的一组实例,在JSP中可直接使用。
- out对象用于向浏览器输出数据。
- request对象主要用于处理客户端用户提交的请求信息。
- response对象与request对象相对应,它可用于控制响应参数丶获取响应流对象。
- response对象的sendRedirect()方法用于将请求重定向到一个新的URL上。重定向在客户端发挥作用,通过浏览器重新请求新地址,实现页面转向,在地址栏中可以显示转向后的地址,不能共享上一次请求中的数据。
- 转发在服务器端发挥作用,指在服务器内部控制权的转移,通过forward()方法将请求在多个页面间传递。浏览器的地址栏不会显示出转向后的地址,可以共享请求中的数据。
- session对象可以为每个客户端独立地保持相关的个人信息,通过sessionid唯一标识每个客户端。
- Cookie是由服务器端生成丶发送给客户端浏览器的,浏览器会将其保存在某个目录下的文本文件中。Cookie可以实现浏览器与服务器之间的数据传递。