Cookie
1.Cookie介绍
- Cookie是由服务端创建,由若干个键值对组成的数据,并且随着响应以文件的形式将Cookie数据保存在客户端本地。当浏览器再次访问服务器时会携带Cookie数据,从而实现多次请求的数据共享。
- 作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中获取,以提高效率
2.Cookie常见属性
属性名 | 作用 | 是否重要 |
---|---|---|
name | Cookie名称 | 必须属性 |
value | Cookie的值(不支持中文) | 必须属性 |
path | Cooike的路径 | 重要 |
domain | Cookie的域名 | 重要 |
maxAge | Cooike的存活时间 | 重要 |
version | Cookie的版本号 | 不重要 |
comment | Cookie的描述 | 不重要 |
3.Cookie的方法
Cookie(String name,String value)
构造方法创建对象
属性对应的set和get方法 (name属性只有一个get方法,name属性是被final修饰的)
获取和赋值
- 添加:HttpServletResponse
public void addcookie(Cookie cookie)
向客户端添加cookie
- 获取:HttpServletRequest
public void getCookie()
获取所有的Cookie
4.Cookie的使用
- 数量限制:每个网站最多只能有20个Cookie,且大小不超过4KB,所有网站的Cookie总数不能超过300个
- 名称限制:Cookie的名称只能包含ASCII码表的字母,字符字符,不能包含逗号,分号,空格,不能以$开头,Cookie的值不支持中文
- 存活时间的限制setMaxAge()方法接受数字
- 负整数:当前会话有效,浏览器关闭则清除
- 0:立即清除
- 正整数:以秒为单位设置存活时间
- 访问路径限制
- 默认路径:取自第一次访问的资源路径前缀,只要以这个路径开头就可以访问到
- 设置路径:setPath()方法设置指定路径。
@WebServlet("/cookie")
public class CookieServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("欢迎访问本网站,你的最后访问时间为:<br>");
//创建对象,记录最后访问时间
Cookie cookie = new Cookie("time", System.currentTimeMillis() + "");
//设置最大存活时间
cookie.setMaxAge(3600);
//把cookie对象加入客户端
resp.addCookie(cookie);
//获取Cookie
Cookie[] cookies = req.getCookies();
for (Cookie c : cookies) {
if ("time".equals(c.getName())){
String value = c.getValue();
//转换格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(Long.parseLong(value));
String format = sdf.format(date);
resp.getWriter().write(format);
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
5.Cookie使用细节
1. 一次可不可以发送多个cookie?
答:可以,使用response调用多次addCookie方法发送即可。
2. cookie在浏览器中保存多长时间?
答:默认情况下,当浏览器关闭后,Cookie数据被销毁。
如果需要持久化存储:
setMaxAge(int seconds)
正数:指定cookie存活时间,时间到后,cookie文件自动失效
负数:默认值
零:删除cookie信息
3. Cookie能不能存储中文?
答:可以存中文,但是需要采用URL编码进行存储
//"中文" URL编码---> %E4%B8%AD%E6%96%87
String encode = URLEncoder.encode("中文","utf-8");
//"%E4%B8%AD%E6%96%87" URL编码---> "中文"
String decode = URLDecoder.decode(encode, "utf-8");
4. Cookie共享问题
1. 同一个Tomcat容器中部署多个Web项目,Cookie能在多个Web项目中共享吗?
答: 默认情况下cookie不能共享。
但是可以通过setPath(String path) 设置Cookie的访问范围,默认情况下,设置当前的虚拟目录。
* 如果需要共享,可以将path设置为"/"
2. 不同的tomcat服务器间cookie能共享吗?
答:也是可以的,但是需要设置访问域名。
setDomain(String path)
如果设置一级域名相同,那么多个服务器之间cookie可以共享
setDomain(".baidu.com")
那么tieba.baidu.com和news.baidu.com中cookie可以共享
Cookie的路径限制
取自第一次访问的资源路径前缀只要以这个前缀开头(包括子级路径)可以获取到,反之获取不到
Session
1.HttpSession介绍
HttpSession:服务器端会话技术
- 本质也是采用客户端会话管理技术。客户端保存的是一个特殊的标识,而共享的数据保存到服务器端的内存对象中。每次请求时,会将特殊标识带到服务器端,根据这个特殊标识来找到对应的内存空间,从而实现数据共享
- 是Servlet规范中的四大域对象之一的会话域对象
- 作用:实现数据的共享
第一次请求的时候,服务器会创建一个带有id的Session的对象,然后服务器会把session的id以cookie的形式发送给客户端,第二次请求的时候根据id判断是否是同一个session对象,从而实现数据共享。
2.HttpSession常用方法
public void setAttribute(String name,Object value)
设置共享数据
public Object getAttribute(String name)
获取共享数据
public void removeAttribute(String name)
移除共享数据
public String getId()
获取唯一标识名称
public void Invalidate()
让session立即失效
3.HttpSession的获取
HttpSession实现类对象是通过HttpServletRequest对象来获取。
public HttpSession getSession()
获取HttpSession对象
public HttpSession getSession(boolean create)
获取HttpSession对象,未获取到是否自动创建
4.HttpSession的使用
- SessionServletDemo01
@WebServlet("/sessionServletDemo01")
public class SessionServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求对象的用户名
String username = req.getParameter("username");
//2.获取HttpSession对象
HttpSession session = req.getSession();
//3.添加到共享数据
session.setAttribute("username",username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
- SessionServletDemo02
@WebServlet("/sessionServletDemo02")
public class SessionServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取HttpSession对象
HttpSession session = req.getSession();
//2.获取共享域的数据
Object username = session.getAttribute("username");
//3.响应给浏览器
resp.getWriter().write(username+"");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
- HttpSession的使用细节
-唯一标识的查看
-浏览器禁用Cooike
方式一:通过提示信息告知用户,大部分网站采用的解决方式(推荐)
方式二:访问时拼接jsessionid标识,通过encodeURL()方法重写此地址(了解)
-钝化和活化
钝化:序列化
活化:反序列化
JSP
1.JSP介绍
- JSP:是一个动态网页技术标准
- JSP部署在服务器上,可以出来客户端发送的请求,并根据请求内容动态的生成HTML、XML或者其他格式文档的web网页,然后响应给客户端
- JSP是基于java语言的,它本质介绍Servlet
2.JSP的执行过程
1. 当客户端发送请求访问服务端的`index.jsp`页面
2. 服务器内部会把`.jsp`文件翻译成`.java`文件
3. 再编译`.java`文件生成`.class`文件,
4. 由字节码完成请求与响应的操作(其实这个字节码就是Servlet)
3.JSP语法
- JSP注解
<%--注释内容--%>
- java代码块
<% java代码 %>
<%
System.out.println("hello jsp"); //输出到控制台
out.println("hello jsp"); //输出到页面
%>
- JSP表达式
<%=表达式%>
<%="hello"%>
- JSP声明
如果加! 代表的是声明的是成员变量
如果不加! 代表的是声明的是局部变量
<%!声明变量或者方法%>
<%! String s = "abc";%>
<%=s%> //输出结果
4.JSP指令
JSP指令是用来设置与整个JSP页面相关的属性。主要关注3个指令page、include、tablib
page指令:用来设置jsp页面的字符集、MIME响应类型、导入Java包等
include指令:用于在当前jsp页面中引入静态或动态资源
tablib指令:引入第三方标签库,也可以是自定义标签(先了解,后面讲)
- page指令
<%@ page 属性名=属性值 属性名=属性值...%>
<%--设置响应MIME类型,以及编码--%>
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<%--导入Java包--%>
<%@ page import="java.util.ArrayList" %>
<%--设置jsp页面编码--%>
<%@ page pageEncoding="utf-8"%>
<%--当页面发生错误时跳转到指定的error.jsp错误页面--%>
<%@ page errorPage="error.jsp"%>
下面我们创建一个
JSPDemo2.jsp
页面,但是因为该页面有异常,需要跳转到一个错误页面error.jsp
定义JSPDemo2.jsp
页面,使用ArrayList集合获取元素时产生一个异常
<%@ page contentType="text/html;charset=utf-8" language="java" %>
<%@ page import="java.util.ArrayList" %>
<%@ page pageEncoding="utf-8"%>
<%@ page errorPage="error.jsp"%>
<html>
<head>
<title>JSP脚本</title>
</head>
<body>
<%
ArrayList list=new ArrayList();
list.get(0);
%>
</body>
</html>
定义error.jsp
页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--表示该页面为异常页面,并且在页面中可以使用exception对象--%>
<%@ page isErrorPage="true" %>
<html>
<head>
<title>异常页面</title>
</head>
<body>
<h1>页面走丢了...关爱留守儿童</h1>
<img src="img/error.jpg" width="800" height="500">
</body>
</html>
-
include指令
<%@include file = 包含的页面%>
include 指令用于引入其他文件中的内容,使其合并到当前 JSP 页面,这些引入的文件可以是 JSP 页面、HTML 页面、文本文件或是一段 Java 代码。
下面我们把
date.jsp
页面引入到include.jsp
页面中定义
定义date.jsp
页面<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日--HH时mm分ss秒"); Date date = new Date(); out.println(simpleDateFormat.format(date)); %> </body> </html>
定义
include.jsp
页面<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>JSP指令</title> </head> <body> <h1>include指令引入 动态date.jsp资源</h1> 当前时间为:<%@include file="date.jsp"%> </body> </html>
-
taglib指令
可以引入外部标签库
<%@taglib url=标签库地址 prefix=前缀名称%>
5.九大隐藏式对象
在jsp页面中有9个内置对象,这些对象不需要创建可以直接使用,与Servlet中使用到的相关对象对象。
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,获取其他8个内置对象 |
request | HttpServletRequest | 一次请求访问的多个资源共享数据(请求转发) |
reponse | HttpServletReponse | 响应对象 |
session | HttpSession | 一次会话的多个请求间共享数据 |
application | ServletContext | 所有用户间共享数据 |
page | Object | 当前Servlet对象(this) |
out | JspWriter | 输出对象把数据输出到页面上 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
重点掌握个对象
request: 请求对象
response: 响应对象
out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
response.getWriter()和out.write()的区别:
* 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
* response.getWriter()数据输出永远在out.write()之前
6.四大域对象
域对象名称 | 范围 | 级别 | 备注 |
---|---|---|---|
PageContext | 页面范围 | 最小,只能在当前页面用 | 因范围太小,开发中用的很少 |
ServletRequest | 请求范围 | 一次请求或者当前请求转发用 | 请求转发之后,再次转发时请求域丢失 |
HttpSession | 会话范围 | 多次请求数据共享时使用 | 多次请求共享数据,但不同的客户端不能共享 |
Servletcontext | 应用范围 | 最大,整个应用都可以使用 | 尽力少用,如果对数据有修改需要做同步处理 |
PageContext对象
- 是jsp独有的,Servlet没有
- 是四大域对象之一的页面域对象,可以操作其他三个域对象中的属性
- 可以获取其他八个隐式对象
- 生命周期随着jsp的创建而存在,随着jsp的结束而消失,每个jsp页面都有一个PageContext对象
MVC模型
1.JSP的演变
- 在早期JavaEE开发是没有JSP技术的,只有使用Servlet往浏览器输出HTML标签和内容数据。在Java代码中拼接HTML代码非常痛苦。
- 后来有了JSP技术,简化了Servlet的开发。可是又延伸出另一个问题,在HTML页面中嵌套了过多的Java代码,不利于阅读和维护。
- 为了解决Java代码和HTML代码耦合性强的问题,JavaWeb项目开发引入了MVC开发模式,从而把页面展示和业务逻辑分离。采用MVC模式让程序设计更加合理。
2.MVC介绍
MVC它只是一种开发设计原则,并不是新的技术。MVC只是用来指导我们改善应用程序的结构,从而得到更好的开发和维护效率。
MVC是Module、View、Controller三个单词的缩写,也叫MVC三层模型,每一层负责完成不同的工作。
Module(模型层): 模型层用于封装数据(JavaBean对象),和一些业务逻辑处理。
Controller(控制层): 它控制着数据的流向
1.先接受用户的请求数据
2.将数据交给模型层处理
3.将处理后的数据交给视图层
View(视图层):视图层用于展示数据