JSP内置对象
为了自己查阅方便。。。。。
在JSP中为了简化用户的开发,提供了9个内置对象,这些内置对象将由容器自动为用户进行实例化。
No | 内置对象 | 类型 | 描述 |
1 | pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
2 | request | javax.servlet.http.HttpServletRequest | 得到用户的请求信息 |
3 | response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
4 | session | javax.servlet.http.HttpSession | 用来保存每一个用户的信息 |
5 | application | javax.servlet.ServletContext | 表示所有用户的共享信息 |
6 | config | javax.servlet.ServletConfig | 服务器配置,可以获取初始化参数 |
7 | out | javax.servlet.jsp.JSPWriter | 页面输出 |
8 | page | java.lang.Object | 表示从页面中表示出来的一个Servlet实例 |
9 | exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
在JSP中提供了4种属性的保存范围,所谓属性保存范围指的是一个内置对象可以在多少个页面中保存并继续使用:
① page:只在一个页面中保存属性,跳转之后无效。(使用pageContext进行属性设置,但是一般都习惯于将这种范围称为page范围)
② request:只在一次请求中保存属性,服务器跳转后依然有效。(request范围只针对服务器跳转。而对于超链接操作后地址栏信息改变属于客户端跳转,是无法获取属性的。正常情况下一次请求服务器只会给予一次回应,那么这时如果是服务器端跳转,请求的地址栏没有改变,所有也就相当于回应一次;而如果地址栏改变了,就相当于发出了第二次请求,那么第一次请求的内容自然就已经消失了)
③ session:在一次会话范围中保存,无论何种跳转都可以使用,但是新开浏览器无法使用。(每一个新的浏览器连接上服务器后就是一个新的session)
④ application:在整个服务器上保存,所有用户(每一个session)都可以使用,但是如果服务器重新启动,那么之前所设置的全部属性将消失。
以上四个内置对象(pageContext、request、session、application)都支持下面的属性操作方法:
No | 方法 | 描述 |
1 | public void setAttribute(String name,Object 0) | 设置属性的名称以及内容 |
2 | public Object getAttribute(String name) | 根据属性名称获取对应属性内容 |
3 | public void removeAttribute(String name) | 删除指定的属性 |
page属性范围中使用的是pageContext进行属性设置的,但是从javax.servlet.jsp.PageContext类中可以发现,有下面一种设置属性的方法
No | 方法 | 描述 |
1 | public void setAttribute(String name,Object value,int scope) | 设置属性并指定保存范围 |
与之前所使用的setAttribute()方法不同,此方法内有一个int参数,而此参数可以指定一个属性的保存范围
No | 方法 | 描述 |
1 | public static final int PAGE_SCOPE | 表示page属性范围,默认 |
2 | public static final int REQUEST_SCOPE | 表示request属性范围 |
3 | public static final int SESSION_SCOPE | 表示session属性范围 |
4 | public static final int APPLICATION_SCOPE | 表示application属性范围 |
例如:
pageContext.setAttribute("name","李叶",PageContext.REQUEST_SCOPE);
实际上pageContext对象可以设置任意范围的属性,而其他操作也只是对这一功能的再包装而已,但一般还是习惯使用pageContext对象设置保存在一页的范围的属性,而很少使用pageContext设置其他范围的属性。
一.request
request是javax.servlet.http.HttpServletRequest接口的实例化对象,主要作用是接受客户端发送来的请求信息,如请求的参数、发送的头信息等都属于客户端发来的信息。常用的方法如下
No | 方法 | 描述 |
1 | public String getParameter(String name) | 接收客户端发来的请求参数内容 |
2 | public String[] getParameterValues(String name) | 获取客户端发来的一组请求参数内容 |
3 | public java.util.Enumeration getParameterNames() | 获取全部请求参数的名称 |
4 | public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException | 设置统一的请求编码 |
5 | public boolean isUserInRole(String role) | 进行用户身份的验证 |
6 | public HttpSession getSession() | 取得当前的session对象 |
7 | public String getRemoteAddr() | 获取客户端的IP地址 |
8 | public String getRequestURI() | 返回正在请求的路径 |
9 | public java.util.Enumeration getHeaderNames() | 取得全部请求的头信息的名称 |
10 | public String getHeader(String name) | 根据名称获取头信息的内容 |
11 | public String getMethod() | 获取用户的提交方式 |
12 | public String getServletPath() | 获取访问的路径 |
13 | public String getContextPath() | 获取上下文资源路径 |
例如:
html代码:
<html> <head><title>test</title></head> <body> <form action="request_demo02.jsp" method="post">
<input type="text" name="uname"><br>
<input type="checkbox" name="inst" value="唱歌">唱歌 <input type="checkbox" name="inst" value="跳舞">跳舞 <input type="checkbox" name="inst" value="游泳">游泳 <br><input type="hidden" name="id" value="3"> <input type="submit" value="提交"> </form> </body> </html>
JSP代码:
request.setCharacterEncoding("GBK") ;// 设置的是统一编码
String id = request.getParameter("id") ;
String name = request.getParameter("uname") ;
String inst[] = request.getParameterValues("inst") ;
如果要取得头信息的名称,可以直接通过request内置对象的getHeaderNames()方法;而想取出每一个头信息的内容,则需要使用getHeader()方法:
Enumeration enu = request.getHeaderNames() ;// 取得全部的头信息 while(enu.hasMoreElements()){//依次取出头信息 String headerName = (String) enu.nextElement() ;//没用泛型,只能强制转换 String headerValue = request.getHeader(headerName) ;//取出头信息内容 }
如果要获取客户端的IP地址、访问的路径信息、提交的方式等:
String method = request.getMethod() ;//获取提交方式 String ip = request.getRemoteAddr() ;//获取客户端的IP地址 String path = request.getServletPath() ;//获取访问路径 String contextPath = request.getContextPath() ;//获取上下文资源名称
当服务器端需要得到请求客户端的相关信息时都会使用request对象完成。
二.response
response对象属于javax.servlet.http.HttpServletResponse接口的实例,主要作用是对客户端的请求进行回应,将web服务器处理后的结果发回给客户端。常用方法如下:
No | 方法 | 描述 |
1 | public void addCookie(Cookie cookie) | 向客户端增加Cookie |
2 | public void setHeader(String name,String value) | 设置回应头信息 |
3 | public void sendRedirect(String location) throws IOException | 页面跳转 |
服务器端可以通过response根据需要向客户端设置头信息,在所有头信息的设置中,定时刷新页面的头信息使用最多,代码如下:
response.setHeader("refresh","2");//设置两秒刷新页面一次 response.setHeader("refresh","3;URL=hello.htm");//设置三秒后跳转到hello.htm
服务器还可以使用response对象的sendRedirect()的方法直接完成页面的跳转:
response.sendRedirect("hello.htm");
注意由于使用sendRedirect()跳转后地址栏页面地址改变了,所以这种跳转属于客户端跳转。
response对象还可以操作Cookie,但是由于Cookie是服务器端保存在客户端的信息,所以其安全性很差,JSP中专门提供了javax.servlet.http.Cookie操作类,常用方法如下:
No | 方法 | 描述 |
1 | public Cookie(String name,String value) | 实例化Cookie对象,同设置名称和内容 |
2 | public String getName() | 取得Cookie名称 |
3 | public String getValue() | 取得Cookie内容 |
4 | public void setMaxAge(int expiry) |
设置Cookie的保存时间,以秒为单位 |
5 | public void addCookie(Cookie cookie) | response对象向客户端设置Cookie |
//想客户端增加Cookie Cookie c1 = new Cookie("lxh","LiXingHua") ; Cookie c2 = new Cookie("mldn","www.MLDNJAVA.cn") ; c1.setMaxAge(100) ; c2.setMaxAge(100) ; response.addCookie(c1) ; response.addCookie(c2) ; //客户端获取Cookie Cookie c[] = request.getCookies() ;// 取得客户端的全部Cookie for(int x=0;x<c.length;x++){ System.out.println(c[x].getName()) ; System.out.println(c[x].getValue()) ;
服务器设置的Cookie会保存在客户端上,但是如果不设置Cookie的保存时间,那么当浏览器重新启动后设置的Cookie就不在了,如果设置了每一个Cookie的保存时间为100秒,那么在100秒内即使重新启动浏览器也可以取出设置的Cookie。
三.session
session对象是javax.servlet.http.HttpSession接口的实例化对象,所以session只能应用在HTTP协议中,在开发中session对象最主要的用处就是完成用户的登录(login)、注销(logout)等常见的功能,每一个session对象都表示不同的访问用户。常用方法如下:
No | 方法 | 描述 |
1 | public String getId() | 获取session ID |
2 | public long getCreationTime() | 获取session的创建时间 |
3 | public long getLastAccessedTime() | 获取session的最后一次操作时间 |
4 | public boolean isNew() | 判断是否有新的session用户 |
5 | public viod invalidate() | 让session失效 |
6 | public Enumeration getAttributeNames() | 得到全部属性的名称 |
当一个用户连接到服务器后,服务器会自动为此session分配一个不会重复的session Id,服务器依靠这些不同的session Id来区分每一个不同的用户。同时注意,对于每一个已经连接到服务器上的用户,如果重新启动服务器,则这些用户再次发出请求实际上表示的都是一个新连接的用户,服务器会为每一个用户重新分配一个新的session Id。
//获取当前用户的session ID String id=session.getId(); //登录页 String name = request.getParameter("uname") ;//取得name信息 String password = request.getParameter("upass") ;//取得password信息 if(!(name==null || "".equals(name) || password==null || "".equals(password))){ if("lixinghua".equals(name) && "mldn".equals(password)){ session.setAttribute("userid",name) ;//将登录用户名保存在session中 response.setHeader("refresh","2;URL=welcome.jsp") ;//定时跳转 } } //欢迎页 if(session.getAttribute("userid")!=null){ System.out.println("欢迎"+session.getAttribute("userid")+"光临本系统") ; } //注销 response.setHeader("refresh","2;URL=login.jsp") ; session.invalidate() ; // 注销,表示当前的session失效 //判断新用户 if(session.isNew()){ System.out.println("欢迎新用户光临!"); }else{ System.out.println(“您已经是老用户了!”); }
四.application
application对象是javax.servlet.ServletContext接口的实例化对象,ServletContext代表了整个容器的操作,常用的方法如下:
No | 方法 | 描述 |
1 | String getRealPath(String path) | 得到虚拟目录对应的绝对路径 |
2 | public Enumeration getAttributeNames() | 得到所有属性的名称 |
3 | public String getContextPath() | 取得当前的虚拟路径名称 |
获取虚拟目录对应的绝对路径:
String path = application.getRealPath("/") ;//得到当前虚拟目录下对应的真实路径 String path = this.getServletContext().getRealPath("/") ;//和上面的功能一致,但是这里的方法表示由容器调用,实际上ServletContext本身就表示整个容器
其他功能暂时没有时间去看了,以后有时间可以再去查查资料。
五.config
在Java EE的标准中,Web目录中的WEB-INF是必须存在的,然而即使列出了Web目录下的全部内容,WEB-INF也不会显示出来,所有其安全性是最高的,在各个程序开发中,基本上都是讲一些配置信息保存在此文件夹下,比如web.xml文件。
config对象是javax.servlet.ServletConfig接口的实例化对象,主要的功能是取得一些初始化的配置信息,而所有的初始化参数必须在web.xml里配置,即如果一个JSP文件要想通过初始化参数取得一些信息,则一定要在web.xml文件中完成映射。
No | 方法 | 描述 |
1 | public String getInitParameter(String name) | 取得指定名称的初始化参数内容 |
2 | public Enumeration getInitParameterNames() | 取得全部的初始化参数名称 |
//从web.xml中获取初始化配置参数 String dbDriver = config.getInitParameter("driver") ;
六.out
out对象是javax.servlet.jsp.JspWriter类的实例化对象,主要功能是完成页面的输出操作,相关方法如下:
No | 方法 | 描述 |
1 | public void println(String s) | 页面输出,输出完后换行 |
2 | public void print(String s) | 页面输出不换行 |
3 | public int getBufferSize() | 返回JSP中缓冲区的大小 |
4 | public int getRemaining() | 返回JSP中未使用的缓冲区大小 |
int buffer = out.getBufferSize() ; int avaliable = out.getRemaining() ;
七.pageContext
pageContext对象是javax.servlet.jsp.PageContext类的实例,主要表示一个JSP页面的上下文,除了前面提到的方法外,还有下面的方法:
No | 方法 | 描述 |
1 | public abstract void foward(String relativeUrlPath) throws ServletException,IOException | 页面跳转 |
2 | public void include(String relativeUrlPath) throws ServletException,IOException | 页面包含 |
3 | public ServletConfig getServletConfig() | 取得ServletConfig对象 |
4 | public ServletContext getServletContext() | 取得ServletContext对象 |
5 | public ServletRequest getRequest() | 取得ServletRequest对象 |
6 | public ServletResponse getResponse() | 取得ServletResponse对象 |
7 | public HttpSession getSession() | 取得HttpSession对象 |
从上表中发现,之前的request、response、config、application、<jsp:include>和<jsp:forward>等操作实际上都可以在pageContext对象中完成。
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>页面跳转</title></head> <body> <% pageContext.forward("pagecontext_forward_demo02.jsp?info=MLDN") ;//页面跳转 %> </body> </html>
最后两个对象page和exception暂时没去查资料。