(大章)JSP内置对象+Cookie详解+小案例(登录\退出\记住密码)

JSP内置对象

JSP内置对象是在jsp页面不加声明和创建就可以在脚本中使用的对象。

jsp脚本中一共内置好了九个对象:

out:向客户端输出;
request:封装用户请求;
response:向用户做出响应,在servlet中使用;
session:客户和服务器见的对话;
application:于服务器启动时开始运行,用来存放全局变量,在用户间共享;
pageContext:用于访问page的各种对象;
exception:异常;
config:初始化要用的参数;
page:JSP页面本身。

内置对象-out

1.out对象是javax.servlet.jsp.JspWriter的实例;

2.out = pageContext.getOut();

3.该实例对象代表JSP页面的输出流,用于向客户端页面输出数据。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>内置对象</title>
</head>
<body>
    <%
    	//直接输出到页面
        out.print("<h1>内置对象out</h1>");
    %>
</body>
</html>

内置对象-request

request是javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象内。

request对象的生命周期:开始于一次请求的发起,结束于一次请求的响应

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>内置对象</title>
</head>
<body>
    <%
    	//将访问本页面的请求转发到out页面,显示out.jsp
        request.getRequestDispatcher("out.jsp").forward(request,response);
    %>
</body>
</html>
request实现请求转发

1.请求转发是指将请求在转发到另一资源,此过程依然在同一个请求范围,转发后浏览器地址栏内容不变。

2.请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发到另一个资源,并让该资源对浏览器的请求进行响应。

在这里插入图片描述

request请求传递对象

request对象同时也是一个域对象,可以通过request对象在实现转发时把数据通过request对象传递给其它web资源处理,所要用到的方法有:

set.Attribute("name",value):通过name-value的方式将数据封装;
get.Attribute("name"):在被转发的资源中通过name获取传递过来的value;
removeAttribute("name"):通过name删除要转发的资源.
 @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException{
        //封装数据
        req.setAttribute("msg", "账号或密码错误!");
        //请求转发到login.jsp,可以通过request.getAttribute("msg")在login.jsp中拿到数据
        req.getRequestDispatcher("login.jsp").forward(req,resp);
            
}

内置对象-response

response是HttpServletResponse类的实例,response对象包含了响应客户请求的有关信息。

response实现重定向

1.重定向是指页面重新定位到某个新的地址,之前的请求失效,进入一个新的请求,且跳转后浏览器的地址栏内容将变为新的指定地址。

2.重定向是通过HttpServletResponse对象的sendRedirect()来实现,该方法相当于浏览器重新发送一个请求。

在这里插入图片描述

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException{
    //重新定向到一个新的地址login.jsp,会重新发出一个请求login.jsp
    resp.sendRedirect("login.jsp");
}

内置对象-session

1.Session对象是javax.servlet.http.HttpSession的实例,它在第一个JSP页面被装载时自动创建,完成会话期管理。

2.会话:就是客户端与服务器端的一次交互会话,开始于浏览器打开链接上的服务器,截止于浏览器关闭。

3.session对象的作用:
(1)客户端与服务器的会话识别;
(2)在同一个会话中可以存储共享数据(存储登录用户信息,开新页面不会丢失信息)。

session会话机制

1.当浏览器和客户端第一次会话时,浏览器会创建一个新的HttpSession对象,生成一个随机数,称为会话ID,并将ID值封装成一个名字为JSESSIONID的session,返回给客户端。

在这里插入图片描述

在这里插入图片描述

2.调用request.getSession方法获得会话对象时,容器会先从request中获取JSESSIONID值,根据JSESSIONID值查找对应的会话对象那个,返回使用。

session对象的常用方法

session对象的方法是HttpSession接口中定义的一系列方法

返回值方法名作用
voidsetAttribute(“key”,Object value)以key/value的形式保存对象值
ObjectgetAttribute(“key”)通过key获取值
voidremoveAttribute(“key”)通过key删除值
intgetMaxInactiveInterval()获取session的有效非活动时间,单位s
voidsetMaxInactiveInterval(int interval)设置session的最大非活动时间,单位s
StringgetId()获取session对象的编号
voidinvalidate()设置session对象失效
booleanisNew()判断一个session对象是不是新创键的会话对象
session对象的生命周期

1.创建:打开浏览器第一次连接到服务器 在服务器端创建session对象 响应给浏览器一个JSESSIONID(id号)的字符串2.销毁:

(1)长期不使用的session对象,服务器会自动将其销毁(默认时间为30分钟)

(2)强制销毁session对象 —— session.invalidate()—— 应用(安全退出)

(3)服务器关闭session对象销毁

注意:有的服务器会缓存,当服务器关闭时服务器会将session对象序列化到文件中,服务器启动时再反序列化。

3.设置会话时间

(1)可以在web.xml中进行配置,修改默认时间。

<!--50分钟后销毁session-->
<session-config>
	<session-timeout>50</session-timeout>
</session-config>

(2)使用setMaxIntervalTime设置,已秒为单位,如果参数是负数,表示永远不会失效

session.setMaxInactiveInterval(3*60*60);//设置有效时长3小时

内置对象-application

1.整个应用程序只有一个application对象,可以用来存储全局共享数据

2.生命周期:开始于服务器的启动 ,截止于服务器的关闭

内置对象-PageContext

可以在同一页面中共享数据。

内置对象-exception

1.exception是java.lang.Throwable的实例;

2.该实例代表其它页面中的异常和错误。只有当页面是错误处理页面,即编译指令page的isErrorPage属性为true时,该对象才可以使用。

3.常用的方法有

