博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三 JSP 内置对象
阅读量:4296 次
发布时间:2019-05-27

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

JSP 内置对象

request(java.servlet.http.HttpServletRequest)

request 对象是服务端创建的用来获取客户端通过 HTTP 协议连接传输到服务端的数据。

常用的为 String getParameter(String name) 方法,该方法可以获取客户端通过 form 表单、超链接以及 <jsp:param> 传递过来的参数。

方法 String[] gerParameterValues(String name) 则可以获取诸如复选框、下拉列表等可能有多值的参数。

当不确定客户端数据的编码方式时,可以使用 void setCharacterEncoding(String encode) 来设置 request 的编码方式,以获取格式正确的数据。

response(java.servlet.http.HttpServletResponse)

reponse 对象是服务器端用来响应客户端的对象,其可以使用 void setContentType(String type) 方法,设置要响应的数据属于何种类型,使用 void setHeader(String name, String value) 设置页面刷新频率等。

response 的 void sendRedirect(String redirectURL) 方法可以向客户端发送一个重定向的消息,旨在使客户端重新发起一个新的请求(地址栏会有相应的变化),并因此在服务端产生了一个新的 request 和 response 对象,这种重定向的方式称为客户端跳转。

而使用 <jsp:forward> 方式进行的跳转,是在服务器上进行的,客户端并没有感知,其地址栏不会发生变化。这种跳转类似 servlet 在满足条件时,执行了另一个代码分支,原 JSP 页面中跳转代码后的语句都不再执行。

在 index.jsp 添加如下脚本:

<%
>%

在 HelloWorld.jsp 中添加如下片段:

index.jsp->request: <%= request.getParameter("name") %>
HelloWorld.jsp->request: <%= request %>
index.jsp->response: <%= request.getParameter("name1") %>
HelloWorld.jsp->response: <%=response %>

打印如下:

index.jsp->request: org.apache.catalina.connector.RequestFacade@697c8eefHelloWorld.jsp->request: org.apache.catalina.core.ApplicationHttpRequest@290537b1index.jsp->response: org.apache.catalina.connector.ResponseFacade@6a717648HelloWorld.jsp->response: org.apache.catalina.connector.ResponseFacade@6a717648

并且,不断刷新 index.jsp 发现,HelloWorld.jsp->request 的值会不断变化,而其他值保持不变。即,在服务器跳转方式中,客户端和服务端并不会创建新的 request 或 response 对象,只是服务端内部进行请求的创建。

但是,使用 form 表单中的 action 属性进行 JSP 页面的跳转时,客户端和服务端都参与了跳转的任务,而跳转前后使用的是同一个 request 和 response 对象。

使用 void addCookie(Cookie cookie) 可以向客户端添加一个 cookie 信息,如此,下次用户再次访问时,便可以通过 request 的 Cookie[] getCookies() 方法获取该信息,从而可以为用户提供差异化的服务。

out(javax.servlet.jsp.JspWriter)

因为使用 out 向网页中输出内容时,需要同客户端进行连接,所以 JSP 默认有一个 8KB 的缓存区,并自动刷新缓存区中的数据,使其内容正常传输到客户端。

如果使用命令禁用自动刷新缓存区 <%@ page buffer="64kb" autoFlush="false" %> ,那么则需要在合适的时候使用 out.flush() 刷新缓存区,否则可能会产生溢出错误。

如果禁用缓存区 <%@ page buffer="none" autoFlush="true" %>,那么必须允许数据实时传输到客户端。

out 的 newLine()println() 方法的换行效果都会被浏览器忽略,所以还是使用 print("<br>") 实在。

缓存区中的内容并不局限于 print() 方法输出的内容,如 <title>title</title> 标签同样存储于缓存中,如果将 <%out.clearBuffer(); %> 放在 </html> 标签之后,那么如果之前的内容大小未超出缓存大小,且未主动刷新缓存区,那么客户端实际接收到的是一个空白的文档。

session(javax.servlet.http.HttpSession)

当用户向服务器请求一个网页后,服务器根据需要创建一个 session 对象,并将该对象唯一 ID 写入客户端的 Cookie 中,该用户该次连接中的所有请求共享这一个 session 对象,直到连接关闭或 session 对象超时失效。

session 主要用来存取用户本身共享的数据,主要使用的方法为 setAttribute(name,value)getAttribute(name)removeAttribute(name),并且可以使用 invalidate() 关闭 session,也可以使用 setMaxInactiveInterval(int interval) 设置最后一次请求 session 后间隔多久后该对象失效。

在 index.jsp 页面中插入如下代码:

<%!int number = 0;%><%if (session.isNew()) {	number++;	session.setAttribute("number", number);}%>
number: <%=session.getAttribute("number") %>

而后无论是不断刷新还是跳转到其他页面,number 的值始终为 1 ,当关闭浏览器,再次打开访问 index.jsp 页面时,该值才会增加,而打开多个不同的浏览器进行访问,该值同样是递增的。

可见,不同浏览器访问同一个 JSP 页面,会单独创建各自的 session 对象,而服务端的 JSP 页面中声明的 number 实际是 servlet 类实例对象的属性,它是被所有访问该 JSP 页面的用户所共享的。

如果重启服务器,刷新 index.jsp 页面,会发现 number 始终为 null ,这说明服务器并没有创建新的 session 对象,且清空上次连接产生的数据。如果将客户端的 Cookie 删除并禁用该地址的 Cookie ,并不断刷新 index.jsp 网页,发现 number 的值一直增长,说明服务端判断一个 session 是否是新创建(isNew())的根据是其是否被写到了客户端的 Cookie 中。

application(javax.servlet.ServletContext)

application 作为服务器中某项服务的全局对象,生命周期贯穿整个服务,所以其适合保存所有用户的共享数据。存取数据的方法同 session 对象一样,但是存储的数据作为 application 的属性,可以在所有页面被所有用户访问。而 session 中的属性只能被一个用户使用,所以对于局限于一个 JSP 页面中的所有用户共享的数据,是需要声明一个 JSP 的全局变量保存它的,即这个数据的持有者是 JSP 页面,而非每个存取它的用户 session 对象。

pageContext(javax.servlet.jsp.PageContext)

pageContext 是一个描述当前 JSP 页面的默认对象,除了能够获取当前页面的相关变量外,还提供了获取其他默认对象的方法。

如此,可以将该默认对象作为参数传递给相关的类方法,实现 JSP 到 java 代码的连接。

如创建一个 Test 类,如下:

public class Test {public void requestPara(PageContext pageContext) {		 String nameString = (String) pageContext.getAttribute("name");		 ServletContext applicatonContext  = pageContext.getServletContext();		 nameString = (String) applicatonContext.getAttribute("name");		 HttpSession session = pageContext.getSession();		 nameString =(String) session.getAttribute("name");	}}

而在 index.jsp 页面中,可以使用 JavaBean 进行调用:

<% pageContext.setAttribute("name", "page_name"); %><% session.setAttribute("name", "seesion_name"); %><% application.setAttribute("name", "application_name"); %><% test.requestPara(pageContext); %>

实际上,使用 JavaBean 声明的 test 对象同样是 pageContext 对象中的一个变量,可以通过 pageContext.getAttribute("test") 获取。

另外,也可以不使用 JavaBean 的方式声明 Test 类型的变量,如下

<%@ page import="main.Test" %><%Test test1 = new Test();test1.requestPara(pageContext); %>

只要导入 Test 类,就可以随意声明使用该类型了。

config(javax.servlet.ServletConfig)

使用 config 可以获取当前执行的 servlet 相关参数,如在 web.xml 中进行如下配置:

IndexServlet
/index.jsp
InitParamName
InitParamValue
IndexServlet
/index.jsp

那么,在 index.jsp 中可以通过相关方法,获取相关配置。

<%out.print("servletName: " + config.getServletName());out.print("InitParamName:" + config.getInitParameter("InitParamName"));%>

page(java.lang.Object)

page 类似 this 指向由 JSP 文件产生的类对象,实际就是一个 servlet 对象。

exception(java.lang.Throwable)

用来表示页面中的错误,详细可以参见。

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

你可能感兴趣的文章
Angular页面调用APP函数方法
查看>>
opencv环境配置
查看>>
C++读写二进制文件
查看>>
2015-7-7 小记
查看>>
meshlab编译问题小结
查看>>
CMake Error:Failed to find "glu32" in "" with CMAKE_CXX_LIBRARY_ARCHITECTURE "".
查看>>
异或的妙用
查看>>
libsvm3.2.1 - SVM多分类简单实现
查看>>
函数返回数组指针
查看>>
c++ time.h clock()程序计时
查看>>
C++ 二维数组sort排序
查看>>
函数中定义类
查看>>
回归分析
查看>>
Matlab实现遗传算法
查看>>
opencv配置
查看>>
rt-thread的内核对象管理深入解析
查看>>
LiteOS los_config.h说明
查看>>
从零开始学习FFT(快速傅里叶变换)
查看>>
Makefile教程
查看>>
arm-none-eabi交叉编译工具常用的一些指令
查看>>