属性名 | 作用 | 是否重要 |
---|---|---|
name | COOKIE名称 | 必须属性 |
value | COOKIE的值(不支持中文) | 必须属性 |
path | Cooike的路径 | 重要 |
domain | COOKIE的域名 | 重要 |
maxAge | Cooike的存活时间 | 重要 |
version | COOKIE的版本号 | 不重要 |
comment | COOKIE的描述 | 不重要 |
COOKIE(String name,String value)构造方法创建对象
属性对应的set和get方法 (name属性只有一个get方法,name属性是被final修饰的)获取和赋值
public void addCOOKIE(COOKIE COOKIE)向客户端添加COOKIE
public void getCOOKIE()获取所有的COOKIE
@WebServlet("/COOKIE")
public class COOKIEServletDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html;charset=UTF-8");resp.getWriter().write("欢迎访问本网站,你的最后访问时间为:
");//创建对象,记录最后访问时间COOKIE COOKIE = new COOKIE("time", System.currentTimeMillis() + "");//设置最大存活时间COOKIE.setMaxAge(3600);//把COOKIE对象加入客户端resp.addCOOKIE(COOKIE);//获取COOKIECOOKIE[] 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);}}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
1. 一次可不可以发送多个COOKIE? 答:可以,使用response调用多次addCOOKIE方法发送即可。2. COOKIE在浏览器中保存多长时间?答:默认情况下,当浏览器关闭后,COOKIE数据被销毁。如果需要持久化存储:setMaxAge(int seconds)正数:指定COOKIE存活时间,时间到后,COOKIE文件自动失效负数:默认值零:删除COOKIE信息3. COOKIE能不能存储中文?答:可以存中文,但是需要采用URL编码进行存储//"中文" URL编码---> %E4%B8%AD%E6%96%87String 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
HttpSession:服务器端会话技术
第一次请求的时候,服务器会创建一个带有id的Session的对象,然后服务器会把session的id以COOKIE的形式发送给客户端,第二次请求的时候根据id判断是否是同一个session对象,从而实现数据共享。
public void setAttribute(String name,Object value)设置共享数据
public Object getAttribute(String name)获取共享数据
public void removeAttribute(String name)移除共享数据
public String getId()获取唯一标识名称
public void Invalidate()让session立即失效
HttpSession实现类对象是通过HttpServletRequest对象来获取。
public HttpSession getSession()获取HttpSession对象
public HttpSession getSession(boolean create)获取HttpSession对象,未获取到是否自动创建
@WebServlet("/sessionServletDemo01")
public class SessionServletDemo01 extends HttpServlet {@Overrideprotected 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);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
@WebServlet("/sessionServletDemo02")
public class SessionServletDemo02 extends HttpServlet {@Overrideprotected 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+"");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req,resp);}
}
-唯一标识的查看
-浏览器禁用Cooike方式一:通过提示信息告知用户,大部分网站采用的解决方式(推荐)方式二:访问时拼接jsessionid标识,通过encodeURL()方法重写此地址(了解)-钝化和活化钝化:序列化活化:反序列化
JSP
1. 当客户端发送请求访问服务端的`index.jsp`页面
2. 服务器内部会把`.jsp`文件翻译成`.java`文件
3. 再编译`.java`文件生成`.class`文件,
4. 由字节码完成请求与响应的操作(其实这个字节码就是Servlet)
<%--注释内容--%>
<% java代码 %><%System.out.println("hello jsp"); //输出到控制台out.println("hello jsp"); //输出到页面
%>
<%&#61;表达式%><%&#61;"hello"%>
如果加&#xff01; 代表的是声明的是成员变量
如果不加&#xff01; 代表的是声明的是局部变量
<%!声明变量或者方法%><%! String s &#61; "abc";%>
<%&#61;s%> //输出结果
JSP指令是用来设置与整个JSP页面相关的属性。主要关注3个指令page、include、tablib
page指令&#xff1a;用来设置jsp页面的字符集、MIME响应类型、导入Java包等
include指令&#xff1a;用于在当前jsp页面中引入静态或动态资源
tablib指令&#xff1a;引入第三方标签库&#xff0c;也可以是自定义标签(先了解&#xff0c;后面讲)
<%&#64; page 属性名&#61;属性值 属性名&#61;属性值...%>
<%--设置响应MIME类型,以及编码--%>
<%&#64; page contentType&#61;"text/html;charset&#61;utf-8" language&#61;"java" %>
<%--导入Java包--%>
<%&#64; page import&#61;"java.util.ArrayList" %>
<%--设置jsp页面编码--%>
<%&#64; page pageEncoding&#61;"utf-8"%>
<%--当页面发生错误时跳转到指定的error.jsp错误页面--%>
<%&#64; page errorPage&#61;"error.jsp"%>
下面我们创建一个
JSPDemo2.jsp
页面&#xff0c;但是因为该页面有异常&#xff0c;需要跳转到一个错误页面error.jsp
定义JSPDemo2.jsp
页面&#xff0c;使用ArrayList集合获取元素时产生一个异常
<%&#64; page contentType&#61;"text/html;charset&#61;utf-8" language&#61;"java" %>
<%&#64; page import&#61;"java.util.ArrayList" %>
<%&#64; page pageEncoding&#61;"utf-8"%>
<%&#64; page errorPage&#61;"error.jsp"%>
<html>
<head><title>JSP脚本</title>
</head>
<body><%ArrayList list&#61;new ArrayList();list.get(0);%>
</body>
</html>
定义error.jsp
页面
<%&#64; page contentType&#61;"text/html;charset&#61;UTF-8" language&#61;"java" %>
<%--表示该页面为异常页面&#xff0c;并且在页面中可以使用exception对象--%>
<%&#64; page isErrorPage&#61;"true" %>
<html>
<head><title>异常页面</title>
</head>
<body><h1>页面走丢了...关爱留守儿童</h1><img src&#61;"img/error.jpg" width&#61;"800" height&#61;"500">
</body>
</html>
include指令
<%&#64;include file &#61; 包含的页面%>
include 指令用于引入其他文件中的内容&#xff0c;使其合并到当前 JSP 页面&#xff0c;这些引入的文件可以是 JSP 页面、HTML 页面、文本文件或是一段 Java 代码。
下面我们把
date.jsp
页面引入到include.jsp
页面中
定义定义date.jsp
页面
<%&#64; page contentType&#61;"text/html;charset&#61;UTF-8" language&#61;"java" %>
<html>
<head><title>Title</title>
</head>
<body><%SimpleDateFormat simpleDateFormat &#61; new SimpleDateFormat("yyyy年MM月dd日--HH时mm分ss秒");Date date &#61; new Date();out.println(simpleDateFormat.format(date));%>
</body>
</html>
定义include.jsp
页面
<%&#64; page contentType&#61;"text/html;charset&#61;UTF-8" language&#61;"java" %>
<html>
<head><title>JSP指令</title></head><body><h1>include指令引入 动态date.jsp资源</h1>当前时间为&#xff1a;<%&#64;include file&#61;"date.jsp"%>
</body>
</html>
taglib指令
可以引入外部标签库
<%&#64;taglib url&#61;标签库地址 prefix&#61;前缀名称%>
在jsp页面中有9个内置对象&#xff0c;这些对象不需要创建可以直接使用&#xff0c;与Servlet中使用到的相关对象对象。
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,获取其他8个内置对象 |
request | HttpServletRequest | 一次请求访问的多个资源共享数据(请求转发) |
reponse | HttpServletReponse | 响应对象 |
session | HttpSession | 一次会话的多个请求间共享数据 |
application | ServletContext | 所有用户间共享数据 |
page | Object | 当前Servlet对象&#xff08;this&#xff09; |
out | JspWriter | 输出对象把数据输出到页面上 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
重点掌握个对象request&#xff1a; 请求对象response&#xff1a; 响应对象out&#xff1a;字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似response.getWriter()和out.write()的区别&#xff1a;* 在tomcat服务器真正给客户端做出响应之前&#xff0c;会先找response缓冲区数据&#xff0c;再找out缓冲区数据。* response.getWriter()数据输出永远在out.write()之前
域对象名称 | 范围 | 级别 | 备注 |
---|---|---|---|
PageContext | 页面范围 | 最小&#xff0c;只能在当前页面用 | 因范围太小&#xff0c;开发中用的很少 |
ServletRequest | 请求范围 | 一次请求或者当前请求转发用 | 请求转发之后&#xff0c;再次转发时请求域丢失 |
HttpSession | 会话范围 | 多次请求数据共享时使用 | 多次请求共享数据&#xff0c;但不同的客户端不能共享 |
Servletcontext | 应用范围 | 最大&#xff0c;整个应用都可以使用 | 尽力少用&#xff0c;如果对数据有修改需要做同步处理 |
PageContext对象
MVC它只是一种开发设计原则&#xff0c;并不是新的技术。MVC只是用来指导我们改善应用程序的结构&#xff0c;从而得到更好的开发和维护效率。
MVC是Module、View、Controller三个单词的缩写&#xff0c;也叫MVC三层模型&#xff0c;每一层负责完成不同的工作。
Module(模型层): 模型层用于封装数据&#xff08;JavaBean对象&#xff09;&#xff0c;和一些业务逻辑处理。
Controller(控制层): 它控制着数据的流向1.先接受用户的请求数据2.将数据交给模型层处理3.将处理后的数据交给视图层
View(视图层):视图层用于展示数据