JSP的内置对象是指在JSP页面系统中已经默认内置的Java对象,不需要显式声明
1.jsp的9个内置对象
内置对象名 | 对象说明 | 作用域 |
request | 请求对象 | Request |
response | 响应对象 | Page |
session | 会话对象 | Session |
application | 应用程序对象 | Application |
page | 页面对象 | Page |
out | 输出对象 | Page |
config | 配置对象 | Page |
exception | 例外对象 | Page |
pageContext | 页面上下文对象 | Page |
2.JSP的4个域对象
①pageContext,如果把变量放在pageContext里,就说明它的作用域是page,有效范围只在当前jsp页面中
②request,该对象中的数据的生命周期是一次请求的时间
③session,该对象中的数据的生命周期较长
④application,该对象中的数据的生命周期最长,从应用启动到应用结束。
现在,有两个客户分别通过各自的浏览器IE_1和IE_2访问服务器
服务器启动时,会自动在内存中创建一个apllication对象,为整个应用所共享,该对象一直存在,直到服务器关闭。
当用户首次访问JSP页面时,服务器会自动创建一个session对象,并为该session对象分配一个ID,同时将该sessionID号返回给客户,保存在客户机Cookies中。
客户在随后的访问中,浏览器会将该sessionID随请求一起带给服务器,服务器根据这个ID找到之前为该客户创建的session对象。
用户断开退出服务器时,session对象失效。有些服务器出于安全性考虑,如果超过一定的时间限制,session会自动失效。
当用户每次访问某个JSP页面时,服务器会为该请求创建一个请求对象request,用于存放这次访问的所有请求信息。
所以,需要根据需求合理使用这几个对象
例如,涉及全局的网站访问次数就应该由application对象来管理
用户名等涉及多个页面的用户个人信息应由session对象管理
只涉及到一次请求过程需要的信息用request对象管理
3.http协议是无状态的
协议对事务处理没有记忆能力
无状态意味着如果后续处理需要前面的信息,它必须重传。
JSP中是通过session对象来解决http应用程序的状态需求的。
4.out对象
out对象是javax.servlet.jsp.JspWriter类的实例,主要作用是用来向客户端输出内容,同时管理应用服务器输出缓冲区。
out对象有两个方法用于输出数据:print和println,该对象可以输出任何合法的Java表达式。
利用out对象在浏览器中输出服务器的系统时间
out.jsp
<%@ page language="java" import="java.util.*,java.text.SimpleDateFormat" pageEncoding="gbk"%>
<html>
<head></head>
<body>
<%SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
out.print("原始日期:"+date);
String str1 = sdf.format(date);
out.print("<br>格式化日期:"+str1);
sdf.applyPattern("yyyy年MM月dd日");
String str2 = sdf.format(date);
out.print("<br>另一格式的日期:"+str2);
%>
</body>
</html>
5.page对象
page对象代表JSP页面本身,或者说它代表了被转换后的Servlet
在JSP页面中,this关键字表示当前JSP页面这个对象。因此它可以调动任何被Servlet类所定义的方法。
page对象的基类是java.lang.Object类,可通过该对象调用Object类中的那些方法。
使用getServletInfo方法,获取当前页面的info属性
info.jsp
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page info="版权单位:信息科学技术学院"%>
<html>
<body>
<%=this.getServletInfo()%>
</body>
</html>
6.requset对象
客户每次向JSP服务器发送请求时,JSP引擎都会创建一个request对象。
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。
它是javax.servlet.http.HttpServletRequest类的实例。
①通过一个示例来说明Request对象的几个常用方法的使用
request_1.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<html>
<body>
<%
out.println("请求使用的协议:"+request.getProtocol()+"<br>");
out.println("请求使用Schema:"+request.getScheme()+"<br>");
out.println("访问服务的名称:"+request.getServerName()+"<br>");
out.println("访问端口号:"+request.getServerPort()+"<br>");
out.println("客户端IP地址:"+request.getRemoteAddr()+"<br>");
out.println("请求的类型(Method):"+request.getMethod()+"<br>");
out.println("Session Id:"+request.getRequestedSessionId()+"<br>");
out.println("请求的资源定位(Request URL):"+request.getRequestURL()+"<br>");
out.println("servlet在服务器文件夹的相对位置:"+request.getServletPath()+"<br>");
out.println("Host:"+request.getHeader("Host")+"<br>");
out.println("Accept-Language:"+request.getHeader("Accept-Language")+"<br>");
out.println("得到链接的类型(Connection):"+request.getHeader("Connection")+"<br>");
out.println("得到Cookie的字符串信息:"+request.getHeader("Cookie")+"<br>");
out.println("session的相关信息-创建时间:"+session.getCreationTime()+"<br>");
out.println("session的相关信息-上次访问时间:"+session.getLastAccessedTime()+"<br>");
%>
</body>
</html>
②request.getParameter()方法和request.getParameterValues()方法的使用
getParameter()可以获取客户端提交页面中某一个控件的值,如:文本框、单选按钮、下拉列表框等。
getParameterValues()可以获取客户端提交页面中的一组控件的值
inputInfo.jsp
<%@ page contentType="text/html;charset=utf-8"%>
<html>
<body>
<form action="showInfo.jsp" method="post" name="frm">
<strong><font size="4">基本资料</font></strong>
<table width="400" cols="2" border="1">
<tr>
<td><font color="red" size="2">*</font>姓名:</td>
<td><input type="text" size="18" name="name"></td>
</tr>
<tr>
<td><font color="red" size="2">*</font>性别:</td>
<td><input type="radio" name="rdo" value="男" checked><font size="3">男</font>
<input type="radio" name="rdo" value="女" checked><font size="3">女</font></td>
</tr>
<tr>
<td><font font="2">*</font>民族:</td>
<td><input type="radio" value="汉族" name="rdo1" checked><font size="3">汉族</font>
<input type="radio" value="回族" name="rdo1"><font size="3">回族</font>
<input type="radio" value="壮族" name="rdo1"><font size="3">壮族</font></td>
</tr>
<tr>
<td><font color="#ff8000" font="2">*</font>专业:</td>
<td>
<select name="Major">
<option value="计算机科学与技术">计算机科学与技术</option>
<option value="软件工程">软件工程</option>
<option value="网络工程">网络工程</option>
<option value="信息安全">信息安全</option>
</select>专业
</td>
</tr>
<tr>
<td>兴趣爱好:</td>
<td>
<input type="checkbox" name="ckbx" value="电影">电影
<input type="checkbox" name="ckbx" value="戏剧">戏剧
<input type="checkbox" name="ckbx" value="音乐">音乐
<input type="checkbox" name="ckbx" value="美术">美术
</td>
</tr>
</table><br>
<input type="submit" value="注册" name="submit">
</form>
</body>
</html>
showInfo.jsp
<%@ page contentType="text/html;charset=utf-8" import="java.lang.reflect.*"%>
<html>
<body>
用户注册信息<br>
基本资料<br>
<!-- 防止中文乱码 -->
<%request.setCharacterEncoding("utf-8"); %>
姓名:<%=request.getParameter("name")%><br>
性别:<%=request.getParameter("rdo")%><br>
民族:<%=request.getParameter("rdo1")%><br>
专业:<%=request.getParameter("Major")%> 专业<br>
兴趣爱好:<%
String ckbx[] = request.getParameterValues("ckbx");
if(ckbx != null) {
for(int i=0;i<Array.getLength(ckbx);i++)
out.println(ckbx[i]+" ");
}%>
</body>
</html>
inputInfo.jsp页面展示
点击注册,跳转到showInfo.jsp页面
7.response对象
response对象是javax.servlet.http.httpServletResponse接口的实例,是服务器对request对象请求的回应,负责向客户端发送数据。
通过调用response对象的方法还可以获得服务器端的相关信息,如状态行、head和信息体等
①sendRedirect()方法
可向服务器发送一个重定向的请求,用它转到另外一个页面时,相当于从客户端重新发了一个请求,浏览器地址栏上会出现重定向后页面的URL,这种跳转属于客户端跳转。
服务器会重新生成一个request对象,原来的request对象就失效了。
此语句之后的其它语句仍然会执行。
resp_sendRedirect.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE HTML>
<html>
<head></head>
<body>
<% System.out.println("跳转之前"); %>
<% response.sendRedirect("index.html"); %>
<% System.out.println("跳转之后"); %>
</body>
</html>
index.html
<!DOCTYPE html>
<html>
<head>
<title>index.html</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
This is my HTML page. <br>
</body>
</html>
控制台输出:
跳转之前
跳转之后
②setHeader()方法
利用response设置head信息,实现页面定时刷新的功能
resp_refresh.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<html>
<head>
<title>设置头信息(自动刷新)</title>
</head>
<body>
<%! int count=0; %>
<%
response.setHeader("refresh", "2"); //页面2秒一刷新
%>
<h3>已经访问了<%=count++ %>次!</h3>
</body>
</html>
利用response设置head信息,实现页面定时跳转的功能
resp_from.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<html>
<head>
<title>设置头信息(定时跳转)</title>
</head>
<body>
<h3>
3秒后跳转到index.html页面,<br>
如果没有跳转,请按<a href="index.html">这里</a>!
</h3>
<%
response.setHeader("refresh", "3;URL=index.html");
%>
</body>
</html>
利用response实现禁用浏览器缓存,使用浏览器“回退”按钮回到前一页,也必须重新从服务器上获取。
resp_nocache.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.Date" pageEncoding="utf-8" %>
<html>
<head>
<title>禁用页面缓存</title>
<%
response.addHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.addHeader("Cache-Control", "pre-check=0, post-check=0");
response.setDateHeader("Expires", 0);
%>
</head>
<body>
<%
Date d = new Date();
out.println(d);
%><br>
<a href="index.html">去index.html看看</a>
</body>
</html>
8.session对象
session对象是javax.servlet.http.HttpSession接口的实例对象
session对象是用户首次访问服务器时由服务器自动为其创建的。创建的同时,会为该session对象生成唯一的session id,该对象的其它属性只保存在服务器中,发到客户端的只有session id,当客户端再次发送请求的时候,会将这个session id带上,服务器会依据这个session id找到相应的session对象。
服务器会为session设置一个失效时间。
在JSP中通过HttpServletRequest的getSession(true)方法获得session对象。
下面是一个用户登录的例子
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<%--进行登录验证--%>
<%
request.setCharacterEncoding("utf-8");
// 获取用户请求信息
String user = request.getParameter("user");
String password = request.getParameter("password");
if("admin".equals(user) && "123".equals(password)) {
request.getSession().setAttribute("username", user); //将用户保存在session中
%>
<jsp:forward page="login_ok.jsp">
<jsp:param name="info" value="新人乍到,请多关照!" />
</jsp:forward>
<%}%>
<html>
<head>
<base href="<%=basePath %>">
</head>
<body>
<body>
<form action="login.jsp" method="post">
<table>
<tr><td colspan="2" align="center">用户登录</td></tr>
<%
if(user != null && password != null) {
%>
<tr><td colspan="2">用户名或密码错误,请重新登录!</td></tr>
<%}%>
<tr><td>登录名:</td><td><input type="text" name="user"></td></tr>
<tr><td>密码:</td><td><input type="password" name="password"></td></tr>
<tr><td colspan="2" align="center"><input type="submit" value="登录"></td></tr>
</table>
</form>
</body>
</body>
</html>
login_ok.jsp
<%@ page contentType="text/html;charset=utf-8"%>
<html>
<head>
<title>登录成功</title>
</head>
<body>
当前用户:<%=request.getSession().getAttribute("username") %><br>
从request对象中获取了如下参数:<br>
info=<%=request.getParameter("info") %><br>
user=<%=request.getParameter("user") %><br>
password=<%=request.getParameter("password") %><br>
<a href="login.jsp">返回登录页面</a>
</body>
</html>
9. application对象
application对象是在Web服务器启动时由服务器自动创建的,它的生命周期是JSP所有隐含对象中最长的,一旦创建了application对象,直到服务器关闭它才会销毁。
利用application对象实现网站计数器的功能
application.jsp
<%@ page language="java" contentType="text/html;charset=utf-8"%>
<html>
<head>
<title>网站访问计数器</title>
</head>
<body>
<%
if(application.getAttribute("count") == null) {
application.setAttribute("count","1");
out.println("欢迎,您是第1位访客!");
} else {
int i = Integer.parseInt(application.getAttribute("count").toString());
i++;
application.setAttribute("count",String.valueOf(i));
out.println("欢迎,您是第"+i+"位访客!");
}
%>
<hr>
</body>
</html>
10.config对象
config对象中存储着一些servlet初始的数据结构。
config对象实现了javax.servlet.ServletConfig接口。
如果在web.xml文件中,针对某个Servlet文件或JSP文件设置了初始化参数,则可以通过config对象来获取这些初始化参数。
11.exception对象
当JSP页面发生错误时,会产生异常。exception对象就是用来针对异常作出相应处理的对象。
12.pageContext对象
pageContext能够存取其他内置对象,当内置对象包括属性时,pageContext也支持对这些属性的读取和写入。
JSP引擎在把JSP转换成Servlet时经常需要用到pageContext对象,但在普通的JSP开发中一般都很少直接用到该对象。
pagecontext.jsp
<%@ page import="java.util.Enumeration" contentType="text/html;charset=GB2312"%>
<html>
<head></head>
<body>
<h2>PageContext实例</h2>
<%
// APPLICATION_SCOPE表示在application对象中搜索
Enumeration enums = pageContext.getAttributeNamesInScope(PageContext.APPLICATION_SCOPE);
while(enums.hasMoreElements()) {
out.println("application scope attributes: " + enums.nextElement()+"<br>");
}
%>
</body>
</html>