前言:一个功能分为两个终端(客户端与服务端)(前端与后端),客户端接收数据,提交给服务端,服务端处理后,把结果展示给客户端,这个就是一个完整的请求/响应模式;数据如何在页面与页面之间传递?可以使用JSP的内置对象来解决
一、JSP内置对象
JSP内置对象是Web容器创建的一组对象
- JSP内置对象的名称是JSP保留字
- JSP内置对象是可以直接在JSP页面中使用的对象,无需声明和创建,直接使用即可
- JSP一功预定义了9个这样的对象,分别有:request、response、session、application、out、pageContext、config、page、exception
二、request对象
request是javax.servlet.httpServletRequest类型的对象。该对象代表了客户端的请求信息,主要用于接收通过HTTP协议传送到服务器的数据(包括头信息、系统信息、请求方式及请求参数等)。request对象的作用域为一次请求。
1、request的常用方法
方法 | 说明 |
---|---|
String getParameter(String name) | 根据表单组件名称获取提交数据 |
String[] getParameterValues(String name) | 获取表单组件对应多个值的请求数据 |
void setCharacterEncoding(String charset) | 指定每个请求的编码 |
RequestDispatcher getRequestDisPatcher(String path) | 返回一个RequestDispatcher对象,该对象的forward()方法用于转发请求 |
void setAttribute(String key, Object value) | 以key/value形式将值保存到request中 |
2、关于request的小例子
例子1:一个页面通过form表单将数据提交到另一个页面中展示
- 表单源数据JSP页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>request内置对象的使用--提交页面</title>
</head>
<body>
<!-- jQuery用标签的id属性作为数据的KeyValue标注 -->
<!-- tomcat服务器用标签的name属性作为数据的KeyValue标注 -->
<!-- post会乱码 数据在tomcat服务器之间传递,而tomcat使用的编码是ISO-8859-1,因此会乱码 -->
<!-- get不乱码,是因为在tomcat8.0及以上版本内部做了映射(设置),因此不会乱码 -->
<form action="acceptData.jsp" method="post">
<p>
请输入姓名:
<input type="text" name="userName" required="required" placeholder="请在这里输入姓名..." />
</p>
<p>
请选择性别:<br>
<input type="radio" name="userSex" value="男" />男 <br />
<input type="radio" name="userSex" value="女" />女 <br />
</p>
<p>
请选择你的特征:<br />
<input type="checkbox" name="userTrait" value="丑陋" />好看<br />
<input type="checkbox" name="userTrait" value="衰老" />年轻<br />
<input type="checkbox" name="userTrait" value="恶毒" />善良<br />
<input type="checkbox" name="userTrait" value="屌丝" />有钱<br />
</p>
<p>
<button type="submit">提交</button>
</p>
</form>
<button type="button" onclick="window.history.go(1);">前进</button>
</body>
</html>
- 数据展示JSP页面
<%@page import="java.util.Arrays"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>request内置对象的使用--接收页面</title>
</head>
<body>
<%
// 接收数据之前需要设置请求的编码
request.setCharacterEncoding("utf-8");
String userName = request.getParameter("userName");
String[] userTrait = request.getParameterValues("userTrait");
String userSex = request.getParameter("userSex");
%>
<!-- request.getParameter("标签名称") 专门用来接收客户端传递的数据(form表单数据) -->
<!-- getParameter()返回的是String类型,因为它是根据HTTP协议进行传输的,而HTTP协议传输字符流 -->
<h1>
欢迎您!<%=userName%>同学,<br>
万万没想到,你竟然是个<%=Arrays.toString(userTrait) %>的老<%=userSex %>人!!!
</h1>
<button type="button" onclick="javascript:window.history.go(-1);">返回</button>
</body>
</html>
- 在接收页面接收数据时,需要根据form表单中封装的input标签的name值来进行接收,并且接收到的数据只能是String类型,因为这是通过数据传输协议(HTTP协议)进行限制的。
- 在接收页面接收数据时,若是多个值需要使用String[]数组来接收,例如复选框的值。
- 在接收get请求时,因为在tomcat8.0及以上版本内部做了映射(设置),所以可以不设置编码格式;但采用post请求时,需要设置编码格式,因为数据在tomcat服务器之间传递,而tomcat使用的编码是ISO-8859-1,因此会乱码。
例子2:通过输入不同的姓名进入不同的页面
- 登录页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body>
<div>
<form action="process.jsp" action="post">
<input type="text" name="userName" required="required" placeholder="请在这输入您的姓名..." />
<input type="submit" value="登录" />
</form>
</div>
</body>
</html>
- 跳转逻辑处理JSP(功能页面,都是小脚本,不展示任何数据)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 定义普通用户数组
String[] losers = {"王某", "小王", "wang"};
// 定义vip用户数组
String[] vips = { "小李", "Jan", "jan"};
// 设定编码
request.setCharacterEncoding("utf-8");
// 接收页面请求
String userName = request.getParameter("userName");
// 定义最终展示的结果页
String result = "error.jsp"; // 默认错误页面
// 判断是否为普通用户
for(String loser : losers){
if(userName.equals(loser)){
result = "user.jsp";
}
}
// 判断是否为vip用户
for(String vip : vips){
if(userName.equals(vip)){
result = "vipUser.jsp";
}
}
// 提交业务结果转发到对应页面
// getRequestDispatcher 分发到不同页面
// forward真正的转发 request 请求 response 响应
request.getRequestDispatcher(result).forward(request, response);
%>
- 此处调用request对象的getRequestDispatcher()方法,这个方法有一个参数是用来设定请求发送的地址。页面发起请求先由统一的一个服务页面接收,然后根据业务不同再转发给其他页面进行操作。
- 后面的forward()方法叫做转发方法,也就是将现在的请求处理再交给其他程序处理,里面有两个参数 request,response。
- 展示页面1
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>普通用户</title>
</head>
<body>
<div>
<p>欢迎,<%=request.getParameter("userName") %></p>
</div>
<div>
<marquee behavior="alternate" scrollamount="20" onmouseout="this.start();" onmouseover="this.stop();" >
<h1 style="font-size: 100px; color: red;">
赶紧充钱成为VIP用户!
</h1>
</marquee>
</div>
<button type="button" onclick="window.history.back();">返回</button>
</body>
</html>
- 展示页面2
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>炫酷炸天Vip用户</title>
<style type="text/css">
h1{
animation:glow 10s ease-in-out infinite;
/*
For less laggy effect, uncomment this:
animation:none;
-webkit-text-stroke:1px #fff;
===========
*/
}
*{
box-sizing:border-box;
}
/* 背景色 */
body{
background: #0a0a0a;
overflow:hidden;
text-align:center;
}
/* 3D侧面 */
figure{
animation:wobble 5s ease-in-out infinite;
transform-orign:center center;
transform-style:preserve-3d;
}
/* 摆动效果 */
@keyframes wobble{
0%,100%{transform:rotate3d(1,1,0,40deg);}
25%{transform:rotate3d(-1,1,0,40deg);}
50%{transform:rotate3d(-1,-1,0,40deg);}
75%{transform:rotate3d(1,-1,0,40deg)})
}
h1{
display: block;
width:100%;
padding:40px;
line-height:1.5;
font:900 8em 'Concert One', sans-serif;
text-transform:uppercase;
position:absolute;
color:#0a0a0a;
}
/* 显示,颜色效果 */
@keyframes glow{
0%,100%{text-shadow:0 0 30px yellow;}
25%{text-shadow:0 0 30px purple;}
50%{text-shadow:0 0 30px pink;}
75%{text-shadow:0 0 30px cyan;}
}
/* 3D效果 */
h1:nth-child(2){transform:translateZ(5px);}
h1:nth-child(3){ transform:translateZ(10px);}
h1:nth-child(4){ transform:translateZ(15px); }
h1:nth-child(5){ transform:translateZ(20px); }
h1:nth-child(6){ transform:translateZ(25px); }
h1:nth-child(7){ transform:translateZ(30px); }
h1:nth-child(8){ transform:translateZ(35px); }
h1:nth-child(9){ transform:translateZ(40px); }
h1:nth-child(10){ transform:translateZ(45px); }
</style>
</head>
<body>
<figure>
<h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
<h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
<h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
<h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
<h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
<h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
<h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
<h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
<h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
<h1>尊贵的VIP会员<br /><%=request.getParameter("userName") %> <br />欢迎您</h1>
</figure>
</body>
</html>
不管是哪个展示页面其地址栏中的地址始终停留在最开始被请求的process.jsp页面,这就是转发的特性,面对客户端来说它只知道请求传递给了process.jsp,然后process.jsp再把请求交给哪个页面处理就是服务器内部的事情了,因此在request内部进行这种请求转发处理的时候不管转了多少次,都是可以接收到最开始请求的数据的。这种数据传输处理的方式,叫做request的请求转发链,它的特点就是发生在服务器内部,浏览器看不到每个内部的处理环节都可以处理请求的数据。
三、response对象
response对象代表的是客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象的作用域只在当前JSP页面内有效。
1、response概述
response对象用于响应客户请求并向客户端输出信息。
2、response的常用方法
方法 | 说明 |
---|---|
void sendRedirect(String location) | 重定向,表示本次请求已经处理完毕,客户端将重新发送请求到指定URL |
重定向后request对象会被重置,即request中的信息都会丢失,并且地址栏也会发生改变成新的地址。
3、request和response的区别
- request是页面发送请求到服务器,然后服务器接收数据再做处理。因为客户端与服务器之间的传输都是字符流,所以request也叫请求流。
- response与request相反,是服务器处理完了页面请求之后,需要发送结果给页面,因为服务器向客户端发送信息,所以response叫相应流。
- B/S请求与响应模式:
request:(页面请求 --> 服务器处理 --> 页面展示)将form数据从页面带到服务端,然后:设置编码,接收数据,保存数据,转发数据。
response:(页面请求 --> 服务器操作)重定向代表本次操作已完成,然后开启下一次操作。
request | response |
---|---|
转发 | 重定向 |
在服务器端发挥作用,将同一请求在服务器资源之间进行传递 | 在客户端发挥作用,通过发送一个新的请求实现页面跳转 |
客户端浏览器的地址栏不会显示转向后的地址 | 客户端浏览器的地址栏会显示转向后的地址 |
DQL操作使用转发 | DML操作使用重定向 |
4、关于response的小例子
例子:修改上个案例的跳转页面的request换成response
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 定义普通用户数组
String[] losers = {"王某", "小王", "wang"};
// 定义vip用户数组
String[] vips = { "小李", "Jan", "jan"};
// 设定编码
request.setCharacterEncoding("utf-8");
// 接收页面请求
String userName = request.getParameter("userName");
// 定义最终展示的结果页
String result = "error.jsp"; // 默认错误页面
// 判断是否为普通用户
for(String loser : losers){
if(userName.equals(loser)){
result = "user.jsp";
}
}
// 判断是否为vip用户
for(String vip : vips){
if(userName.equals(vip)){
result = "vipUser.jsp";
}
}
// 提交业务结果转发到对应页面
// getRequestDispatcher 分发到不同页面
// forward真正的转发 request 请求 response 响应
// request.getRequestDispatcher(result).forward(request, response);
// 换成重定向
response.sendRedirect(result);
%>
- 结果中地址栏直接显示当前的页面地址,而不是停留在process.jsp逻辑页面。
- 并且结果页面也不能接收到userName,都为null
四、session对象
session对象是由服务器自动创建的,与请求相关的对象。是服务器创建用于与浏览器沟通的通道。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类型来保存数据,因此保存数据的格式为KV结构。session对象的value可以是复杂的对象类型,而不仅仅局限于字符串类型。session对象的作用域在浏览器的一次打开与关闭内有效。
1、session概述
一个会话就是在一段时间内,一个客户端与Web服务器的一连串相互交互的过程。与tomcat的一次通信,其中会包含多个页面的跳转里面都包含转发与重定向,而不管多少次转发与重定向其实tomcat就只给我们创建一个会话叫做session对象。
2、session对象的常用方法
方法 | 说明 |
---|---|
String getId() | 获取sessionid |
void setMaxInactiveInterval(int interval) | 设定session的非活动时间 |
int getMaxInactiveInterval() | 获取session的有效非活动时间(秒) |
void invalidate() | 设置session对象失效 |
void setAttribute(String key, Object value) | 以key/value形式保存对象值 |
Object getAttribute(String key) | 通过key获取对象值 |
void removeAttribute(String key) | 从session中删除指定名称所对应的对象 |
3、关于session对象的小例子
index.jsp
<%
pageContext.setAttribute("msg1", "pageContext_msg!");
request.setAttribute("msg2", "request_msg!");
session.setAttribute("msg3", "session_msg!");
// 重定向
response.sendRedirect("page1.jsp");
%>
<p>我是首页</p>
<p>pageContext.request.contextPath:${pageContext.request.contextPath }</p>
<p>msg1:${msg1 }</p>
<p>msg2:${msg2 }</p>
<p>msg3:${msg3 }</p>
page2.jsp
<p>我是page1:index重定向过来的</p>
<p>msg1:${msg1 }</p>
<p>msg2:${msg2 }</p>
<p>msg3:${msg3 }</p>
五、application对象
application对象可以将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象的声明周期更长,类似于系统的全局变量。作用域在Tomcat服务器的一次开启与关闭内有效。
1、application概述
application对象类似于系统的“全局变量”,在tomcat开启的时候,创建一个application对象,然后整个项目不管打开和关闭多少次都只有这一个对象。
2、application对象的常用方法
方法 | 说明 |
---|---|
void setAttribute(String key, Object value) | 以key/value形式保存对象值 |
Object getAttribute(String key) | 通过key获取对象值 |
String getRealPath(String path) | 返回相对路径的真实路径 |
3、关于application对象的小例子
index.jsp
pageContext.setAttribute("msg1", "pageContext_msg!");
request.setAttribute("msg2", "request_msg!");
session.setAttribute("msg3", "session_msg!");
application.setAttribute("msg4", "application_msg!");
// 转发
request.getRequestDispatcher("page1.jsp").forward(request,response);
%>
<p>我是首页</p>
<p>pageContext.request.contextPath:${pageContext.request.contextPath }</p>
<p>msg1:${msg1 }</p>
<p>msg2:${msg2 }</p>
<p>msg3:${msg3 }</p>
<p>msg4:${msg4 }</p>
page1.jsp
<%
// 重定向
response.sendRedirect("page2.jsp");
%>
<p>我是page1:index转发过来的</p>
<p>msg1:${msg1 }</p>
<p>msg2:${msg2 }</p>
<p>msg3:${msg3 }</p>
<p>msg4:${msg4 }</p>
page2.jsp
<p>我是page2:page1重定向过来的</p>
<p>msg1:${msg1 }</p>
<p>msg2:${msg2 }</p>
<p>msg3:${msg3 }</p>
<p>msg4:${msg4 }</p>
六、out对象
out对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
1、out对象概述
在使用out对象输出数据时,可以对数据缓冲区进行操作,即使清楚缓冲区中的残留数据,为其他的输出让出缓冲空间。带输出完毕后,要及时关闭输出流。
2、out对象的常用方法
方法 | 说明 |
---|---|
void print(Object arg) | 向客户端输出数据 |
void flush() | 刷新缓冲区空间 |
void close() | 关闭输出流 |
3、关于out对象的小例子
<%
pageContext.setAttribute("msg1", "pageContext_msg!");
request.setAttribute("msg2", "request_msg!");
session.setAttribute("msg3", "session_msg!");
application.setAttribute("msg4", "application_msg!");
out.print("abc");
out.flush();
// 如果这里显示的关闭out对象,则其他数据都输出不了
out.close();
%>
<div>
<p>我是首页</p>
<p>pageContext.request.contextPath:${pageContext.request.contextPath }</p>
<p>msg1:${msg1 }</p>
<p>msg2:${msg2 }</p>
<p>msg3:${msg3 }</p>
<p>msg4:${msg4 }</p>
七、pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问。pageContext对象的作用是取得任何范围的参数,可以获取JSP页面的request、response、session、application、out等对象。pageContext的作用域不论是转发还是重定向,只在当前页面有效。
1、获取当前项目名
利用pageContext来获取现在访问的项目名称,它能绝对定位到项目的根目录下,可以用于配置一些请求或者引入文件的位置
${pageContext.request.contextPath}
2、关于pageContext对象作用域的例子
index.jsp
<%
pageContext.setAttribute("msg1", "pageContext_msg!");
request.setAttribute("msg2", "request_msg!");
// 转发
request.getRequestDispatcher("page1.jsp").forward(request,response);
%>
<p>pageContext.request.contextPath:${pageContext.request.contextPath }</p>
<p>msg1:${msg1 }</p>
<p>msg2:${msg2 }</p>
page1.jsp
<p>我是page1:index转发过来的</p>
<p>msg1:${msg1 }</p>
<p>msg2:${msg2 }</p>
八、config对象
config对象的主要作用是取得服务器的配置信息。通过pageContext对象的getServletConfig()方法可以获得一个config对象。当一个Servlet初始化时,容器会把一些信息通过config对象传递给这个Servlet。开发者可以在web.xml文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
九、page对象
page对象代表JSP本身,只有在JSP页面内才是合法的。page对象本质上包括当前Servlet接口引用的变量,类似于Java的this指针。
十、exception对象
exception对象的作用是展示异常信息,只有在包含isErrorPage="true"的页面才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。exception对象和Java对象一样,都具有系统提供的继承结构。exception对象几乎定义了所有异常情况。在Java程序中使用try/catch关键字来处理异常情况;若在JSP页面中出现没有捕获到的异常,就会生成exception对象,并把exception对象传送到page指令中设置的错误页面中,然后再错误页面中处理相应的exception对象。
十一、内置对象总结
1、内置对象
名称 | 说明 |
---|---|
request | 主要用于处理客户端请求的数据信息 |
response | 用于响应客户端请求并向客户端输出信息 |
session | 用于记录会话状态的相关信息 |
application | 类似于系统全局变量,用于实现web应用中的资源共享 |
out | 用于向客户端输出数据 |
2、作用域
名称 | 说明 |
---|---|
page作用域 | 在一个页面范围内有效 ,通过pageContext对象访问 |
request作用域 | 在一个服务器请求范围内有效 |
session作用域 | 在一次会话范围内有效 |
application作用域 | 在一个应用服务器范围内有效 |
同名取值规则(就近原则):
page -> request -> session -> application
3、cookie对象
1.cookie对象概述
cookie是Web服务器保存在客户端的一系列文本信息。cookie是网站把一些信息保留在你本地的浏览器的一种操作。
注:cookie是脱离服务器管理的,因此一些敏感数据不应该放在cookie里,如果真的想放也应该是加密之后再放进去
2.cookie语法
- 创建cookie对象
Cookie 对象名 = new Cookie(String key, String value); - 写入cookie
response.addCookie(对象名); - 读取cookie
Cookie[] 数组名 = request.getCookies();
注:cookie中只能保存字符串
3.cookie常用对象
| 方法 | 说明 |
|–|--|
| void setMaxAge(int expiry) | 设置cookie有效期(秒) |
| void setValue(String value) | 在cookie创建后,对cookie进行赋值 |
| String getName() | 获取cookie的名称 |
| String getValue() | 获取cookie的值 |
| int getMaxAge() | 获取cookie的有效时间(秒) |
4.有关cookie对象的小例子
index.jsp
<%
pageContext.setAttribute("msg1", "pageContext_msg!");
request.setAttribute("msg2", "request_msg!");
session.setAttribute("msg3", "session_msg!");
application.setAttribute("msg4", "application_msg!");
// 创建cookie对象 保存msg5
Cookie ck = new Cookie("msg5", "cookie_msg!");
// 设置有效期600秒
ck.setMaxAge(600);
// 写入cookie
response.addCookie(ck);
%>
<div>
<p>我是首页</p>
<p>pageContext.request.contextPath:${pageContext.request.contextPath }</p>
<p>msg1:${msg1 }</p>
<p>msg2:${msg2 }</p>
<p>msg3:${msg3 }</p>
<p>msg4:${msg4 }</p>
page1.jsp
<%
String val = "";
Cookie [] cks = request.getCookies();
for(Cookie c : cks){
if(c.getName().equals("msg5")){
val = c.getValue();
}
}
%>
<div>
<p>我是page1:没有重定向和转发</p>
<p>msg1:${msg1 }</p>
<p>msg2:${msg2 }</p>
<p>msg3:${msg3 }</p>
<p>msg4:${msg4 }</p>
<p>msg5:<%=val %></p>
</div>
5.session与cookie区别
区别 | session | cookie |
---|---|---|
保存信息端 | 服务器 | 客户端 |
保存信息数据类型 | Object | String |
保存信息有效期 | 会话结束销毁 | 长期保存在本地 |
保存信息分类 | 重要信息 | 不重要信息 |