Java EE入门教程系列第二章JSP(四)——内置对象

2.4 内置对象

2.4.1 常用的内置对象

在JSP页面中已经预先定义好了9个内置对象,可以在Web应用中直接使用。内置对象的构建基于HTTP协议,所以它们可以完成收集浏览器请求发出的信息、响应浏览器请求以及存储客户信息等工作,极大简化了Web开发工作。

JSP内置列表如下图所示:

1.request对象

request对象是javax.servlet.http.HttpServletRequest的实例,包含所有请求的信息,如请求的来源、标头、Cookies和请求相关的参数值等。该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装信息,也就是使用该对象可以获取用户提交的信息。

request对象可以请求有效的属性操作;获取HTT Header信息;获取HTTP请求参数,一般是HTML表单提交的参数信息;获取服务器端相关信息,包括服务器的名称、地址和端口等;获取协议版本。

常用的方法如下表:

1)获取用户输入信息

使用getParameter(String s)方法可以获取表单所提交的信息,括号里代表参数名。

举例:在jsprequest.jsp输入信息,提交给show.jsp并显示刚才输入的信息

jsprequest.jsp

<%@ 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>request的getParameter方法</title>
</head>
<body>
<form action="show.jsp" method="post" name="form">
姓名:<input type="text" name="name"><p>
性别:<input type="text" name="sex"><p>
年龄:<input type="text" name="age"><p>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>

show.jsp

<%@ 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>
</head>
<body>
<%--在这里设定request得到的参数的字符编码 ,否则会出现中文乱码 --%>
<%request.setCharacterEncoding("UTF-8"); %>
得到输入的用户信息:<p>
姓名:<%=request.getParameter("name") %><p>
性别:<%=request.getParameter("sex") %><p>
年龄:<%=request.getParameter("age") %><p>
获取按钮标记名:<%=request.getParameter("submit") %>
</body>
</html>

结果截图:

 

 

2)获取客户端、服务器等的相关信息

举例:getinfo.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <%@ page import="java.util.*" %>
   
<!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>
</head>
<body>
<br>用户使用的协议是:
<%= request.getProtocol() %>
<br>获取接受客户提交信息的页面:
<%= request.getServletPath() %>
<br>接受客户提交信息的长度:
<%= request.getContentLength() %>
<br>客户提交信息的方式:
<%= request.getMethod() %>
<br>获取HTTP头文件中User-Agent的值:
<%= request.getHeader("User-Agent") %>
<br>获取HTTP头文件中Host的值:
<%= request.getHeader("Host") %>
<br>获取HTTP头文件中accept-encoding的值:
<%= request.getHeader("accept-encoding") %>
<br>获取客户的IP地址:
<%= request.getRemoteAddr() %>
<br>获取客户机的名称:
<%= request.getRemoteHost() %>
<br>获取服务器的名称:
<%= request.getServerName() %>
<br>获取服务器的端口号:
<%= request.getServerPort() %>
</body>
</html>

结果为:

2.reponse对象

代表服务器对客户端的响应,通常我们要实现这种功能时更多选择out——页面输出流,直接使用out生成响应更简单。但是out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流,无法输出非字符内容,比如我们需要在JSP页面动态生成位图时,就只能使用response。

response对象可以对HTTP Header信息进行处理;设置数据内容的类型和长度;获取输出流;进行本地化操作;缓冲控制;浏览器重定向;响应状态控制;向浏览器发送Cookie。

常用方法如下:

1)根据contentType属性动态响应

页面内容不仅仅有HTML格式,也可能是Word、Excel等,这就需要用到response的setCcontentType(String s)方法改变属性值来完成,s可以取text/html(标准HTML文件)、application/x-msexcel(Excel文件)、application/x-msword(Word文件)、text/plain(纯文本文件)等格式。

举例:将页面内容指定为Word格式

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <%@ page import="java.util.*" %>
   
<!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="application/maword; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

2)自动刷新页面

使用response对象的setHeader()方法,语句格式为:

