目录
Cookie
Cookie概述
Cookie常见的属性
Cookie细节
Cookie案例
Session
Session概述
Session方法
Session案例
JSP页面
JSP概述
JSP语法
JSP指令
JSP四大域对象
MVC模型
JSP的演变
MVC介绍
Cookie是由服务端创建,由若干个键值对组成的数据,并且随着响应以文件的形式将Cookie数据保存在客户端本地。当浏览器再次访问服务器时会携带Cookie数据,从而实现多次请求的数据共享。
属性名 | 作用 |
---|---|
name | Cookie名称 |
value | Cookie的值 |
path | Cooke的路径 |
domain | Cookie的域名 |
maxAge | Cookie的存活时间 |
version | Cookie的版本号 |
comment | 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可以共享
在浏览器中访问http://localshot/day04_servlet/cookieDemo3,要求如下
如果是第一次访问,显示 【欢迎光临,第一次访问此页】
如果是第二次访问,显示 【欢迎回来,上一次的访问时间为 yyyy年MM月dd日 HH:mm:ss】
分析思路:
1) 获取所有的Cookie对象
Cookie[] req.getCookies(); //获取所有的Cookie对象
2) 查找lasttime名称的Cookie是否存在
如果不存在:说明是第一次访问,使用Cookie记录这一次访问的时间
Cookie名称:"lasttime"
Cookie值:当前时间的毫秒值
如果存在:说明不是第一次访问,
1. 获取"lasttime"名称Cookie对应的毫秒值
2. 将毫秒值转换为"yyyy-MM-dd HH:mm:ss"格式的字符串,响应给浏览器
3. 修改Cookie的时间为当前时间,再重新写回浏览器
cookie对象.setValue("新的值") //设置cookie的值
resp.addCookie(cookie对象)
@WebServlet("/cookieDemo3")
public class CookieDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理响应的中文乱码
resp.setContentType("text/html;charset=utf-8");
//获取所有的Cookie
Cookie[] cookies = req.getCookies();
//判断是否有lasttime名称的cookie
int index = -1; //规定-1表示没有
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i] != null) {
if (cookies[i].getName().equals("lasttime")) {
index = i;
break;
}
}
}
}
//如果没有lasttime名称的cookie,就说明是第一次访问,记录访问的时间
if (index == -1) {
Cookie cookie = new Cookie("lasttime", System.currentTimeMillis() + "");
cookie.setMaxAge(30);
resp.addCookie(cookie);
resp.getWriter().write("欢迎光临,第一次访问本网站");
}
//如果有lasttime名称的cookie,就说明不是第一次访问,获取访问时间,重新记录当前时间
if (index != -1) {
//获取值
String value = cookies[index].getValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(new Date(Long.parseLong(value)));
resp.getWriter().write("欢迎回来,上一次访问的时间:" + time);
//重新记录新的时间
cookies[index].setValue(System.currentTimeMillis() + "");
resp.addCookie(cookies[index]);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Session是依赖于Cookie的,如图所示当客户端第一次请求服务端时没有Cookie,会在内存中创建一个Session对象并把sessionid通过Cookie存起来发给客户端;当客户端再次请求服务器时,会携带者sessionid到服务端找到对应的Session对象,以此来实现多次请求在服务端的数据共享。
public HttpSession getSession();
获取HttpSession
注意:如果加上参数false,没有Session的话,不会自动创建。
public Object getAttribute(String name)
获取Session值
public void setAttribute(String name, Object value)
设置Session值
public void removeAttribute(String name)
移除Session值
在SessionDemo1中使用Session存储数据,在SessionDemo2中获取数据
@WebServlet("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session对象
HttpSession session = req.getSession();
//把用户名存入Session对象中
Object username = session.getAttribute("username");
session.setAttribute("username","zhangsan");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
@WebServlet("/sessionDemo2")
public class SessionDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session对象
HttpSession session = req.getSession();
//获取Session值
String username = (String) session.getAttribute("username");
resp.getWriter().println(""+username+"
");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
JSP(全称Java Server Pages),是一种动态网页开发技术。它既可以使用HTML标签来写页面,也可以写Java代码。其本质就是一个Servlet。
下面是一个jsp页面的访问过程
1. 当客户端发送请求访问服务端的`index.jsp`页面
2. 服务器内部会把`.jsp`文件翻译成`.java`文件
3. 再编译`.java`文件生成`.class`文件,
4. 由字节码完成请求与响应的操作(其实这个字节码就是Servlet)
JSP注释
<%--这是注释--%>
JSP语法
因为JSP本质上就是一个Servlet类,而我们使用Servlet的时候,其实就是对Servlet的service方法进行复写然后对请求和响应作出处理。
<%--定义成员变量--%>
<%! int num=10;%>
<%--定义成员方法--%>
<%!
public void show(){
System.out.println("helloWorld");
}
%>
<%--调用show方法--%>
<% show() %>
<%--定义局部变量--%>
<% int num=20; %>
<%--输出语句,往浏览器输出--%>
<%="成员变量:"+this.num%>
<%="局部变量:"+num%>
JSP指令是用来设置与整个JSP页面相关的属性。主要关注3个指令page、include、tablib
page指令:用来设置jsp页面的字符集、MIME响应类型、导入Java包等
include指令:用于在当前jsp页面中引入静态或动态资源。
tablib指令:引入第三方标签库,也可以是自定义标签
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集合获取元素时产生一个异常
<%--设置响应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"%>
JSP脚本
<%
ArrayList list=new ArrayList();
list.get(0);
%>
定义error.jsp
页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--表示该页面为异常页面,并且在页面中可以使用exception对象--%>
<%@ page isErrorPage="true" %>
异常页面
页面走丢了...关爱留守儿童
include指令
include 指令用于引入其他文件中的内容,使其合并到当前 JSP 页面,这些引入的文件可以是 JSP 页面、HTML 页面、文本文件或是一段 Java 代码。
下面我们把
date.jsp
页面引入到include.jsp
页面中
定义定义date.jsp
页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日--HH时mm分ss秒");
Date date = new Date();
out.println(simpleDateFormat.format(date));
%>
定义include.jsp
页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
JSP指令
include指令引入 动态date.jsp资源
当前时间为:<%@include file="date.jsp"%>
JSP内置对象
在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()之前
域对象名称 | 作用范围 | 备注 |
---|---|---|
PageContext | 只在当前页面共享数据 | 用的较少 |
ServletRequest | 在同一条请求链中共享数据 | 用的较多 |
HttpSession | 在同一次会话的多次请求中共享数据 | 用的较多 |
ServletContext | 在整个应用中共享数据 | 用的较少 |
在早期JavaEE开发是没有JSP技术的,只有使用Servlet往浏览器输出HTML标签和内容数据。在Java代码中拼接HTML代码非常痛苦。
后来有了JSP技术,简化了Servlet的开发。可是又延伸出另一个问题,在HTML页面中嵌套了过多的Java代码,不利于阅读和维护。
为了解决Java代码和HTML代码耦合性强的问题,JavaWeb项目开发引入了MVC开发模式,从而把页面展示和业务逻辑分离。采用MVC模式让程序设计更加合理。
MVC它只是一种开发设计原则,并不是新的技术。MVC只是用来指导我们改善应用程序的结构,从而得到更好的开发和维护效率。
MVC是Module、View、Controller三个单词的缩写,也叫MVC三层模型,每一层负责完成不同的工作。
Module(模型层): 模型层用于封装数据(JavaBean对象),和一些业务逻辑处理。
Controller(控制层): 它控制着数据的流向
1.先接受用户的请求数据
2.将数据交给模型层处理
3.将处理后的数据交给视图层
View(视图层):视图层用于展示数据