exception.getMessage():返回异常信息字符串;
exception.toString():异常信息简单描述;
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>出错页面</title>
</head>
<body>
    阿偶 &nbsp&nbsp&nbsp&nbsp 程序走神了<hr/>
    <%--开发期间需要显示异常信息--%>
    <%
        exception.printStackTrace();
        out.print(exception.getMessage());
    %>
</body>
</html>

web开发的四大作用域

web开发中存储数据的四大作用域由小到大分别为

1.PageContext:在同一页面中传递数据;

2.request:在一次请求中共享数据;

3.session:在同一会话中共享数据;

4.application:在同一个应用程序中共享数据,即跨客户端共享数据。

Cookie

Cookie概述

1.通过Cookie对象,可以从服务器端响应一些信息,这些信息可以存储在浏览器的内存中,浏览器关闭,数据就不存在。

2.可以给cookie中的信息设置有效时间,就可以保存在电脑硬盘上,到期后自动删除。

3.Cookie是保存在客户端的小文本,保存的位置有两种:

(1)Cookie可以保存在客户端浏览器的所占内存中,关闭浏览器后,Cookie就不再存在。

(2)Cookie也可以保存在客户PC机的硬盘上,设置有效时间,超过有效时间后失效。

Cookie类的使用

创建Cookie对象

1.在Servlet API中,存在类Cookie,可以使用new关键字创建cookie对象。

Cookie newCookie = new Cookie("name","value");

2.Cookie对象是保存一堆键值对,都是字符串形式。

Cookie类的常用方法
返回值方法名描述
voidsetMaxAge(int expiry)设置Cookie有效期,以秒为单位
voidsetValue(String value)在Cookie创建后,对Cookie进行赋值
StringgetName()获取Cookie的名称
StringgetValue()获取Cookie的值
StringgetMaxAge()获取Cookie的有效时间,以秒为单位
保存及获取Cookie

1.Cookie要保存到客户端,就要将cookie的内容写在响应当中。

HttpServletResponse中提供了方法,可以将Cookie保存在响应中传给客户端。

String value = "admin";
//创建cookie对象
Cookie cookie = new Cookie("name", value);
//设置cookie最大保存时间
cookie.setMaxAge(3 * 60 * 60);
//保存cookie对象响应给客户端
resp.addCookie(cookie);

2.再次访问于保存Cookie相同域名的网站时,HTTP协议会将有效时间内的Cookie都发送到服务器,容器会把Cookie封装到请求中,HttpServletRequest类提供了获取cookie对象的方法。

中文解码:

Cookie[] cookies = request.getCookies();
cookie.getName();
cookie.getValue();

Cookie与Session的区别

1.session是在服务器端保存用户信息,Cookie是在客户端保存用户信息;

2.session中保存的是任意对象,Cookie保存的是字符串;

3.session生命周期结束后,信息随之消失,Cookie可以长期保存在客户端的硬盘中,也可以临时保存在浏览器的内存中。

小案例(登录,退出,记住密码)

login.jsp登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<%
    //记住密码获取Cookie中的数据
    String acc = "";
    String pw = "";
    Cookie[] cookies = request.getCookies();
    if (cookies != null) {
        for (Cookie c : cookies) {
            if (c.getName().equals("acc")) {
                acc = c.getValue();
            }
            if (c.getName().equals("pass")) {
                pw = c.getValue();
            }
        }
    }

%>

<%
    String msg = (String) request.getAttribute("msg");
    out.print(msg);
%>
<form action="/login" method="post">
    账号:<input type="text" name="account" value="<%out.print(acc);%>"><hr>
    密码:<input type="text" name="passwd" value="<%out.print(pw);%>"><hr>
    <input type="submit" value="登录">
    记住密码?<input type="checkbox" name="ck" value="ck">
</form>
</body>
</html>

Servlet后台处理代码

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet(name = "login", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //为了简单就不与数据库交互了,定好账号密码
        String number = "admin";
        String pw = "123";
        //获取客户端的数据
        String account = req.getParameter("account");
        String passwd = req.getParameter("passwd");
        String ck = req.getParameter("ck");
        //处理
        if (account == null || passwd == null) {
            req.setAttribute("msg", "账号或密码不能为空");
            req.getRequestDispatcher("/login.jsp").forward(req, resp);
        } else {
            if (account.equals(number) && passwd.equals(pw)) {
                if (ck != null) {
                    //创建Cookie对象,保存密码
                    Cookie acc = new Cookie("acc", account);
                    Cookie pass = new Cookie("pass", passwd);
                    //设置最大保存时间
                    acc.setMaxAge(3 * 60 * 60);
                    pass.setMaxAge(3 * 60 * 60);
                    //响应到客户端
                    resp.addCookie(acc);
                    resp.addCookie(pass);
                }
                //创建session对象,保存整个会话期间到能拿到的数据
                HttpSession session = req.getSession();
                session.setAttribute("account", account);
                //跳转到成功界面
                req.getRequestDispatcher("/success.jsp").forward(req, resp);
            } else {
                req.setAttribute("msg", "账号或密码错误");
                req.getRequestDispatcher("/login.jsp").forward(req, resp);
            }
        }
    }

    //退出

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.invalidate();//销毁session
        // 重定向到登录页面
        resp.sendRedirect("/login.jsp");
    }
}

success.jsp登录成功/安全退出页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录成功</title>
    <script type="text/javascript">
        function exit() {
            if (confirm("您确定要退出吗")) {
                location.assign("/login")
            };
        }
    </script>
</head>
<body>
<%
    out.print("欢迎" + session.getAttribute("account") + "登录");
%>
<input type="button" value="安全退出" οnclick="exit()"/>
</body>
</html>

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值