三 JSP 内置对象

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 添加如下脚本:

<%
<jsp:forward page="HelloWorld.jsp">
<jsp:param value="<%= request %>" name="name"/>
<jsp:param value="<%= response %>" name="name1"/>
</jsp:forward> 
>%

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

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

打印如下:

index.jsp->request: org.apache.catalina.connector.RequestFacade@697c8eef
HelloWorld.jsp->request: org.apache.catalina.core.ApplicationHttpRequest@290537b1
index.jsp->response: org.apache.catalina.connector.ResponseFacade@6a717648
HelloWorld.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);
}
%>

<br>
number:  <%=session.getAttribute("number") %>
<br>

而后无论是不断刷新还是跳转到其他页面,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 进行调用:

<jsp:useBean id="test" class="main.Test"></jsp:useBean>
<% 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 中进行如下配置:

<servlet>
	<servlet-name>IndexServlet</servlet-name>
	<!-- <servlet-class>main.TestServlet</servlet-class> -->
	<jsp-file>/index.jsp</jsp-file>
	<init-param>
		<param-name>InitParamName</param-name>
		<param-value>InitParamValue</param-value>
	</init-param>
</servlet>

<servlet-mapping>
	<servlet-name>IndexServlet</servlet-name>
	<url-pattern>/index.jsp</url-pattern>
</servlet-mapping>

那么,在 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)

用来表示页面中的错误,详细可以参见 JSP 基本语法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值