博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
六、JSP中的9个内置对象
阅读量:4073 次
发布时间:2019-05-25

本文共 8915 字,大约阅读时间需要 29 分钟。

Servlet中,request、response两个对象是_jspService()方法的形参,当Tomcat调用该方法时会初始化这两个对象。而page、pageContext、application、config、session、out都是_jspService()方法的局部变量,由该方法完成初始化,只有当页面的page指令的isErrorPage属性为true时,才可以使用exception对象。

由于JSP内置对象都是在_jspService()方法中完成初始化的,因此只能在JSP脚本,JSP输出表达式中使用这些内置对象,千万不要在JSP声明中使用它们,否则,系统将提示找不到这些变量。

服务器对客服端请求的处理:

- 启动单独的线程。
- 使用I/O流读取用户请求的二进制流数据。
- 从请求数据中解析参数。
- 生成响应数据。
- 使用IO流向客户端发送请求数据。

WEB提供的4个类似Map结构:

- appliction:对整个Web应用有效,一旦JSP、Servlet将数据放入application中,该数据可以被整个引用中的JSP,Servlet访问。
- session:仅对一次会话有效,一旦JSP、Servlet将数据放入session中,该数据可以被本次会话中的JSP,Servlet访问。
- request:仅对本次请求有效,一旦JSP、Servlet将数据放入request中,该数据可以被该次请求中的JSP,Servlet访问。
- page:仅对当前页面有效,一旦JSP、Servlet将数据放入page中,该数据只可以被当前页面的JSP脚本,声明部分访问。

JSP中的application、session、request和pageContext4个内置对象分别用于操作application、session、request和page范围内的数据。

6.1application对象

application的两个作用:

- 在整个Web应用中的多个JSP、Servlet之间共享数据。
- 访问Web应用的配置参数。

让多个JSP、Servlet共享数据
  • getAttribute(String attName)
  • setAttribute(String attName,String attValue)
  • getInitParameter(String paramName)
<%!int i;%>
<%application.setAttribute("counter","String.valueOf(++i);")%>
<%=i%>
<%=application.getAttribute("counter")%>

application不仅用于两个JSP页面间共享数据,还可以用于JSP和Servlet之间共享数据。

Servlet中访问appliction里的变量:

ServletContext sc=getServletConfig().getServletContext();out.println(sc.getAttribute("counter"));

每个Web应用中只有一个ServletContext实例,在JSP中可以通过application内置对象访问该实例,而Servlet中则必须通过代码获取,由于application代表整个Web应用,所以通常只应该吧WEB应用的状态数据放入application里。

获得Web应用配置参数

application可用于获取Web应用的配置参数

<%//从配置参数中获取驱动String driver=application.getInitParameter("driver");//从配置参数中获取数据库urlString url=application.getInitParameter("url");//从配置参数中获取用户名String user=application.getInitParameter("user");//从配置参数中获取密码String pass=application.getInitParameter("pass");//注册驱动Class.forName(driver);//获取数据库连接Connection conn=DriverManager.getConnection(url,user,pass);//创建Statement对象Statement stmt=conn.createStatement();//执行查询ResultSet rs=stmt.executeQuery("select * from news_inf");%>
<%//遍历结果集while(rs.next()){%>
<%}%>
<%=rs.getString(1)%> <%=rs.getString(2)%>

application的getInitParameter(String paramName)来获取WEB应用的配置参数,这些配置参数应该在web.xml文件使用context-patam元素配置。

- param-name:配置Web参数名。
- param-value:配置Web参数值。
web.xml

driver
com.mysql.jdbc.Driver

6.2config对象

config对象代表当前JSP配置信息,一般JSP页面比较少用该对象。Servlet用处相对较多,因为Servlet需要在web.xml文件中进行配置,可以知道配置参数。

JSP页面中:

  
<%=config.getServletName()%>

config对象是ServletConfig的实例,该接口用于获取配置参数的方法是getInitParameter(String paramName)

  
name配置参数的值:<%=config.getInitParameter("name")%>
age配置参数的值:<%=config.getInitParameter("age")%>

JSP页面配置在WEB应用中:

config
/configTest2.jsp
name
zhangsan
age
18
config
/config

如果希望JSP页面可以获取web.xml配置文件中的配置信息,则必须通过该JSP配置路径来访问该页面,因为只有这样访问JSP页面才会让配置参数起作用。

6.3exception对象