response.setIntHeader("Refresh",等待刷新时间);

也可以设置浏览器加载新页面:

response("Refresh",等待刷新时间,URL=要加载新页面的路径);

举例:每隔5秒自动刷新页面,获取当前时间

response.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <%@ page import="java.util.*" %>
   
<!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>
</head>
<body>
当前时间:
<%
response.setHeader("Refresh","5");
out.println(new java.util.Date());
%>
</body>
</html>

截图:

3)response重定向

使用sendRedirect(URL)方法可以实现重定向,URL不仅可以访问本服务器的资源,也可以访问其他服务器的资源。

举例:Redirect.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <%@ page import="java.util.*" %>
   
<!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>
</head>
<body>
<%
String address=request.getParameter("position");
if(address!=null){
	if(address.equals("CSDN"))
		response.sendRedirect("http://www.csdn.net");
	else if(address.equals("MS"))
		response.sendRedirect("http://www.microsoft.com");
	else if(address.equals("IBM"))
		response.sendRedirect("http://www.ibm.com");
}
%>

<b>请选择要定位的路径</b><br>
<form action="Redirect.jsp" name="form" method="post">
<select name="position">
<option value="CSDN" selected>to CSDN
<option value="MS" >to MS
<option value="IBM" >to IBM
</select>
<input type="submit" value="提交" name="submit">
</form>
</body>
</html>

3.out对象

out是向客户端输出的PrinterWriter对象,带有缓冲特性。缓冲区容量可以通过page指令的buffer属性设置或者关闭。out对象主要方法为:

举例:使用out对象输出一个HTML表格(这个好像教材又有小错误,以后我觉得教材有错的就不贴教材的代码了~~~照书上代码敲出来运行不正确抓狂呀-> ->)

out.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <%@ page import="java.util.*" %>
   
