jsp---[jsp九大内置对象&请求转发与重定向](代码片段)

小智RE0 小智RE0     2022-12-16     138

关键词:



内置对象


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--%>
<查看详情  

jsp九大内置对象

九大内置对象及其相应的作用域: JSP中九大内置对象为: request     请求对象      类型javax.servlet.ServletRequest    Request(作用域)response  &nb 查看详情

jsp的九大内置对象

九大内置对象 jspservlet 对象名类型使用范围requestHttpServletRequest请求浏览器--->服务器responseHttpServletResponse返回服务器--->浏览器configServletConfig用来获取web.xml中的信息applicationServletContext整个项目中的全局信息exceptionThr 查看详情

jsp九大内置对象和四大作用域

...的都不是很全,今天我把各位大神的整理了一下。 JSP九大对象:内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用。一、request对象:代表的是来自客户端的请求,例如我们在... 查看详情

jsp内置对象request对象的转发与response对象的重定向

在说转发与重定向之前先说一下jsp九大内置对象的其中两个内置对象,request对象与response对象request对象request对象是最常用的JSP内置对象之一,其中包含了有关浏览器请求的信息。其中工作原理如下:简单来说就是“可以对在客... 查看详情

jsp九大内置对象

request     请求对象       类型javax.servlet.ServletRequest       作用域Requestresponse     响应 查看详情

jsp中的九大内置对象

out对象:向客户端浏览器输出各种数据request对象:封装了来自客户端浏览器的各种请求信息response对象:封装了来自服务器的响应信息exception对象:封装了jsp程序在执行过程中发生的异常和错误信息config对象:封装了应用程序的... 查看详情

整理一下jsp的九大内置对象和四大作用域

今天讲解了JSP的九大内置对象和四大作用域,简单整理一下以便以后观看。 JSP九大对象:内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用。一、request对象:代表的是来自客... 查看详情

jsp(javaserverpage)九大内置对象

×Web程序的请求相应模式(请求[request]、响应[response])×formmethod="get"和method="post"提交方式的区别                                                       ... 查看详情

jsp九大内置对象

JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception  1、request对象request对象是javax.servlet.httpServletRequest类型的对象。该对象代表了客户端的请求信息,主要用于接... 查看详情

jsp九大内置对象及其方法

内置对象包括requestresponsepageContextsessionapplicationoutconfigpageexception1.out(1)clear()清除缓冲区(2)flush()刷新缓冲区(3)newLine()创建新的一行(4)print(各种数据类型)显示数据内容(5)pringln(各种数据类型)换行显示数... 查看详情

jsp中九大内置对象和四大作用域

一共有九大内置对象:request、response、out、session、application、pageContext、page、config、exception内置对象(又叫隐含对象),就是在jsp中,不需要创建(由服务器<容器>来创建),可以直接使用的对象。 request    &... 查看详情

jsp中九大内置对象及其数据类型

JSP中九大内置对象为:  request       请求对象        类型javax.servlet.ServletRequest    作用域Request  response  &nbs 查看详情

jsp九大内置对象是哪些?

jsp隐藏对象jsp九大内置对象是:request对象,response对象,session对象,application对象,out对象,pageContext对象,config对象,page对象,exception对象。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception对象几乎定... 查看详情

jsp九大内置对象:requestresponsesessionapplicationoutpagepagecontextconfigexception

JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception1、request对象request对象是javax.servlet.httpServletRequest类型的对象。该对象代表了客户端的请求信息,主要用于接受通... 查看详情

jsp九大内置对象及四大作用域

JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception1、request对象javax.servlet.http.HttpServletRequestrequest对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服... 查看详情

(二十五)jsp九大内置对象(转)

--转载自孤傲苍狼博客一、JSP运行原理  每个JSP页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet),然后按照servlet的调用方式进行调用。... 查看详情

jsp九大内置对象之一request

     request对象,目的是用来获取客户端的请求。     主要方法有:request.getMethod();              //获取提交 查看详情