jsp 内置对象(一)
2017-10-14 10:28 晨曦曙光 阅读(432) 评论(0) 编辑 收藏 举报一.jsp的九大内置对象
内置对象 | 所属类 |
pageContext | javax.servlet.jsp.PageContext |
request | javax.servlet.http.HttpServletRequest |
response | javax.servlet.http.HttpServletResponse |
session | javax.servlet.http.HttpSession |
config | javax.servlet.ServletConfig |
application | javax.servlet.ServletContext |
out | javax.servlet.jsp.JspWriter |
page | java.lang.Object |
exception | java.lang.Throwable |
JSP的内置对象在JSP中非常重要,这些内置对象是由WEB容器创建出来的,所以用户不用自己创建。
在JSP生成的Servlet类中可以清楚的看到这些内置对象的创建,不过需要注意的是exception一般是不会创建的,只有当JSP页面是错误页面才会创建,即只有JSP包含isErrorPage="true"时才创建exception对象;
主要的几个内置对象有:
1、request对象
request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
2、response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。
3、session对象
session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
4、application对象
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
5、out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
6、pageContext 对象
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
7、config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
8、page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
9、exception 对象
exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
二.out对象的用法
out对象是JspWriter类的实例,是向客户端输出内容常用的对象
常用方法:
- out. clear() 清除缓冲区的内容
- out. clearBuffer() 清除缓冲区的当前内容
- out. flush() 将缓冲区内容输出到客户端
- out.getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
- out.getRemaining() 返回缓冲区还剩余多少可用
- booleanisAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常
- out.close() 关闭输出流
- out. println() 向客户端打印字符串
- out.newLine():输出一个换行符。
out方法代码实例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <style type="text/css"> *{ text-align:center; } </style> </head> <body> 用户名是:<%=request.getParameter("username") %> <hr> <% out.println("<h1>望庐山瀑布</h1>"); out.println("日照香炉生紫烟,<br/>"); /*强制输出缓冲区里面的内容 */ out.flush(); /* 清空前面的缓冲区 */ out.clearBuffer(); out.println("遥看瀑布挂前川,<br/>"); out.println("飞流直下三千尺,<br/>"); out.println("疑似银河落九天,<br/>"); /* out.close(); */ %> 缓冲区大小=<%=out.getBufferSize() %><br/> 缓冲区剩余大小=<%=out.getRemaining() %><br/>
三.什么是缓冲区
缓冲区:buffer,所谓缓冲区就是内存的一块区域用来保存临时数据。
缓冲区的作用:
缓冲区是内存中的一块区域,提供缓冲区的功能以增强“请求-响应”操作的性能和效率:,通常我们把要经常访问的数据放在缓冲区。
常使用的方法有:
1.缓冲区大小=<%=out.getBufferSize() %><br/>
2.缓冲区剩余大小=<%=out.getRemaining() %><br/>
3.out.clearBuffer();清空前面的缓冲区
4. out.flush();/*强制输出缓冲区里面的内容 */
四。form 表单提交方式get&post
<form action="dispatcher.jsp(动作)" name="registForm" method="提交方式">
</form>
表单有两种提交方式:get与post
代码实例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>register 注册</title> </head> <body> <form action="dispatcher.jsp" name="registForm" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username" placeholder="请输入用户名" /></td> </tr> <tr> <td>爱好:</td> <td><input type="checkbox" name="hoby" value="篮球" />篮球 <input type="checkbox" name="hoby" value="足球" />足球 <input type="checkbox" name="hoby"value="西瓜" />西瓜 <input type="checkbox" name="hoby" value="王者荣耀"/>王者荣耀</td> </tr> <tr> <td><input type="submit" value="提交" /></td> </tr> </table> </form> <!-- 通过链接的形式传递参数 --> <a href="doRegist.jsp?sex=男">点我参数</a> </body> </html>
最明显的区别是地址栏的区别,post传递时,地址栏没有任何变化,而get传递,地址栏会显示传递的信息,因此get传递的信息有限。
五。请求与响应模式
1.request请求对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求, 然后做出响应。它是HttpServletRequest类的实例。
request对象具有请求域,及完成客户端的请求之前,该对象一直有效。
request方法:
- object getAttribute(Stringname) 返回指定属性的属性值
- Enumeration getAttributeNames() 返回所有可用属性名的枚举
- String getCharacterEncoding() 返回字符编码方式
- intget ContentLength() 返回请求体的长度(以字节数)
- String getContentType() 得到请求体的MIME类型
- ServletInputStreamgetInputStream() 得到请求体中一行的二进制流
- String getParameter(Stringname) 返回name指定参数的参数值
- Enumeration getParameterNames() 返回可用参数名的枚举
- String [] getParameterValues(Stringname) 返回包含参数name的所有值的数组
- String getProtocol() 返回请求用的协议类型及版本号
- String getScheme() 返回请求用的计划名,如:http.https及ftp等
- String getServerName() 返回接受请求的服务器主机名
- int getServerPort() 返回服务器接受此请求所用的端口号
- BufferedReadergetReader() 返回解码过了的请求体
- String getRemoteAddr() 返回发送此请求的客户端IP地址
- String getRemoteHost() 返回发送此请求的客户端主机名
- voidset Attribute(Stringkey,Objectobj) 设置属性的属性值
- String getRealPath(Stringpath) 返回一虚拟路径的真实路径
- void setAttribute(String,Object);存储此请求中的属性。
-
request.setCharacterEncoding("utf-8");//解决乱码问题
request常用方法有:
代码实例:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("utf-8"); request.setAttribute("password", "888888"); String name= request.getParameter("username"); String []arr=request.getParameterValues("hoby"); out.println("姓名:"+name); out.println("<br>爱好:"); if(arr !=null && arr.length>0){ for(String s:arr){ out.println(s+" "); } } out.println("<br/>密码:"+request.getAttribute("password")); %> <br/> MIME (ContentType)类型: <%= request.getContentType()%><br/> 服务器名字: <%= request.getServerName()%><br/> 协议版本: <%= request.getProtocol()%><br/> <hr/> 性别:<%= request. getParameter("sex")%>
获取请求参数时乱码问题:
浏览器发送的请求参数使用什么编码呢?当初浏览器打开网页时使用什么编码,发送就用什么编码。
服务器端获取到发过来的请求参数默认使用ISO8859-1进行解码操作,中文一定有乱码问题
对于Post方式提交的数据,可以设置request.setCharacterEncoding("gb2312");来明确指定获取请求参数时使用编码。但是此种方式只对Post方式提交有效。
对于Get方式提交的数据,就只能手动解决乱码:String newName = new String(name.getBytes("ISO8859-1"),"gb2312");此种方法对Post方式同样有效。
request.setCharacterEncoding("gb2312");对GET方式提交无效的原因是:该代码只设置请求实体的编码,而GET提交的数据是存放在请求行中的[资源名?param1="张三"¶m2=123],所以对GET请求的方式无效。
在tomcat的server.xml中可以配置http连接器的URIEncoding可以指定服务器在获取请求参数时默认使用的编码,从而一劳永逸的决绝获取请求参数时的乱码问题。也可以指定useBodyEncodingForURI参数,令request.setCharacterEncoding也对GET方式的请求起作用,但是这俩属性都不推荐使用,因为发布环境往往不允许修改此属性。
( 2).获取请求头信息
getHeader(name)方法 --- String ,获取指定名称的请求头的值
getHeaders(String name)方法 --- Enumeration<String> ,获取指定名称的请求头的值的集合,因为可能出现多个重名的请求头
getHeaderNames方法 --- Enumeration<String> ,获取所有请求头名称组成的集合
getIntHeader(name)方法 --- int ,获取int类型的请求头的值
getDateHeader(name)方法 --- long(日期对应毫秒) ,获取一个日期型的请求头的值,返回的是一个long值,从1970年1月1日0时开始的毫秒值
*实验:通过referer信息防盗链(防盗链:非正常访问,简单的是,就是不是从规定的站点发送HTTP请求,而是从其他站点发送的HTTP请求)
String ref = request.getHeader("Referer");
if (ref == null || ref == "" || !ref.startsWith("http://localhost")) {
response.sendRedirect(request.getContextPath() + "/homePage.html");
} else {
//为了不让其他资源可见,fengjie.html应该存放在WEB-INF目录下
this.getServletContext().getRequestDispatcher("/WEB-INF/fengjie.html").forward(request, response);
}
2.response对象
response对象表示服务器端对客户端的回应,response本身是HttpServletResponse的对象,HttpServletResponse对象本身也是ServletResponse对象的子接口,这点与reqeust是一样的。
1.常用方法:
1 String getCharacterEncoding() 返回响应用的是何种字符编码
2 ServletOutputStream getOutputStream() 返回响应的一个二进制输出流
3 PrintWriter getWriter() 返回可以向客户端输出字符的一个对象
4 void setContentLength(int len) 设置响应头长度
5 void setContentType(String type) 设置响应的MIME类型
6 sendRedirect(java.lang.String location) 重新定向客户端的请求
7.addCookie(Cookie):添加cookie
8.setHeader(String name,String value):设置头信息。
9.getOutputStream(); 输出流
常用用法:
(1)定时刷新:response.setHeader("refresh","2"):2秒刷新一次。
(2)定时跳转:response.setHeader("refresh","2;URL=hello.jsp");2秒后跳转到hello.jsp。注:此为客户端跳转;
(3)客户端跳转:response.sendRedirect("hello.jsp");
(4)PrintWriter writer=response.getWriter();//response 里面的打印
(5)response.sendRedirect("index.jsp");//请求重定向
注意:以上(2)用法可能会失败,原因是用户在2秒内刷新了页面,导致refresh失效;
应用:
实现用户登录后的“3秒后跳转,如果没有跳转请点击 这里”;
服务器跳转和客户端跳转的区别:
服务器端跳转是立刻跳转,即页面执行到跳转语句后就不执行后面的语句;
客户端跳转是执行完整个页面后才跳转。
Response实现请求重定向
(1)古老方法:response.setStatus(302);response.addHeader("Location","URL");
(2)快捷方式:response.sendRedirect("URL");
Response注意的内容:
(1)对于一次请求,Response的getOutputStream方法和getWriter方法是互斥,只能调用其一,特别注意forward后也不要违反这一规则。
(2)利用Response输出数据的时候,并不是直接将数据写给浏览器,而是写到了Response的缓冲区中,等到整个service方法返回后,由服务器拿出response中的信息组成响应消息返回给浏览器。
(3)service方法返回后,服务器会自己检查Response获取的OutputStream或者Writer是否关闭,如果没有关闭,服务器自动帮你关闭,一般情况下不要自己关闭这两个流。
代码实例Response_01.jsp 自动刷新功能:
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %> <html> <head> <title>web开发</title> </head> <body> <%! //定义全局变量,否则下面的count++将一直是0。 int count=0; %> <% response.setHeader("refresh","2");//每两秒刷新一次 %> <h5>您访问了<%=count++ %></>次了</h5> </body> </html>
代码实例response_02.jsp 自动跳转
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %> <html> <head> <title>web开发</title> </head> <body> <h3>这个页面3秒后跳转到51cto.html页面,如果没有跳转的话, 请点击<a href="51cto.html">这里</a></h3> //一个超链接 <% response.setHeader("refresh","3;URL=51cto.html"); //3秒后跳转到hello.html中去 %> </body> </html> 51cto.html <html> <head> <title>web</title> </head> <body> <h1>我的技术博客:http://zhaoyuqinag.blog.51cto.com</h1> </body> </html>
请求转发:
请求转发是指将请求再转发到另一资源(一般为JSP或Servlet)。此过程依然在同一个请求范围内,转发后浏览器地址栏内容不变 请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发到另外一个资源,并让该资源对浏 览器的请求进行响应 请求重定向:
重定向是指页面重新定位到某个新地址,之前的请求失效,进入一个新的请求,且跳转后浏览器地址栏内容将变为新的指定地址 重定向是通过HttpServletResponse对象的sendRedirect()来实现,该方法相当于浏览器重新发送一个请求 //1.请求转发 RequestDispatcher requestDispatcher = req.getRequestDispatcher("/index.jsp"); requestDispatcher.forward(req, resp); //2.请求重定向: resp.sendRedirect("http://localhost:8080/Servlet/servlet/Servlet_03");
代码实例response请求重定向(页面跳转)
<%@ page import="java.io.PrintWriter" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% out.println("我是前面的<hr>"); /* out.flush(); */ //response 里面的打印 PrintWriter writer=response.getWriter(); writer.println("我是后面的<hr>"); //请求重定向 response.sendRedirect("index.jsp"); %>
请求转发与请求重定向的区别: 请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的对象不会保存,地址栏的URL地址会改变。
请求转发:服务端行为,request.getRequestDispatcher().forward(req,resp);是一次的请求,转发后请求对象会保存,地址栏的URL地址不会改变。
请求转发与请求重定向应用的场景:
(1)通常情况下都用请求转发,减少服务器压力
(2)当需要更新地址栏时用请求重定向,如注册成功后跳转到主页。
(3)当需要刷新更新操作时用请求重定向,如购物车付款的操作。
response操作Cookie:
Cookie是浏览器所提供的一种技术支持,这种技术让服务器端的程序能够将一些只须保存在客户端,或者在客户端进行处理的数据,放在使用中本身的计算机,不须要通过网络的传输,因而提高网页处理的效率,而且也能减少服务器端的负载。但是由于Cookie是服务器端保存在客户端的信息,所以其安全性很差。
例如:打开QQ登陆框的时候,发现自己的QQ号已经在上面了,自己只需要写上密码登陆就可以了。这些其实都是Cookie的原因,Cookie可以在客户端上保存数据。仅仅是在客户端上,如果此时换了一台计算机,那肯定就没有了Cookie了,也就没有了所谓的QQ号已经写在上面了的事情。这就是Cookie。
response.addCookie(Cookie e);添加cookie。
Cookie位于javax.servlet.http.cookie中。
常用方法:
(1)Cookie c = new Cookie("name","value"):创建一个新cookie。
(2)c.setMaxAge(int seconds):设置cookie最长寿命,因为原本cookie保存在浏览器中,如果浏览器关闭,cookie丢失。
(3)c.getName():获得名字。
(4)c.getValue():获得值。
Cookie[]cs = request.getCookies();获得cookie
cookie代码实例:
Cookie_01.jsp <%@ page language="java" contentType="text/html" pageEncoding="gbk" %> <html> <head> <title>web</title> </head> <body> <% Cookie c1=new Cookie("xingming","zhaoyuqinag"); //设置Cookie属性 Cookie c2=new Cookie("51cto","zhaoyuqinag.blog.51cto.com"); c1.setMaxAge(100); // 设置保存在浏览器上的时间为100秒 是按照秒来定义的时间 c2.setMaxAge(100); response.addCookie(c1); //向浏览器添加Cookie属性 response.addCookie(c2); %> </body> </html> 这个程序表示在客户端上设置两个Cookie对象,设置添加后就要取出来,Cookie属于头信息,取出Cookie就用到了request对象。取出Cookie属性代码如下: Cookie_02.jsp <%@ page language="java" contentType="text/html" pageEncoding="gbk" %> <html> <head> <title>web</title> </head> <body> <% Cookie c[]=request.getCookies(); //取得客户端的全部Cookie for(int x=0;x<c.length;x++){ %> <h3><%=c[x].getName()%> --> <%=c[x].getValue()%></h3> //Cookie是一个数组 <% } %> </body> </html>
注意:
response和request有很多的相似之处。
response中的sendRedirect()方法是一个比较常用的方法。
Cookie是不安全的。
六、4种属性范围
(1)page范围(pageContext):一页中有效,跳转即无效。
(2)request范围:服务器跳转有效,客户端跳转无效。
(3)session范围:跳转有效,新开浏览器无效。
(4)application范围:所有用户有效,重启服务器无效。
这四个对象有3个方法:
(1) void setAttribute(String key,Object o); //设置属性
(2) Object getAttribute(String key); //取得后要向下转型。
(3) void removeAttribute(String key); //删除属性
注意:在getAttribute之后一定要转型!
举例:
pageContext.setAttribute("name","xiazdong"); //只能在单个页面中进行保存
String name = (String)pageContext.getAttribute("name"); //换了一个页面后就无法取得
注意:尽可能在满足功能的前提下,将属性设置的保存范围尽可能的小。这样能够提高性能;