JSP ---[JSP九大内置对象 & 请求转发与重定向]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP ---[JSP九大内置对象 & 请求转发与重定向]相关的知识,希望对你有一定的参考价值。
目录
内置对象
JSP的内置对象是指在JSP页面系统中已经默认内置的Java对象,这些对象不需要开发人员显式声明即可使用。在JSP页面中,可以通过存取JSP内置对象实现与JSP页面和Servlet环境的相互访问。每个内部对象均有对应所属的ServletAPI类型。在jsp页面中可以不加声明和创建就可以在脚本中使用
。
内置对象 | 简要说明 |
---|---|
out | 向客户端输出 |
request | 封装用户请求 |
response | 向用户做出响应 |
session | 客户和服务器间的会话 |
application | 于服务器启动时开始运行,用来存放全局变量,在用户间共享 |
pageContext | 用于访问page的各种对象 |
exception | 异常 |
config | 初始化要用的参数 |
page | JSP页面本身 |
在一般的页面不含有exception
对象;需要在page指令中定义 isErrorPage属性为true
;
当jsp文件编译为servlet文件时.这些内置对象都存在定义;所以直接在 jsp 文件中调用即可.
pageContext中的属性默认在当前页面是共享的;session中的属性在当前session中是共享的;application对象中的属性则对所有页面都是共享的;request中的属性在同一个请求中是共享的
out对象
Out对象是javax.servlet.jsp.JspWriter类的实例。代表JSP页面的输出流;
主要用于向客户端浏览器输出数据
常用方法 | 说明 |
---|---|
print() | 将指定类型的数据输出到 HTTP 流,不换行 |
println( ) | 将指定类型的数据输出到 HTTP 流,并输出一个换行符 |
newline | 输出换行字符 |
flush() | 刷新输出流 |
request对象
request对象是javax.servlet.http.HttpServletRequest的实例,
- request对象封装了一次请求,客户端的请求参数都被封装在该对象里。
- 主要用于接受客户端通过HTTP协议连接传输到服务器端的数据。比如表单中的数据、网页地址后带的参数等。
- 每当客户端请求一个JSP页面时,JSP就会创建一个新的request对象来代表这个请求。
返回值类型 | 方法 | 注释 |
---|---|---|
void | setAttribute(String name,Object obj) | 设置属性的属性值 |
Object | getAttribute(String name) | 返回指定 name的属性值 ,若不存在,则返回 null 值 |
void | removeAttribute(String name) | 删除请求中的一个属性 |
String | getParameter(String name) | 获取客户端传送给服务器端的参数 |
Enumeration | getAttributeNames() | 返回 request 对象的所有属性的集合 |
Enumeration | getParameterNames() | 获取客户端传送的所有参数的集合 |
String | getParameterValues(String name) | 获取指定name的所有值 |
String | getCharacterEncoding() | 返回请求正文中所使用的字符编码 |
int | getContentLength() | 获取请求数据的长度(字节数 ),若不确定则返回 -1 |
String | getContenType() | 获取请求体的数据类型(MIME 类型) |
ServletlnputStream | getInputStream() | 获取请求的输入流,显示请求中的数据 |
String | getProtocol() | 获取客户端向服务器端传送数据的协议名称 |
String | getMethod() | 获取客户端向服务器端传送数据的参数方法,(get/post) |
String | getServerName() | 获取服务器的主机名 |
String | getRemoteAddr() | 获取客户端的网络地址 |
String | getRemoteHost() | 获取发送请求的客户端主机名 |
String | getRealPath(String path) | 获取指定路径的真实路径 |
cookie[] | get Cookie() | 获取所有 Cookie 对象 |
boolean | isSecure() | 判断当前请求是否使用安全协议 |
boolean | isRequestedSessionldPromCookie() | 判断会话是否使用 Cookie 管理会话 ID |
boolean | isRequestedSessionIdFromURL() | 判断会话是否使用 URL 管理会话ID |
boolean | isRequestedSessionldFromVoid() | 判断请求的会话 ID 是否合法 |
int | getServerPort() | 获取服务器的端口号 |
response对象
Response对象是javax.servlet.http.HttpServletResponse类的实例。
- 代表响应对象,主要用于向客户端发送数据。
- 包含了响应客户请求的有关信息。
返回值类型 | 方法 | 注释 |
---|---|---|
void | sengRedirect(java.lang.String location) | 将响应发送到另一个位置进行处理 |
void | addCookie(Cookie cookie) | 添加指定参数Cookie |
void | addHeader(String name,String value) | 添加 HTTP 文件指定的头信息 |
String | encodeURL(String url) | 将 URL 进行指定编码,返回包含 Session ID 的 URL |
void | flushBuffer() | 将缓冲区内容发送到客户端 |
int | getBufferSize() | 获取响应所使用的实际缓冲区大小,若无缓冲区则返回 0 |
void | setBufferSize(int size) | 设置响应体的首选缓冲区大小 |
boolean | isCommitted() | 判断响应是否已提交;(提交的响应包含状态码和报头) |
void | reset() | 清除缓冲区存在的数据,包括状态码和报头 |
ServletOutputStream | getOutputStream() | 获取传到客户端的输出流对象 |
void | sendError(int errnum) | 向客户端发送错误信息 |
void | setCotentType(String type) | 设置响应的 数据类型(MIME 类型) |
void | setHeader(String name,String value) | 设置指定name的 HTTP文件头信息 |
void | setCotentLength(int len) | 设置响应头长度 |
请求转发与重定向
当 servlet 逻辑处理后,将处理结果交给 jsp ,由jsp向客户端进行响应;这里有两种解决方式
- 使用request进行请求转发;
- 使用response进行重定向.
实际上,两种方式本质上的结果,还是 jsp 进行编译.(即其中的字符输出流方式)
请求转发
请求转发是指
将请求再转发到另一资源
。此过程在同一个请求范围内,转发后浏览器地址栏内容不变
。
请求转发使用
RequestDispatcher接口
中的forward()方法
来实现,该方法可以把请求转发到另外一个资源
,并让该资源对浏览器的请求进行响应。
整个过程是属于一次请求;浏览器的地址不发生变化. 转发的动作在服务器内完成,客户端并不知晓.
在转发的过程中还可以传输数据;
简图:
重定向
重定向是指
页面重新定位到某个新地址
,之前的请求失效,进入一个新的请求
,且跳转后浏览器地址栏内容将变为新的指定地址。
重定向是通过
HttpServletResponse对象
的sendRedirect()方法
实现,该方法相当于浏览器重新发送一个请求
整个过程属于两次请求;地址栏的地址发生变化,在第二次请求时不会的得到第一次请求的数据.
简图:
这里使用一个简单的登录页面跳转案例,分别看看请求转发和重定向.
(1)请求转发的方式
- 编写LoginServlet类文件
//使用注解方式配置servlet
@WebServlet(name = "login",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式;
req.setCharacterEncoding("utf-8");
//获取页面中对应name的值;
String account = req.getParameter("account");
String password = req.getParameter("password");
String sex = req.getParameter("sex");
//servlet处理请求后交给jsp;由jsp向客户端响应;
//两种方式: request请求转发; response重定向;
//这里仅仅是用equals方法进行了判断;
if (account.equals("张三") && password.equals("123456")) {
//将上面获取到的account的值设置给名为 name的属性;(以键值对的形式);
req.setAttribute("name",account);
//将请求转发到页面loginSuccess.jsp,(此时 request对象的数据也发过去了; )
RequestDispatcher requestDispatcher = req.getRequestDispatcher("loginSuccess.jsp");
requestDispatcher.forward(req,resp);
} else {
//对于账号错误的情况,也请求发送;
//设置属性名为 errorMsg 的值为 "账号或密码错误!"
req.setAttribute("errorMsg","账号或密码错误!");
//将请求发送到页面 login.jsp ;
RequestDispatcher requestDispatcher = req.getRequestDispatcher("login.jsp");
requestDispatcher.forward(req,resp);
}
}
}
- 登录页面 login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<div>
<%--获取到转发过来的request对象的,属性名为 errorMsg 的值 ;若不存在,则返回 null 值--%>
<%--在没有登录时;(请求转发之前);这个request对象是属于login.jsp的request对象--%>
<%
Object errorMsg = request.getAttribute("errorMsg");
out.print(errorMsg);
%>
</div>
<form action="login" method="post">
账号:<input type="text" name="account"/><br/>
密码:<input type="password" name="password"/><br/>
性别:<input type="radio" name="sex" value="男" checked="checked" />男<br/>
<input type="radio" name="sex" value="女"/>女<br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
- 登陆成功页面loginSuccess.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录成功</title>
</head>
<body>
<%--在没有登录时;(请求转发之前);这个request对象是属于loginSuccess.jsp的request对象--%>
<%--此时的request对象,正是LoginServlet请求中转发过来的request对象--%>
<%--通过getAttribute方法获取到指定的参数名(account)对应的值;若不存在,则返回 null 值--%>
<%
String account = (String) request.getAttribute("name");
%>
<%
out.print(account);
%>
你来了!
</body>
</html>
- 启动服务器
登录页面(注意到null
;这时request 对象
是属于login.jsp
的 request 对象;那么调用 getAttribute 方法获取名为 name 的值是不存在的,则为 null );此时页面为login.jsp.
输入正确账号密码后;(注意到url的地址并不是loginSuccess.jsp
)
输入错误账号;(注意到url的地址并不是login.jsp
)
而直接访问loginSuccess.jsp
时;(这时的request对象不是转发过来的,所以也就没有包含name数据信息值)
(2)重定向
- 编写LoginServlet类文件
//使用注解方式配置servlet
@WebServlet(name = "login",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式;
req.setCharacterEncoding("utf-8");
//获取页面中对应name的值;
String account = req.getParameter("account");
String password = req.getParameter("password");
String sex = req.getParameter("sex");
//servlet处理请求后交给jsp;由jsp向客户端响应;
//两种方式: request请求转发; response重定向;
//这里仅仅是用equals方法进行了判断;
if (account.equals("张三") && password.equals("123456")) {
//将上面获取到的account的值设置给名为 name的属性;(以键值对的形式);
req.setAttribute("name",account);
//将页面重定向到 loginSuccess.jsp
resp.sendRedirect("loginSuccess.jsp");
} else {
//对于账号错误的情况,也也进行重定向处理;
//设置属性名为 errorMsg 的值为 "账号或密码错误!"
req.setAttribute("errorMsg","账号或密码错误!");
//将页面重定向到 login.jsp
resp.sendRedirect("login.jsp");
}
}
}
- 登录页面
login.jsp
和登陆成功页面loginSuccess.jsp
不变 - 启动服务器
- 输入正确账号密码后;(注意到
url的地址已经是loginSuccess.jsp
;但是本来应该显示用户名的位置为null值
;也就是说那个request对象没有转发过来); - 使用F12,注意到网络地址有
login
地址,但是状态码为302
,即请求重定向.
- 输入错误账号;(注意到
url的地址已经是login.jsp
;但是显示错误提示消息的位置显示为null值
)
session对象
Session 对象是javax.servlet.http.HttpSession类的实例。
主要用来保持在服务器与一个客户端之间需要保留的数据,比如在会话期间保持用户的登录信息等,会话状态维持是Web应用开发者必须面对的问题。
作用/功能:session对象在第一个JSP页面被装载时自动创建,完成会话期管理。;使用了会话跟踪技术
, 存储管理数据(session对象在同一个会话中是共享的 : 在同一个浏览器进行访问 ;使用同一个根目录地址时,(即同一个项目)).
会话:由客户端打开浏览器并连接到服务器 ; 会话开始 ; 到客户端关闭浏览器离开这个服务器时 ; 会话结束. ; 会话是个过程.
- Servlet API中,定义了HttpSession接口,用来封装会话对象。
- HttpSession是接口,会话对象是Web容器创建的,在Servlet中使用HttpServletRequest中的方法获得会话对象。
- public HttpSession getSession():获取跟当前请求相关的session,如果不存在session,就创建一个新的session对象返回。
- JSP文件可使用会话对象的方法; JSP文件中有内置对象session,可以直接调用HttpSession接口中任意方法。
HttpSession接口中定义的部分方法
返回值类型 | 方法 | 注释 |
---|---|---|
void | setAttribute(String key,Object value) | 以key/value的形式保存对象值 |
Object | getAttribute(String key) | 通过key获取对象值 |
void | removeAttribute(String key) | 通过key删除属性 |
int | getMaxInactiveInterval( ) | 获取session的有效非活动时间,以秒为单位 |
void | setMaxInactiveInterval (int interval ) | 设置session的最大非活动时间,以秒为单位,超时将被销毁。如果参数是负数,表示永远不失效。 |
long | getCreationTime( ) | 获取 session 的创建时间 ,以毫秒为单位 |
long | getLastAccessedTime( ) | 获取 session 中客户端最近一次请求的时间 。(以毫秒为单位),由 1970年1月1日起。可计算用户在站点上停留的时间 |
String | getId( ) | 获取session对象的会话ID |
void | invalidate( ) | 设置session对象失效,销毁session对象 |
boolean | isNew( ) | 判断该session对象是不是一个新创建的会话对象 |
Enumeration | getAttributeName( ) | 获取 session 对象全部属性的名字 |
session实现会话机制的过程
会话机制过程
- 当
客户端发出请求
时,服务器创建session对象
,生成一个随机的会话ID
, 并且将ID值封装为JSESSIONID
的session,响应给客户端. - 客户端会将响应过来的
会话ID存储起来
,每次访问服务器时的请求中,会附带会话ID
. - 调用
request.getSession
,获得会话对象时,服务器从request中获取会话ID(JSESSIONID值)
;查找匹配的session对象. - 当
浏览器关闭
时,session对象销毁
,此时若有客户端发来请求,但是根据会话ID匹配不到对应的session对象,那么就会重新创建session对象,生成随机的会话ID.
当客户端关闭网站的所有网页或关闭浏览器时,session对象中保存的数据会自动清除。由于Htp协议是一个无状态协议,不保留会话间的数据,因此通过session对象扩展了htp的功能。比如用户登录一个网站之后,登录信息会暂时保存在session对象中,打开不同的页面时,登录信息是可以共享的,一旦用户关闭浏览器或退出登录,就会清除session对象中保存的登录信息。
通过一个简单的案例查看session对象的工作机制
- (1)编写
jspforSession.jsp 页面
<%--
Created by IntelliJ IDEA.
User: 小智
Date: 2021/8/2
Time: 16:33
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>session</title>
</head>
<body>
关于session工作机制
</body>
</html>
- (2)浏览器第一次访问服务器时;生成随机的会话ID;
JSESSIONID=B9D084300FB777A993A567ED492938B1
- (3)当浏览器第二次访问服务器时,客户端请求头的会话ID值就是服务器之前响应过来的值.
JSESSIONID=B9D084300FB777A993A567ED492938B1
- (4)现在,关闭服务器;然后再启动服务器;使用浏览器访问
jspforSession.jsp
;服务器生成新的会话ID
;
JSESSIONID=6D161381FDB57B6C2166518923D300B4
获取session的两种方式
- (1)在jsp中, 使用方法
getId( )
- (2)在servlet中,使用方法
getSession( )
通过一个案例看看这两种获取session方式;
LoginServlet类
//使用注解方式配置servlet
@WebServlet(name = "login",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码格式;
req.setCharacterEncoding("utf-8");
//获取页面中对应name的值;
String account = req.getParameter("account");
String password = req.getParameter("password");
String sex = req.getParameter("sex");
//创建session对象;
HttpSession session;
//这里仅仅是用equals方法进行了判断;
if (account.equals("张三") && password.equals("123456")) {
//从请求对象中获取对应的session对象;
session = req.getSession();
//将上面获取到的account的值设置给名为 name的属性;(以键值对的形式);
session.setAttribute("name",account);
//若符合条件,则重定向到页面LoginSuccess.jsp;
resp.sendRedirect("loginSuccess.jsp");
} else {
//从请求对象中获取对应的session对象;
session=req.getSession();
//设置属性名为 errorMsg 的值为 "账号或密码错误!"
session.setAttribute("errorMsg", "账号或密码错误!");
//将页面重定向到login.jsp;
resp.sendRedirect("login.jsp");
}
}
}
- 登录页面
Login.jsp
;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<div>
<%--获取到session对象中属性名为 errorMsg 的值 ;若不存在,则返回 null 值--%>
<%--此时获取到的session对象和客户端访问服务器的是同一个;(都在同一个浏览器)--%>
<%
String errorMsg =(String) session.getAttribute("errorMsg");
out.print(errorMsg+"<br/>");
out.print("此时会话ID为==>"+session.getId()+"<br/>");
%>
</div>
<form action="login" method="post">
账号:<input type="text" name="account"/><br/>
密码:<input type="password" name="password"/><br/>
性别:<input type="radio" name="sex" value="男" checked="checked" />男<br/>
<input type="radio" name="sex" value="女"/>女<br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
- 登录成功页面
LoginSuccess.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录成功</title>
</head>
<body>
<%--通过getAttribute方法获取到指定的参数名(name)对应的值;若不存在,则返回 null 值--%>
<python 模块 SQLalchemy
要求的参考折叠规则的简明解释:(1) A& & -> A& , (2) A& && -> & , (3) && &a
Java String 将 '&' 替换为 & 而不是 & 到 &
Oracle基本语法&&函数&&子查询&&分页查询&&排序&&集合操作&&高级分组函数