文章目录
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接口中定义的一系列方法
返回值 | 方法名 | 作用 |
---|---|---|
void | setAttribute(“key”,Object value) | 以key/value的形式保存对象值 |
Object | getAttribute(“key”) | 通过key获取值 |
void | removeAttribute(“key”) | 通过key删除值 |
int | getMaxInactiveInterval() | 获取session的有效非活动时间,单位s |
void | setMaxInactiveInterval(int interval) | 设置session的最大非活动时间,单位s |
String | getId() | 获取session对象的编号 |
void | invalidate() | 设置session对象失效 |
boolean | isNew() | 判断一个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>
阿偶      程序走神了<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类的常用方法
返回值 | 方法名 | 描述 |
---|---|---|
void | setMaxAge(int expiry) | 设置Cookie有效期,以秒为单位 |
void | setValue(String value) | 在Cookie创建后,对Cookie进行赋值 |
String | getName() | 获取Cookie的名称 |
String | getValue() | 获取Cookie的值 |
String | getMaxAge() | 获取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>