四、jsp的九大内置对象
jsp内置对象是指在警示牌页面中不用声明就可以在脚本和表达式中直接使用的对象。**特点**
- 内置对象有Web容器自动加载,不需要实例化。
- 内置对象通过Web容器来管理和实现。
- 在所有的jsp页面中,直接调用内置对象都是合法的。
(1)request (请求对象)
表示客户端对服务器发出的请求request内置对象拥有HttpServletRequest接口所有的方法,主要方法如下
方法名 | 作用 |
---|---|
setCharacterEncoding(String charset) | 设置请求的编码集 |
getParameter(String name) | 根据指定参数获得单一的参数值 |
String [] getParameterValues(String name) | 根据参数名获得一组参数值 |
setAttribute(String name,String value) | 以键值对的形式存储请求域的值 |
getAttribute(String name ) | 根据属性名获取存储的对象数据 |
代码演示request的作用
NewFile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<form action="doNewFile.jsp" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="userpass" /></td>
</tr>
<tr>
<td>性别</td>
<td><input type="radio" name="sex" value="男" />男 <input
type="radio" name="sex" value="女" />女</td>
</tr>
<tr>
<td>爱好</td>
<td><input type="checkbox" name="hobby" value="篮球" />篮球 <input
type="checkbox" name="hobby" value="足球" />足球 <input
type="checkbox" name="hobby" value="排球" />排球 <input
type="checkbox" name="hobby" value="唱歌" />唱歌</td>
</tr>
<tr>
<td><input type="submit" name="submit" value="登录" /></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
在服务上访问该jsp页面
doNewFile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>获取的信息</title>
</head>
<body>
<%
//设置post的请求编码集
request.setCharacterEncoding("utf-8");//只对post请求起作用
//获得用户名的值
String name = request.getParameter("username");
out.println("用户名是"+name+"<br>");
//获得密码
String pass = request.getParameter("userpass");
out.println("密码是"+pass+"<br>");
//获得性别
String sex = request.getParameter("sex");
out.println("性别是"+sex+"<br>");
//获得爱好
String[] hobby = request.getParameterValues("hobby");
out.print("用户的爱好是:");
for(String h: hobby){
out.print(h);
}
%>
</body>
</html>
提交表单后,doNewFile.jsp的运行结果是
加入登录验证,利用setAttribute()方法
NewFile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String info = (String)request.getAttribute("info");
if(info!=null){
out.print("<font size=4 color = red>"+info+"</font>");
}
%>
<form action="doNewFile.jsp" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="userpass" /></td>
</tr>
<tr>
<td>性别</td>
<td><input type="radio" name="sex" value="男" />男 <input
type="radio" name="sex" value="女" />女</td>
</tr>
<tr>
<td>爱好</td>
<td><input type="checkbox" name="hobby" value="篮球" />篮球 <input
type="checkbox" name="hobby" value="足球" />足球 <input
type="checkbox" name="hobby" value="排球" />排球 <input
type="checkbox" name="hobby" value="唱歌" />唱歌</td>
</tr>
<tr>
<td><input type="submit" name="submit" value="登录" /></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>![在这里插入图片描述](https://img-blog.csdnimg.cn/20190718203412468.png)
doNewFile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>获取的信息</title>
</head>
<body>
欢迎进入主页面
<%
//设置post的请求编码集
request.setCharacterEncoding("utf-8");//只对post请求起作用
//获得用户名的值
String name = request.getParameter("username");
out.println("用户名是"+name+"<br>");
//获得密码
String pass = request.getParameter("userpass");
out.println("密码是"+pass+"<br>");
StringBuffer sb = new StringBuffer();
if("".equals(name)){
sb.append("用户名不能为空");
}
if("".equals(pass)){
sb.append("密码不能为空");
}else{
if(pass.length()>6||pass.length()>12){
sb.append("密码的长度因该在6到12位之间");
}
}
request.setAttribute("info", sb.toString());
if(sb.toString().equals("")){
%>
<jsp:forward page="main.jsp"></jsp:forward>
<%
}else{
%>
<jsp:forward page="NewFile.jsp"></jsp:forward>
<%
}
%>
</body>
</html>
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页面</title>
</head>
<body>
<font size = 6 color =red>欢迎进入主页面</font>
</body>
</html>
结果
- 当用户名为空时
用户名不为空值,进入主页面
注:
从上面的输出结果可以看出,利用< jsp:forword>实现转发时地址栏的地址是不变的!!!
(2)response(响应对象)
表示服务器对客户端的响应response内置对象拥有HttpServletResponse接口所有的方法,主要方法如下
方法名 | 作用 |
---|---|
setCharacterEncoding(String charset) | 设置响应的编码集 |
sendRedirect (String URL) | 重定向到指定的url地址所指的资源 |
代码实现response
NewFile.jsp ,main.jsp[和上面的代码一样,这里不再详细的写出
doNewFile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>获取的信息</title>
</head>
<body>
欢迎进入主页面
<%
//设置post的请求编码集
request.setCharacterEncoding("utf-8");//只对post请求起作用
//获得用户名的值
String name = request.getParameter("username");
out.println("用户名是"+name+"<br>");
//获得密码
String pass = request.getParameter("userpass");
out.println("密码是"+pass+"<br>");
StringBuffer sb = new StringBuffer();
if("".equals(name)){
sb.append("用户名不能为空");
}
if("".equals(pass)){
sb.append("密码不能为空");
}else{
if(pass.length()>6||pass.length()>12){
sb.append("密码的长度因该在6到12位之间");
}
}
request.setAttribute("info", sb.toString());
if(sb.toString().equals("")){
response.sendRedirect("mian.jsp");
}else{
response.sendRedirect("NewFile.jsp");
}
%>
</body>
</html>
页面的显示效果
注:
这是发现地址栏中的地址发生了变化,这就是重定向和转发的区别之一
(3)out(输出对象)
用来控制管理out内置对象主要方法如下
方法名 | 作用 |
---|---|
print/println(参数) | 输出 |
newLine() | 输出一个换行符 |
clear() | 清除输出缓冲区的内容,若缓存区的内容为空,则产生IOException异常 |
clearBuffer() | 清除输出缓冲区的内容,若缓存区的内容为空,不会产生IOException异常 |
getBufferSize() | 获得当前缓冲区的大小 |
代码演示
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>输出演示</title>
</head>
<body>
<%
Date date = new Date();
String name = "哼哼的博客";
out.print(date.toString()+"<br>");
out.print(name+"<br>");
for(int i=1;i<1000;i++){
out.print("*");
out.flush();//如果没有flush这个方法,当输出流内容超过1KB时,页面将不能正常执行。
}
%>
</body>
</html>
页面显示效果
(4)session(会话对象)
表示浏览器与服务器之间的一次会话session内置对象具有HttpSession接口的所有方法,主要方法如下
方法名 | 作用 |
---|---|
setAttribute(String name,Object value) | 以键值对的形式存储session域属性 |
getAttribute(String name) | 根据属性名获取属性值 |
invalidate() | 使session对象失效,释放所有的属性空间 |
clearBuffer() | 清除输出缓冲区的内容,若缓存区的内容为空,不会产生IOException异常 |
getBufferSize() | 获得当前缓冲区的大小 |
下面代码演示登录成功后对用户名的保存。
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String info = (String)request.getAttribute("info");
if(info!=null){
out.print("<font size=4 color = red>"+info+"</font>");
}
%>
<form action="doLogin.jsp" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="userpass" /></td>
</tr>
<tr>
<td>性别</td>
<td><input type="radio" name="sex" value="男" />男 <input
type="radio" name="sex" value="女" />女</td>
</tr>
<tr>
<td>爱好</td>
<td><input type="checkbox" name="hobby" value="篮球" />篮球 <input
type="checkbox" name="hobby" value="足球" />足球 <input
type="checkbox" name="hobby" value="排球" />排球 <input
type="checkbox" name="hobby" value="唱歌" />唱歌</td>
</tr>
<tr>
<td><input type="submit" name="submit" value="登录" /></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
doLogin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>获取的信息</title>
</head>
<body>
欢迎进入主页面
<%
//设置post的请求编码集
request.setCharacterEncoding("utf-8");//只对post请求起作用
//获得用户名的值
String name = request.getParameter("username");
//将用户名保存session的作用域中
session.setAttribute("name", name);
//获得密码
String pass = request.getParameter("userpass");
StringBuffer sb = new StringBuffer();
if("".equals(name)){
sb.append("用户名不能为空");
}
if("".equals(pass)){
sb.append("密码不能为空");
}else{
if(pass.length()>6||pass.length()>12){
sb.append("密码的长度因该在6到12位之间");
}
}
request.setAttribute("info", sb.toString());
if(sb.toString().equals("")){
response.sendRedirect("main.jsp");
}else{
response.sendRedirect("login.jsp");
}
%>
</body>
</html>
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页面</title>
</head>
<body>
<font size = 6 color =red>欢迎进入主页面</font><br>
<%String name =(String) session.getAttribute("name");
out.print("<font size=5 color=green>用户名是:"+name+"</font>");
%>
</body>
</html>
页面显示效果
从结果中可以看出存储在session中的属性,在重定向之后也有效。
(5)application(上下文对象)
application对象在容器启动时实例化,在容器关闭时销毁,作用域为整个web的生命周期application具有ServletContext接口的所有功能,主要的方法如下
方法名 | 作用 |
---|---|
setAttribute(String name,Object value) | 以键值对的形式存储session域属性 |
getAttribute(String name) | 根据属性名获取属性值 |
removeAttribute(String name) | 移除属性 |
下面用代码使用application对象实现一个页面的留言板功能
guestBook.jsp
<%@page import="java.util.Vector"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>留言板</title>
</head>
<script type="text/javascript">
function vaildate(){
var name = document.getElementById("username");
var message = document.getElementById("message");
if(name.value==""){
alert("请输入你的名字");
name.focus();
return false;
}else if(message.value==""){
alert("请输入你的留言");
message.focus();
return false;
}
return true;
}
</script>
<body>
<p>请输入留言</p>
<form action ="guestBook.jsp" method="post" onsubmit="return validate">
<p>请输入名字: <input type = "text" name = "username" id = "username"/></p>
<p>请输入留言: <textarea name = "message" id = "message"cols="50" rows="3"></textarea></p>
<p><input type="submit" value ="发表留言"/></p>
</form>
<hr>
<p>留言板内容</p>
<%
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("username");
String message = request.getParameter("message");
Vector<String> messages = new Vector<>();
if(messages==null){
//若留言本不存在则创建一个
messages = new Vector<String>();
}
if(name!=null&&message!=null){
//将名字和留言的内容拼接起来
String info = name+"#"+message;
//将拼接的内容放到容器中
messages.add(info);
//设置Application域的属性
application.setAttribute("messageBook", messages);
}
//遍历显示所有的留言信息
if(messages.size()>0){
for(String m :messages){
//以#拆分信息
String[] arr = m.split("#");
out.print("<p>姓名:"+arr[0]+"<br>留言内容:"+arr[1]+"</p>");
}
}else{
out.print("还没有留言");
}
%>
</body>
</html>
- 没留言是的效果图
- 留言之后
(6)pageContext(页面上下文对象)
表示当前页面运行的环境,用于获取当前jsp页面的相关信息,pageContext对象作用范围是当前的jsp页面。主要的方法
方法名 | 作用 |
---|---|
setAttribute(String name,Object value) | 以键值对的形式存储session域属性 |
getAttribute(String name) | 根据属性名获取属性值 |
removeAttribute(String name) | 移除属性 |
getRequest() | 获取当前jsp页面的请求对象 |
getResponse() | 获取当前jsp页面的响应对象 |
geSession() | 获取当前jsp页面的session对象 |
代码演示
<%
pageContext.setAttribute("name", "哼哼的博客");
String pname = (String)pageContext.getAttribute("name");
%>
<%=pname %>
(7)page(即this,代表jsp本身)
代码实现<%=this.getServletInfo() %>
(8)config(页面配置对象)
当前jsp页面翻译后的Servlet的ServletConfig对象
代码演示
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>WebFirstDemo</display-name>
<servlet>
<servlet-name>configExample</servlet-name>
<jsp-file>configExample.jsp</jsp-file>
<init-param>
<param-name>username</param-name>
<param-value>hengheng</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>configExample</servlet-name>
<url-pattern>/configExample.jsp</url-pattern>
</servlet-mapping>
</web-app>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%String name = config.getInitParameter("username");%>
<%=name %>
</body>
</html>
(9)exception对象(异常对象)
如果一个jsp页面要应用此对象,必须将此页面中page指令的IsErrorPage属性设置为true,否则无法编译
代码演示
error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%exception.printStackTrace(response.getWriter()); %>>
</body>
</html>
calculate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="error.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int a,b;
a=10;
b=0;
int c = a/b;
%>
</body>
</html>
运行calculate.jsp的结果是
页面上打印都是报错信息。