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初始化要用的参数
pageJSP页面本身

在一般的页面不含有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对象来代表这个请求。
返回值类型方法注释
voidsetAttribute(String name,Object obj)设置属性的属性值
ObjectgetAttribute(String name)返回指定 name的属性值,若不存在,则返回 null 值
voidremoveAttribute(String name)删除请求中的一个属性
StringgetParameter(String name)获取客户端传送给服务器端的参数
EnumerationgetAttributeNames()返回 request 对象的所有属性的集合
EnumerationgetParameterNames()获取客户端传送的所有参数的集合
StringgetParameterValues(String name)获取指定name的所有值
StringgetCharacterEncoding()返回请求正文中所使用的字符编码
intgetContentLength()获取请求数据的长度(字节数),若不确定则返回 -1
StringgetContenType()获取请求体的数据类型(MIME 类型)
ServletlnputStreamgetInputStream()获取请求的输入流,显示请求中的数据
StringgetProtocol()获取客户端向服务器端传送数据的协议名称
StringgetMethod()获取客户端向服务器端传送数据的参数方法,(get/post)
StringgetServerName()获取服务器的主机名
StringgetRemoteAddr()获取客户端的网络地址
StringgetRemoteHost()获取发送请求的客户端主机名
StringgetRealPath(String path)获取指定路径的真实路径
cookie[]get Cookie()获取所有 Cookie 对象
booleanisSecure()判断当前请求是否使用安全协议
booleanisRequestedSessionldPromCookie()判断会话是否使用 Cookie 管理会话 ID
booleanisRequestedSessionIdFromURL()判断会话是否使用 URL 管理会话ID
booleanisRequestedSessionldFromVoid()判断请求的会话 ID 是否合法
intgetServerPort()获取服务器的端口号

response对象


Response对象是javax.servlet.http.HttpServletResponse类的实例。

  • 代表响应对象,主要用于向客户端发送数据
  • 包含了响应客户请求的有关信息。
返回值类型方法注释
voidsengRedirect(java.lang.String location)将响应发送到另一个位置进行处理
voidaddCookie(Cookie cookie)添加指定参数Cookie
voidaddHeader(String name,String value)添加 HTTP 文件指定的头信息
StringencodeURL(String url)将 URL 进行指定编码,返回包含 Session ID 的 URL
voidflushBuffer()将缓冲区内容发送到客户端
intgetBufferSize()获取响应所使用的实际缓冲区大小,若无缓冲区则返回 0
voidsetBufferSize(int size)设置响应体的首选缓冲区大小
booleanisCommitted()判断响应是否已提交;(提交的响应包含状态码和报头)
voidreset()清除缓冲区存在的数据,包括状态码和报头
ServletOutputStreamgetOutputStream()获取传到客户端的输出流对象
voidsendError(int errnum)向客户端发送错误信息
voidsetCotentType(String type)设置响应的 数据类型(MIME 类型)
voidsetHeader(String name,String value)设置指定name的 HTTP文件头信息
voidsetCotentLength(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接口中定义的部分方法

返回值类型方法注释
voidsetAttribute(String key,Object value)以key/value的形式保存对象值
ObjectgetAttribute(String key)通过key获取对象值
voidremoveAttribute(String key)通过key删除属性
intgetMaxInactiveInterval( )获取session的有效非活动时间,以秒为单位
voidsetMaxInactiveInterval (int interval )设置session的最大非活动时间,以秒为单位,超时将被销毁。如果参数是负数,表示永远不失效。
longgetCreationTime( )获取 session 的创建时间,以毫秒为单位
longgetLastAccessedTime( )获取 session 中客户端最近一次请求的时间。(以毫秒为单位),由 1970年1月1日起。可计算用户在站点上停留的时间
StringgetId( )获取session对象的会话ID
voidinvalidate( )设置session对象失效,销毁session对象
booleanisNew( )判断该session对象是不是一个新创建的会话对象
EnumerationgetAttributeName( )获取 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 将 '&' 替换为 & 而不是 & 到 &amp;

Oracle基本语法&&函数&&子查询&&分页查询&&排序&&集合操作&&高级分组函数

breakpoints &amp;&amp; lldb &#160;&amp;&amp; chisel 的使用

&&&&数组去重方法总结&&&&&