<!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>
</head>
<body>
<%
int BufferSize=out.getBufferSize();
int Available=out.getRemaining();
%>
<%
String[] str=new String[5];
str[0]="out";
str[1]="输出";
out.println("<html>");
out.println("<head>");
out.println("<title>使用out输出表格</title>");
out.println("</head>");
out.println("<body>");
out.println("<table cellspacing=1 bgcolor=pink border=1 width=200>");
out.println("<tr>");
out.println("<td align=center>数组序列</td>");
out.println("<td align=center>数组值</td>");
out.println("</tr>");
out.println("<html>");
for(int i=0;i<2;i++)
{
	out.println("<tr>");
	out.println("<td>str["+i+"]</td>");
	out.println("<td>"+str[i]+"</td");
	out.println("</tr>");
}
out.println("<tr>");
out.println("<td>BufferSize:</td>");
out.println("<td>"+BufferSize+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>Available:</td>");
out.println("<td>"+Available+"</td>");
out.println("</tr>");
out.println("</table>");
out.println("</body>");
out.println("</html>");
%>
</body>
</html>

截图:

4.session对象

在有些应用中,服务器需要不断识别是从哪个客户端发来的请求,比如淘宝购物车,要保证以前用户选择的商品不丢失,还要保证用户可以添加新商品到自己的购物车而不是别人的,就需要session发挥作用。

session用于指在一段特定时间内,某用户与Web服务器的一系列交互过程。当一个用户登录网站后,服务器就为该用户创建一个session对象,一般是由系统默认创建的,大多数情况下默认打开状态。

session对象主要方法:

举例:session.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <%@ page import="java.util.*" %>
   
<!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>
</head>
<body>
<h3>会话标识Sessionid:<%= session.getId() %></h3>
<p>建立时间Created time<%= new Date(session.getCreationTime()) %>
<P>原设置一次会话持续的时间:<%= session.getMaxInactiveInterval() %>
<p>最近访问的时间:<%= new Date(session.getLastAccessedTime()) %>
<p>是否是新一次的会话:<%= session.isNew() %>
<p>设置会话共享的属性"content"="session example":<% session.setAttribute("content", "session example"); %>
<P>显示原会话共享的属性:<%= session.getAttribute("content") %>
<P>设置会话新的持续时间:<% session.setMaxInactiveInterval(10); %>
</body>
</html>

截图:

5.application对象

application对象在服务器启动时就产生了,当一个客户访问服务器上一个JSP页面时,JSP引擎就为该用户分配这个对象,当用户在所访问的网站的各个页面之间进行浏览时,这个application对象都是同一个,知道服务器关闭,对象才被取消,这是和session对象相同的部分,不同的是所有客户的application对象都是同一个,而session对象是每个用户拥有单独的一个。由于这种特点,application对象经常用于记录所有客户端公用的一些数据,如页面访问次数。

主要方法有:

举例:application.jsp 页面访问量计数器

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <%@ page import="java.util.*" %>
   
<!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>
</head>
<body>
<%
if(application.getAttribute("count")==null){
	application.setAttribute("count","1");
	out.println("欢迎,您是第1位访客!");
	
}
else{
	int i=Integer.parseInt((String)application.getAttribute("count"));
	i++;
	application.setAttribute("count",String.valueOf(i));
	out.println("欢迎,您是第"+i+"位访客!");
}
%>
</body>
</html>

动手试一下,你会发现即使将页面重新关闭再打开,或者从不同客户端浏览器打开该网页,计数器仍然有效,直到重启服务器位置。

注:有些服务器不支持直接使用application对象,必须用ServletContext类声明这个对象,再使用getServletContext()方法对对象进行初始化。

6、exception对象

这个对象是用来进行异常处理的,要使用它,必须在page命令中设定<%@ page isErrorPage="true" %>。

主要方法有:

当JSP引擎在执行过程中发生错误就会自动产生一个异常对象,如果这个页面指定了另一个页面为错误处理程序,那么该引擎会将这个异常对象放到request对象中,传到错误处理程序。由于isErrorPage设置为true,JSP引擎自动生成exception对象,这个对象会从request对象包含的HTTP参数中获得。

举例:

exceptionsource.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <%@ page import="java.util.*" %>
   <%@ page errorPage="exceptionShow.jsp" %>
   <%
String result=" ";
   String action=request.getParameter("action");
		   
	   if(action!=null){
	   
int n=new Integer(request.getParameter("number")).intValue();
result=String.valueOf(100/n);
	   }

%>
<!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>
</head>
<body>

<form name="exception" method="post" action="exceptionsource.jsp?action=submit">
请输入一个数:<input type="text" name="number" value="">
<input type="submit" value="提交">
<br>100除以该数得:<%= result %>
</form>
</body>
</html>

exceptionShow.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
  <%@ page isErrorPage="true" %>
<!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></title>
</head>
<body>
这里是错误信息页面:
<%
out.println("exception.toString():");
out.println("<br>");
out.println(exception.toString());
out.println("exception.getMessaage():");
out.println("<br>");
out.println(exception.getMessage());
%>
</body>
</html>

截图:

7、pageContext对象

用于存储JSP页面相关信息,提供了存取所有JSP程序执行时所要用到的方法和属性,主要方法为:

举例:pageContext.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.util.Enumeration" %>
  <%@ page isErrorPage="true" %>
<!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></title>
</head>
<body>
<%
Enumeration enums=pageContext.getAttributeNamesInScope(PageContext.APPLICATION_SCOPE);
while(enums.hasMoreElements()){
	out.println("application scope attributes:"+enums.nextElement()+"<br>");
}
%>
</body>
</html>

截图:

2.4.2 内置对象作用范围

是指每个内置对象的某个实例在多长时间和多大范围内有效。JSP定义了4种作用范围,代表了对象各自的生命周期。

1、Application Scope

2、Session Scope

3、Request Scope

4、Page Scope

需要注意的是,指定属性名称的参数类型为String,而返回的属性值为java.lang.Object。因此,如果需要其他类型的属性值,需要进一步转换。

猜你喜欢

转载自blog.csdn.net/qq_40996041/article/details/84061440