会话技术,JSP,MVC学习笔记
会话技术
会话:一次会话中包含多次请求和响应。
一次会话指浏览器第一次给服务器发送请求,会话建立,直到有一方断开为止
功能:在一次会话的范围内的多次请求间,共享数据
方式:
1.客户端会话技术(数据存于客户端):Cookie
2.服务器端会话技术(数据存于服务器):Session
Coolkie入门步骤:
(第1次请求)1.(服务器端)创建Cookie对象,绑定数据。给顾客创建一张vip卡,上面包含顾客的身份信息
new Cookie(String name, String value)
(第1次请求)2.(服务器端)发送Cookie对象(给客户端)。将vip卡给顾客。
response.addCookie(Cookie cookie)
(第1次响应)3.客户端产生响应时,收到的信息时包含响应头的信息(遵守http协议):set-cookie:msg=hello,识别到set-cookie后,客户端就会自动保存数据到本地。
(第2次请求)4.(服务器端向客户端)获取Cookie,拿到数据,拿到的数据包含cookie:msg=hello的请求头。顾客下次来的时候,要求顾客出示vip卡,给予优惠。
request.Cookie[ ] getCookies()
步骤1,2代码:(第1次请求)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @WebServlet("/cookiedemo1") 2 public class Cookiedemo1 extends HttpServlet { 3 4 @Override 5 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 6 Cookie c = new Cookie("msg","hello"); 7 resp.addCookie(c); 8 } 9 @Override 10 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 11 this.doPost(req,resp); 12 } 13 }
步骤4代码:(第2次请求)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @WebServlet("/cookiedemo2") 2 public class Cookiedemo2 extends HttpServlet { 3 4 @Override 5 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 6 Cookie[] cs = req.getCookies(); 7 if(cs!=null){ 8 for(Cookie c:cs){ 9 String name = c.getName(); 10 String value = c.getValue(); 11 System.out.println(name+":"+value); 12 } 13 } 14 15 } 16 @Override 17 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 18 this.doPost(req,resp); 19 } 20 }
启动服务器中,先运行步骤1,2代码,然后在同一个浏览器中再运行一次步骤4代码,就可以在控制台看到数据。
cookie的一些使用细节
1.一次可以发送多个cookie,创建多个Cookie对象,使用response多次调用addcookie方法即可。
响应头:set-cookie:msg=hello
set-cookie:name=Lisa
请求头:cookie:msg=hello;name=Lisa
2.cookie在浏览器中存活时间
默认情况下,虽然服务器会保存数据到本地,但是一旦关闭浏览器,cookie数据默认会被销毁
创建Cookie对象后,我们可以通过对象名.setMaxAge(int seconds)来设置cookie数据在服务器的存活时间
(1)seconds设为正数:数字表示cookie存活的秒数
(2)seconds设为负数:默认
(3)seconds设为0:删除cookie信息
3.在tomcat8及以上版本的支持下,cookie可以存中文。
4.cookie共享问题
假设在一个tomcat服务器中,部署了多个web项目,默认不能共享cookie。
但是,可以通过setPath(String path)来设置cookie的获取范围。
如果想要设置一个tomcat服务器中多个web项目的共享cookie,可以在创建Cookie对象后,设置setPath("/")
了解即可:如果需要不同的tomcat服务器之间共享cookie,用setDomain(String path)方法设置一级域名相同即可。(如tieba.baidu.com和news.baidu.com就可以共享cookie)
Cookie的特点和作用
cookie存储数据于客户端浏览器
浏览器对于单个cookie的大小有限制(4kb),且对同一个域名下的总cookie数量也有限制(20个)
作用:cookie(小饼干)一般用于存储少量不太敏感的数据。在不登录的情况下,完成服务器对客户端的身份识别。
练习:
1.访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
2.如果不是第一次访问,则提示:欢迎回来,您上次访问的时间为:显示时间字符串。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 @WebServlet("/case") 2 public class Case extends HttpServlet { 3 4 @Override 5 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 6 //设置响应的消息体的数据格式以及编码 7 resp.setContentType("text.html;charset=uft-8"); 8 //获取所有cookie 9 Cookie[] cookies = req.getCookies(); 10 boolean flag = false; 11 //遍历cookie数组 12 if(cookies!=null&&cookies.length>0){ 13 for(Cookie cookie:cookies){ 14 //获取cookie的名称 15 String name = cookie.getName(); 16 //判断名称是否是lastTime 17 if("lastTime".equals(name)){ 18 //存在该cookie,表明不是第一次访问 19 flag = true; 20 //设置cookie的value 21 //获取当前时间的字符串,重新设置cookie的值,重新发送cookie 22 Date date = new Date(); 23 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); 24 //得到当前时间的字符串 25 String str_date = sdf.format(date); 26 //URL编码 27 str_date= URLEncoder.encode(str_date,"utf-8"); 28 //将当前时间的字符串写入cookie(设置cookie的value为当前时间) 29 cookie.setValue(str_date); 30 //设置cookie的存活时间:一个月 31 cookie.setMaxAge(60*60*24*30); 32 //服务器响应,得到cookie 33 resp.addCookie(cookie); 34 //获取cookie的value:时间 35 String value = cookie.getValue(); 36 value= URLDecoder.decode(value,"utf-8"); 37 resp.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>"); 38 break; 39 } 40 } 41 } 42 //响应数据 43 if(cookies==null||cookies.length==0||flag==false){ 44 //表示第一次访问 45 Date date = new Date(); 46 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); 47 //得到当前时间的字符串 48 String str_date = sdf.format(date); 49 //URL编码 50 str_date= URLEncoder.encode(str_date,"utf-8"); 51 //将当前时间的字符串写入cookie(设置cookie的value为当前时间) 52 Cookie cookie = new Cookie("lastTime",str_date); 53 //设置cookie的存活时间:一个月 54 cookie.setMaxAge(60*60*24*30); 55 //服务器响应,得到cookie 56 resp.addCookie(cookie); 57 resp.getWriter().write("<h1>您好,欢迎您首次访问</h1>"); 58 } 59 60 } 61 @Override 62 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 63 this.doPost(req,resp); 64 } 65 }
JSP
概念:java server pages:java服务器端页面
一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码,用于简化书写
原理:
浏览器中输入localhost/xxx/index.jsp,服务器解析该请求,寻找是否有index.jsp资源。如果找到了,会将index.jsp转换为java文件。然后编译该java文件,生成class字节码文件,然后有字节码文件给浏览器提供访问。但是我们知道,只有servlet才能被浏览器识别,所以:
JSP本质上就是一个Servlet(继承了servlet的子类httpsevlet)
JSP脚本:
JSP定义java代码的方式
1.<% 代码%> 相当于在service()方法里写代码
2.<%! 代码%>相当于java类的成员位置,可以定义成员变量,成员方法,静态代码块等,但是不推荐,容易造成并发
3.<%= 代码%>相当于在输出语句中写代码,会输出到页面上
JSP内置对象:
在jsp页面中不需要获取和创建,可以直接使用的对象
1.域对象:pageContext——>真实类型:PageContectt——>作用:当前页面共享数据,还可以通过getxxx方法获取其他八个内置对象
2.域对象:request——>真实类型:HttpServletRequest——>作用:一次请求访问的多个资源(转发)
3.域对象:session——>真实类型:HttpSession——>作用:一次会话的多个请求间
4.域对象:application——>真实类型:ServletContext——>作用:所有用户间共享数据
5.response——>真实类型:HttpServletResponse——>含义:响应对象
6.page——>真实类型:Object——>含义:当前页面(Servlet)的对象,this的意思
7.out:——>真实类型:JspWritter——>含义:输出对象,数据输出到页面上——>注意:所有用户间共享数据resp.getWriter()的数据永远在out.write之前
8.config——>真实类型:ServletConfig——>含义:Servlet的配置对象
9.exception——>真实类型:Throwable——>含义:异常对象——>注意:使用page指令将isErrorPage置为true后,才可以使用exception
JSP优化cookie案例:
在web中新建一个jsp文件,在其中的<% %>脚本中写代码即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <%@ page import="java.net.URLEncoder" %> 2 <%@ page import="java.text.SimpleDateFormat" %> 3 <%@ page import="java.util.Date" %> 4 <%@ page import="java.net.URLDecoder" %> 5 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 6 <html> 7 <head> 8 <title>hello</title> 9 </head> 10 <body> 11 <% 12 //获取所有cookie 13 Cookie[] cookies = request.getCookies(); 14 boolean flag = false; 15 //遍历cookie数组 16 if(cookies!=null&&cookies.length>0){ 17 for(Cookie cookie:cookies){ 18 //获取cookie的名称 19 String name = cookie.getName(); 20 //判断名称是否是lastTime 21 if("lastTime".equals(name)){ 22 //存在该cookie,表明不是第一次访问 23 flag = true; 24 //设置cookie的value 25 //获取当前时间的字符串,重新设置cookie的值,重新发送cookie 26 Date date = new Date(); 27 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); 28 //得到当前时间的字符串 29 String str_date = sdf.format(date); 30 //URL编码 31 str_date= URLEncoder.encode(str_date,"utf-8"); 32 //将当前时间的字符串写入cookie(设置cookie的value为当前时间) 33 cookie.setValue(str_date); 34 //设置cookie的存活时间:一个月 35 cookie.setMaxAge(60*60*24*30); 36 //服务器响应,得到cookie 37 response.addCookie(cookie); 38 //获取cookie的value:时间 39 String value = cookie.getValue(); 40 value= URLDecoder.decode(value,"utf-8"); 41 out.write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>"); 42 break; 43 } 44 } 45 } 46 //响应数据 47 if(cookies==null||cookies.length==0||flag==false){ 48 //表示第一次访问 49 Date date = new Date(); 50 SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); 51 //得到当前时间的字符串 52 String str_date = sdf.format(date); 53 //URL编码 54 str_date= URLEncoder.encode(str_date,"utf-8"); 55 //将当前时间的字符串写入cookie(设置cookie的value为当前时间) 56 Cookie cookie = new Cookie("lastTime",str_date); 57 //设置cookie的存活时间:一个月 58 cookie.setMaxAge(60*60*24*30); 59 //服务器响应,得到cookie 60 response.addCookie(cookie); 61 out.write("<h1>您好,欢迎您首次访问</h1>"); 62 } 63 %> 64 </body> 65 </html>
JSP指令:
指令的作用:用于配置JSP页面,导入资源文件
格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2...%>
例如:<%@ page contentType="text/html;charset=UTF-8" lanhuage="java" errorPage="500error.jsp"%>
指令1:page(用于配置JSP页面)
属性1——>contentType,等同于reoinse.setContentType(),设置响应体的mine类型以及字符集,也可设置当前jsp页面的编码
属性2——>import,导入包
属性3——>errorPage,当前页面发生异常后,会自动跳转到指定的页面
属性4——>isErrorPage,用于属性3中跳转到的指定页面,置为true后,才可以使用内置对象exception
String message = exception.getMessage();
out.print(message)
指令2:include(用于导入页面的资源文件)
如:<%@ include file = "top.jsp"%>,表示打开该页面时导入top文件的内容
指令3:taglib(一般用于导入标签库)
如:<%@taglib prefix="c" url="http://java.sun.com/jsp/jstl/core"%>
JSP注释:
1.html注释:<!-- --> 只能注释html代码片段,不能注释java语句
2.jsp注释:<%-- --%> 可以注释所有,推荐使用
MVC开发模式
演变过程:
——>servlet(只能使用response输出标签数据)
——>jsp(html语句和java代码可以写在一起,而且不用编译,但是难以维护,视觉混乱)
——>mvc开发模式
MVC结构:
1.model,模型,具体由javabean实现
完成具体的业务操作,如查询数据库,封装对象
2.view,视图,具体由JSP实现(少量的java代码需要用到EL表达式和JSTL标签)
用来展示数据
3.controller,控制器,具体由servlet实现
调取用户的输入,调用模型,将数据交给视图进行展示
逻辑顺序:
浏览器向服务器请求数据,controller接收请求(调取用户输入),调用model,model完成具体的业务操作后返回给controller,controller将数据交给视图层来展示,最后响应浏览器的请求。
三层架构:软件设计架构