上篇文章讲了JSP的9个内置对象的概念,下面详细说一下其中个几个内置对象,分别文response,request对象,config对象,session对象,page对象,out对象。
首先,先了解JSP和Servlet是怎么样传递数据的。
有4个方法,可以传递信息,其中就是其中的4个内置对象,分别是
1.application:对于整个Web应用有效 ,一旦JSP,Servlet将数据放入Application中,该数据将可以被该应用下其他所有的JSP,Servlet访问。 2.session:仅一次会话有效,一旦JSP,Servlet将数据放入session中,该数据将可以被本次会话的其他所有的JSP,Servlet访问。 3 . request: 仅对本次请求有效,一旦JSP,Servlet将数据放入Request中,该数据将可以被该次请求的其他JSP,Servlet访问。 4.page:仅对当前页面有效,一旦JSP,Servlet将数据放入Page中,该数据只可以被当前页面的JSP脚本,申明部分访问。
- 1. config对象: 代表当前JSP配置信息,但JSP页面通常无须配置,因此也就不存在配置信息。该对象在JSP页面中比较少用,但在Servlet中则用处相对较大,因此Servlet需要在web.xml文件中进行配置,可以指定配置参数。 - 2.out对象: out对象代表一个页面输出流,通常用于在页面上输出变量值及常量。一般在使用输出表达式的地方,都可以使用out对象来达到相同效果。 下面看一个例子:
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%@ page import="java.sql.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> out测试 </title> <meta name="website" content="http://www.crazyit.org" /> </head> <body> <% //注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据库连接 Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/javaee","root","32147"); //创建Statement对象 Statement stmt = conn.createStatement(); //执行查询,获取ResultSet对象 ResultSet rs = stmt.executeQuery("select * from news_inf"); %> <table bgcolor="#9999dd" border="1" width="400"> <% //遍历结果集 while(rs.next()) { //输出表格行 out.println("<tr>"); //输出表格列 out.println("<td>"); //输出结果集的第二列的值 out.println(rs.getString(1)); //关闭表格列 out.println("</td>"); //开始表格列 out.println("<td>"); //输出结果集的第三列的值 out.println(rs.getString(2)); //关闭表格列 out.println("</td>"); //关闭表格行 out.println("</tr>"); } %> <table> </body> </html>从Java语法上看,上面的程序更容易理解,out是个页面输出流,负责输出整个页面表格及所有内容,但使用out则需要编写更多代码。
3.pageContext对象 这个对象代表页面上下文,该对象主要用于访问JSP之间的共享数据。使用pageContext可以访问page,request,session,appliation范围内的变量。 pageContext是PageContext类的实例,它提供了下面两个方法来访问page,request,session,application范围的变量。 > getAttribute(String name): 取得page范围内的name属性。 > getAttribute(String name. int scope): 取得指定范围内的name属性,其中scope可以是如下4个值: 1.PageContext.PAGE_SCOPE:对应与page范围 2.PageContext.REQUEST_SCOPE:对用于request范围 3.PageContext.SESSION_SCOPE:对应于session范围 4.PageContext.APPLICATION_SCOPE:对应于application范围
x下面的JSP页面示范了使用PageContext来操作Page,Request,session,application范围内的变量。
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> pageContext测试 </title> <meta name="website" content="http://www.crazyit.org" /> </head> <body> <% //使用pageContext设置属性,该属性默认在page范围内 pageContext.setAttribute("page","hello"); //使用request设置属性,该属性默认在request范围内 request.setAttribute("request","hello"); //使用pageContext将属性设置在request范围中 pageContext.setAttribute("request2","hello" , pageContext.REQUEST_SCOPE); //使用session将属性设置在session范围中 session.setAttribute("session","hello"); //使用pageContext将属性设置在session范围中 pageContext.setAttribute("session2","hello" , pageContext.SESSION_SCOPE); //使用application将属性设置在application范围中 application.setAttribute("app","hello"); //使用pageContext将属性设置在application范围中 pageContext.setAttribute("app2","hello" , pageContext.APPLICATION_SCOPE); //下面获取各属性所在的范围: out.println("page变量所在范围:" + pageContext.getAttributesScope("page") + "<br/>"); out.println("request变量所在范围:" + pageContext.getAttributesScope("request") + "<br/>"); out.println("request2变量所在范围:"+ pageContext.getAttributesScope("request2") + "<br/>"); out.println("session变量所在范围:" + pageContext.getAttributesScope("session") + "<br/>"); out.println("session2变量所在范围:" + pageContext.getAttributesScope("session2") + "<br/>"); out.println("app变量所在范围:" + pageContext.getAttributesScope("app") + "<br/>"); out.println("app2变量所在范围:" + pageContext.getAttributesScope("app2") + "<br/>"); %> </body> </html>s使用pageContext获取各属性所在的范围,其中这些范围获取的都是整型变量,这些整型变量分别对应如下4个生存范围。 1:对应page生存范围 2:对应request生存范围 3:对应session生存范围 4:对应application生存范围
不仅如此pageContext还可以用于获取其他内置对象,pageContext对象包含如下方法。 1.ServletRequest getRequest():获取requset对象 2.ServletResponse getResponse(): 获取reponse对象 3.ServletConfig getServletConfig(): 获取config对象 4. ServletContext getServletContext(): 获取application对象 5. HttpSession getSession(): 获取session对象 一旦在JSP,Servlet编程中获取了PageContext对象,就可以通过它提供的上面方法来获取其内置对象。
4. request对象
request对象是JSP中重要的对象,每个request对象封装一次用户请求,而且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。 c除此之外,request可代表本次请求范围,所以还可用于操作request范围的属性。 1.获取请求的表头/请求参数 Web应用是请求/响应架构的应用,浏览器发送请求时通常总会附带一些请求头,还可能包含一些请求参数发送到服务器,服务器端负责解析请求头/请求参数的就是JSP或/Servlet,而JSP和Servlet取得请求参数的途径就是request。request是HttpServletReques接口的实例,它提供了如下几个方法来获取请求参数。 String getParameter(String paramName): 获取paramName请求参数的值。 Map getParamererMap():获取所有请求参数名和参数值所组成的Map对象 Enumeration getParameterNames(): 获取所有请求参数名所组成的Enumeration对象 String[] getParameterNames(String name): paramName请求参数的值,当该请求参数有多个值时,该方法返回多个值所返回的数组。 String getHeader(String name): 根据指定请求头的值 java.util.Enumeration getHeaderNames(): 获取所有请求头的多个值 java.util.Enumeration getHeaders(String name): 获取指定请求头的多个值 int getIntHeader(String name): 获取指定请求头的值,并将该值转为整数值
客户端发送请求参数通常分为两种情况: [点这里,GET和POST的对比](http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
request还可以执行forward和include,和之前JSP提供的动作指令功能相同,感兴趣的可以自己搜一下关键字,”request 跳转”
5.* reponse对象* reponse代表服务器对客户端的响应,大部分时候,程序不用使用reponse来响应客户端请求,因为有个更简单的响应对象--out,它代表页面输出流,直接使用out生成响应更简单。
但是out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流,无法输出非字符内容。假如需要在Jsp页面中动态生成一幅位图,或者输出一个PDF文档,使用out作为响应对象将无法完成,这时候必须使用response作为响应输出。 除此之外,还可以使用response来重定向请求,以及用于向客户端增加Cookie. (1).response响应生成非字符响应 看一个例子:
<%-- 通过contentType属性指定响应数据是图片 --%> <%@ page contentType="image/jpeg" language="java"%> <%@ page import="java.awt.image.*,javax.imageio.*,java.io.*,java.awt.*"%> <% //创建BufferedImage对象 BufferedImage image = new BufferedImage(340 , 160, BufferedImage.TYPE_INT_RGB); //以Image对象获取Graphics对象 Graphics g = image.getGraphics(); //使用Graphics画图,所画的图像将会出现在image对象中 g.fillRect(0,0,400,400); //设置颜色:红 g.setColor(new Color(255,0,0)); //画出一段弧 g.fillArc(20, 20, 100,100, 30, 120); //设置颜色:绿 g.setColor(new Color(0 , 255, 0)); //画出一段弧 g.fillArc(20, 20, 100,100, 150, 120); //设置颜色:蓝 g.setColor(new Color(0 , 0, 255)); //画出一段弧 g.fillArc(20, 20, 100,100, 270, 120); //设置颜色:黑 g.setColor(new Color(0,0,0)); g.setFont(new Font("Arial Black", Font.PLAIN, 16)); //画出三个字符串 g.drawString("red:climb" , 200 , 60); g.drawString("green:swim" , 200 , 100); g.drawString("blue:jump" , 200 , 140); g.dispose(); //将图像输出到页面的响应 ImageIO.write(image , "jpg" , response.getOutputStream()); %>也可以在其他界面中使用img标签来显示这个图片页面,代码如下:<img src ="img.jsp">
s使用这种临时生成图片的方式可以非常容易的实现网页上的图片验证功能。不仅如此,使用response生成非字符响应还可以直接生成PDF文件,Excel文件,这些文件可直接作为报表使用。 (2).重定向 与forward不同,重定向会丢失所有的请求参数和request范围内的属性,因为重定向将生成第二次请求,与前一次请求不在同一个request范围内,所有发送一次请求的请求参数和request范围的属性全部丢失。 HttpServletResponse提供了一个sendRedirect(String path)方法,该方法用于重定向到path资源,即重新向path资源发送请求。 看一个例子:
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <% //生成页面响应 out.println("===="); //重定向到forward-result.jsp页面 response.sendRedirect("redirect-result.jsp"); %>当该页面发送请求时,请求会被重定向到redirect-result.jsp页面。例如,在地址栏输入http://localhost:8080/jspObject/doRedirect.jsp?name=zyh,然后按回车键。你会看到,地址栏的URL会重定向的目标URL。
forward和redirect还是有区别的: (3).增加Cookie 看一个例子:
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> 增加Cookie </title> <meta name="website" content="http://www.crazyit.org" /> </head> <body> <% //获取请求参数 String name = request.getParameter("name"); //以获取到的请求参数为值,创建一个Cookie对象 Cookie c = new Cookie("username" , name); //设置Cookie对象的生存期限 c.setMaxAge(24 * 3600); //向客户端增加Cookie对象 response.addCookie(c); %> </body> </html>使用cookie对象时必须设置其生存期限,否则将会随浏览器的关闭而自动消失。
5.session对象 点这里 a考虑到session本省的目的,通常只应该把与用户回话状态相关的信息放入session范围内,,不要仅仅为了两个页面之间交换信息,就将该信息放入session范围内。如果仅仅为了两个页面交换信息,可以将该信息放入request范围内,然后forward。