exception对象是Throwable的实例,代表JSP中产生的错误和异常,是JSP页面异常机制的一部分。-jspx_page_context对异常的处理非常简单:如果页面的page指令指定了errorPage属性,则请求forward到errorPage属性指定的页面,否则使用系统页面来输出异常信息。由于只有JSP脚本、输出表达式才会对应于_jspService()方法里的代码,所以两个部分的代码无需处理checked异常。但JSP的声明部分依然需要处理checked异常,JSP的异常处理机制对JSP声明不起作用。

page异常

<%@ page contextType="text/html";charset="utf-8" language="java" errorPage="error.jsp"%>......<%int a=6;int c=a/0;%>......
<%@ page contextType="text/html";charset="utf-8" language="java" isErrorPage="true"%>......异常类型是:<%=exception.getClass()%>
异常信息是:<%=exception.getMessage()%>
......

JSP页面page指定的isErrorPage为true时,该页面就会提供application内置对象。

6.4out对象

out对象代表一个页面输出流,通常用于在页面上输出变量值和常量。

out.println("
");out.println("
");out.println("
");out.println("
");out.println("
");out.println("
");

<%=…%>表达式的本质就是out.write(…);

6.5pageContext对象

这个对象代表页面上下文,该对象主要用于访问JSP之间的共享数据,使用pageContext可以访问page、request、session、application范围的变量。

pageContext是pageContext类的实例,它提供了如下两个方法来访问page、request、session、application范围的变量。

- getAttribute(String name):取得page范围内的name属性。
- getAttribute(String name,int scope):取得指定范围内的name属性,其中scope可以如下4个值。
1.PageContext.PAGE_SCOPE
2.PageContext.REQUEST_SCOPE
3.PageContext.SESSION_SCOPE
4.PageContext.APPLICATION_SCOPE

与PageContext也提供了两个对应的setAttribute()方法,用于将指定变量放入page、request、session、application范围内。

例:

<%pageContext.setAttribute("name","hello");out.println(pageContext.getAttribute("name"));%>

pageContext还可用于获取其他内置对象:

- ServletRequest getRequest():获取request对象。
- ServletResponse getResponse():获取response对象。
- ServletConfig getConfig():获取config对象。
- ServletContext getServletContext():获取application对象。
- ServletSession getSession():获取session对象。

6.6request对象

获取请求头/请求参数

每个request对象封装着一次用户请求,并且所有的请求参数都封装在request对象中,request是HttpServletRequest接口的实例。

获取请求参数的方法:
- String getParameter(String paramName):获取paramName请求参数的值。
- Map getParameterMap():获取所有参数名和参数值组成的Map对象。
- Enumeration getParameterNames():获取所有参数名所组成的Enumeration对象。
- String[] getParameterValues(String name):paramName请求参数的值,当请求参数有多个值时,返回多个值所组成的数组。

HttpServletRequest获取请求头的方法:

- String getHeader(String name):获取指定请求头的值。
- java.util.Enumeration getHeaderNames():获取所有请求头的值。
- java.util.Enumeration getHeaders(String name):获取指定请求头的多个值。
- int getIntHeader(String name):获取指定请求头的值,并将该值转为整数。

客户端发送请求参数两种情况:

- GET方式的请求。
- POST方式的请求。

form.jsp:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>     手机参数的表单页   
用户名:

性别:
男:
女:
喜欢的颜色:
红:
绿:
蓝:

来自的国家:

表单域和请求参数的关系:

- 每个有name属性的表单域对应一个请求参数。
- 如果多个表单域有相同的name属性,则多个表单域只生成一个值,只是该参数有多个值。
- 表单域的name属性指定参数名,value指定请求参数值。
- 如果每个表单域设置了disabled=”disabled”属性,则该表单域不再生成请求参数。

request1.jsp:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=GBK" %>     获取请求头/请求参数<%//获取所有请求头的名称Enumeration
headerNames=request.getHeaderNames();while(headerNames.hasMoreElements()){ String headerName=headerNames.nextElement(); //获取每个请求 out.println(headerName+"--->"+request.getHeader(headerName)+"
");}out.println("

");//设置编码方式,对于简体中文,使用GBK编码。request.setCharacterEncoding("GBK");//获取表单域的值String name=request.getParameter("name");String gender=request.getParameter("gender");//如果每个请求参数有多个值,将使用该方法获取多个值。String[] color=request.getParameterValues("color");String national=request.getParameter("country");%>
你的名字:<%=name%>

您的性别:<%=gender%>

您喜欢的颜色:<%for(String c:color){ out.println(c+" ");}%>

你来自的国家:<%=national%>

重编码:

//获取原始的请求参数值String rawName= request.getParameter("name");//将请求参数值使用"ISO-8859-1"字符串分解成字节数组byte[] rawBytes=rawName.getBytes("ISO-8859-1");//将字节数组重新解码成字符串String name=new String("rawBytes","UTF-8");

操作request范围的属性

HttpServletRequest包含两个方法,用于设置和获取request范围的属性:

- setAttribute(String attName,Object attValue):将attValue设置成request范围的属性。
- Object getAttribute(String attName):获取request范围的属性。

当forward用户请求时,请求的参数和请求的属性都不会丢失。

执行forward或include

HttpServletRequest类提供了一个getRequestDispatcher(String path)方法,其中path就是forward或者include的目标路径,该方法返回RequestDispatcher:

- forward(ServletRequest request,ServletResponse response):执行forward。
- include(ServletRequest request,ServletResponse response):执行include。

将a.jsp页面include到本页面中:

getRequestDispatcher("/a.jsp").include(request,reponse);

将a.jsp页面forward到本页面中:

getRequestDispatcher("/a.jsp").forward(request,reponse);

6.7response对象

response响应生成非字符串响应

需要生成非字符响应的情况,应该使用response来响应客服端的请求,response是HttpServletResponse接口的实例,该接口提供了一个getOutputStream(),该方法返回响应输出字符流。

重定向

**response重定向与forward不同的是,重定向会丢失所有的请求参数和request范围的属性,因为重定向将生成第二次请求。

HttpServletResponse提供了sedRedirect(String path)方法,path指向重定向的资源文件。

<%response.sedRedirect("redirect-result.jsp");%>

增加Cookie

Cookie通常用于网站记录客户的某些信息,比如客户的用户名及客户的喜好等。session会随浏览器的关闭而失效,但Cookie会一直存放在客户端机器上,除非超出Cookie的生命期限。

增加Cookie也是使用response内置对象完成的
- void addCookie(Cookie cookie):增加Cookie。

增加Cookie的步骤:

- 创建Cookie实例,Cookie的构造器为Cookie(String name,String value)。
- 设置Cookie的生命期限,即Cookie在多长时间内有效。
- 向客户端写Cookie。

<%Cookie c=new Cookie("username",name);c.setMaxAge(24*3600);response.addCookie(c);%>

访问客户端Cookie使用request对象,request提供getCookies()方法。

<%Cookie[] cookies=request.getCookies();for(Cookie c:cookies){    if(c.getName().equals("username"))     {        out.println(c.getValue());     }}%>

使用Cookie对象时必须设置器生存周期,否则Cookie会随浏览器的关闭而关闭。

Cookie值不允许出现中文字符,如果需要中文内容的Cookie,需要借助于URLEncoder对中文字符串进行编码,然后使用ERLDecoder对其进行解码。

session对象

session对象代表依次用户会话,一次会话的含义是:客户端连接服务器到与客服端断开为止。

session内的属性可以在多个页面的跳转之间共享。
session对象是HttpSession的实例,HttpSession有如下两个方法:
- setAttribute(String attName,Object attValue):设置session范围内attName属性的值为attValue。
- getAttribute(String attName):返回session范围内attName属性的值。

通常只应该把与用户会话状态有关的信息放入session范围内,如果仅为了两个页面的信息交换,可以将信息放入request范围内,然后forward请求即可。

session机制通常用于保存客户端的状态信息,这些状态信息需要保存到服务器硬盘上,所以要求session里的属性值必须是可以序列化的,否则将引发不可序列化的异常,session的属性可以是任何可以序列化的Java对象。

转载地址:http://jfkni.baihongyu.com/

你可能感兴趣的文章
vu 是什么
查看>>
io口的作用
查看>>
IO口的作用
查看>>
UIView的使用setNeedsDisplay
查看>>
归档与解归档
查看>>
Window
查看>>
为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
查看>>
字符串的截取
查看>>
2. Add Two Numbers
查看>>
17. Letter Combinations of a Phone Number (DFS, String)
查看>>
93. Restore IP Addresses (DFS, String)
查看>>
19. Remove Nth Node From End of List (双指针)
查看>>
49. Group Anagrams (String, Map)
查看>>
139. Word Break (DP)
查看>>
Tensorflow入门资料
查看>>
剑指_用两个栈实现队列
查看>>
剑指_顺时针打印矩阵
查看>>
剑指_栈的压入弹出序列
查看>>
剑指_复杂链表的复制
查看>>
服务器普通用户(非管理员账户)在自己目录下安装TensorFlow
查看>>