会话技术,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次请求)

 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 }
View Code

步骤4代码:(第2次请求)

 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 }
View Code

启动服务器中,先运行步骤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.如果不是第一次访问,则提示:欢迎回来,您上次访问的时间为:显示时间字符串。

 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 }
View Code

   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文件,在其中的<%  %>脚本中写代码即可。

 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>
View Code

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将数据交给视图层来展示,最后响应浏览器的请求。

  三层架构:软件设计架构

 

posted @ 2020-04-22 11:47  菅兮徽音  阅读(236)  评论(0编辑  收藏  举报