Session+JavaWeb与MVC

一.Session

在这里插入图片描述

1.概述

服务端会话技术:Session
	会话域对象:Session,浏览器和服务器建立的一次连接,在这次会话中,可以包含多次请求和响应
	原理:当浏览器第一次请求服务器时,服务器会创建Session对象,然后把Session对象的id通过Set-Cookie头响应给浏览器

2.Java实现session

* 服务器端会话技术:Session,主菜
		* 将数据存储在服务器端
		* 原理:session依赖于cookie存在
		
		* Java实现Session:
			//1.获取session
			HttpSession session = request.getSession();
			//2.存储数据
			session.setAttribute("msg", "hehe");
			//3.获取数据
			Object msg = session.getAttribute("msg");
package org.westos.demo2;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;


@WebServlet(name = "MyServlet", value = "/myServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //服务端会话技术:Session
        //会话域对象:Session,浏览器和服务器建立的一次连接,在这次会话中,可以包含多次请求和响应
        //原理:当浏览器第一次请求服务器时,服务器会创建Session对象,然后把Session对象的id通过Set-Cookie头响应给浏览器
	
		//1.获取session
        HttpSession session = request.getSession();
        //2.存储数据
        session.setAttribute("username", "jenny");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

package org.westos.demo2;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;


@WebServlet(name = "MyServlet2", value = "/myServlet2")
public class MyServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	//1.获取session
        HttpSession session = request.getSession();
        //2.获取数据
        String username = (String) session.getAttribute("username");
        System.out.println(username);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

3.JSESSIONID

1)第一次访问服务器的时候,会在响应头里面看到Set-Cookie信息(只有在首次访问服务器的时候才会在响应头中出现该信息)
在这里插入图片描述

浏览器会根据响应头的set-cookie信息设置浏览器的cookie并保存之

注意此cookie由于没有设置cookie有效日期,所以在关闭浏览器的情况下会丢失掉这个cookie。

2)当再次请求的时候(非首次请求),浏览器会在请求头里将cookie发送给服务器(每次请求都是这样)
在这里插入图片描述
不难发现这个的jsessionid和上面的jsessionid是一样的

3)为什么除了首次请求之外每次请求都会发送这个cookie呢(在这里确切地说是发送这个jsessionid)?

事实上当用户访问服务器的时候会为每一个用户开启一个session,浏览器是怎么判断这
个session到底是属于哪个用户呢?jsessionid的作用就体现出来了:jsessionid就是用来
判断当前用户对应于哪个session。换句话说服务器识别session的方法是通过jsessionid
来告诉服务器该客户端的session在内存的什么地方。

事实上jsessionid ==request.getSession().getId()

4.session的获取

request.getSession();
//默认空参:根据JSESSIONID的值查找是否存在对应的Session对象,如果不存在,那么创建新的Session对象,如果存在,那么返回存在的那个Session对象

//在第一次请求时,/myServlet,服务器此时还没有Session对象,那么新建一个Session对象,并把JSESSIONID作为Cookie传递到浏览器,在第二次请求时,/myServlet2,
request.getSession(),返回的是服务器已经存在的那个Session对象,自然可以拿到Session域中的username属性



request.getSession(boolean flag)

true,默认值,和无参效果一致;
false,根据JSESSIONID查找是否存在Session对象,如果找到了,返回即可,如果没有找到,那么返回Null,而不会创建新的Session对象。

5.服务器的钝化与活化

1.
				* 浏览器关闭了,session不一样了。
					* Cookie没了。jsessionid没了。
				* 服务器关闭了,session一样吗?不一样。内存释放了。
					但是,在服务器启动后,虽然对象不一样了,但是session中存储的数据还是一样的
						* 钝化:服务器正常关闭后,session对象被写入硬盘的文件中
						* 活化:服务器开启后,将文件还原为内存的session对象

6.session的生命周期

2. session的生命周期
				* 创建:
					request.getSession():
					会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
				* 销毁:
					* 服务器关闭
					
					* session超时
						<session-config>
							<session-timeout>30</session-timeout>
						</session-config>
					
					* invalidate() :session自杀了。

6.客户端禁用cookie

如果客户端禁用了Cookie?

那么在会话过程中如何传递JSESSIONID,而且不能通过cookie的方式?
URL重写。

response.encodeRedirectURL()

URL重写:http://localhost:8080/day09/s1;jsessionid=E5F92CFD2B256EE2548AE01CC56B2E62

					PrintWriter pw = response.getWriter();
					HttpSession session = request.getSession();
					String id = session.getId();
		
					String href = "/day09/s1";
					href = response.encodeRedirectURL(href);
					System.out.println(href);
					pw.write("<a href='"+href+"'>s1</a>");
package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "MyServlet3", value = "/myServlet3")
public class MyServlet3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /* 如果客户端禁用了Cookie?

        那么在会话过程中如何传递JSESSIONID,而且不能通过cookie的方式?
        URL重写。*/

        //第一次访问,如果未找到,返回新建的Session对象
        response.setContentType("text/html,charset=utf-8");
        HttpSession session = request.getSession();
        System.out.println(session.getId());
        //重定向需要加上上下文路径
        String url = request.getContextPath() + "/myServlet4";
         url = response.encodeRedirectURL(url);
        System.out.println(url);
        response.getWriter().write("<a href='" + url + "'>跳转到servleT4</a>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

package org.westos.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "MyServlet4", value = "/myServlet4")
public class MyServlet4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        HttpSession session = request.getSession();
        System.out.println(session.getId());
        response.getWriter().write("进入了myServlet4");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

在这里插入图片描述

7.数据的使用

* 分析数据使用几次?
			* 一次:request,转发
			* 一个用户多次 session,重定向
			* 所有用户共享: ServletContext 重定向

二.MVC设计模式

	MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC模式最早为Trygve Reenskaug提出,为施乐帕罗奥多研究中心(Xerox PARC)的Smalltalk语言发明的一种软件设计模式。
MVC可对程序的后期维护和扩展提供了方便,并且使程序某些部分的重用提供了方便。而且MVC也使程序简化,更加直观。
	控制器Controller:对请求进行处理,负责请求转发;
	视图View:界面设计人员进行图形界面设计;
	模型Model:程序编写程序应用的功能(实现算法等等)、数据库管理;Java对象
			用于处理管理数据库、处理业务逻辑、封装实体数据 

注意,MVC不是Java的东西,几乎现在所有B/S结构的软件都采用了MVC设计模式。
	但是要注意,MVC在B/S结构软件并没有完全实现,例如在我们今后的B/S软件中并不会有事件驱动!

在这里插入图片描述

三.JavaWeb与MVC

JavaWeb的经历了JSP Model1、JSP Model1二代、JSP Model2三个时期。

3.1 JSP Model1第一代


JSP Model1是JavaWeb早期的模型,它适合小型Web项目,开发成本低!Model1第一代时期,服务器端只有JSP页面,所有的操作都在JSP页面中,连访问数据库的API也在JSP页面中完成。也就是说,所有的东西都耦合在一起,对后期的维护和扩展极为不利。

在这里插入图片描述

在这里插入图片描述

3.2 JSP Model1第二代

  	JSP Model1第二代有所改进,把业务逻辑的内容放到了JavaBean中,而JSP页面负责显示以及请求调度的工作。虽然第二代比第一代好了些,但还让JSP做了过多的工作,JSP中把视图工作和请求调度(控制器)的工作耦合在一起了。

在这里插入图片描述

3.3 JSP Model2

在这里插入图片描述

JSP Model2模式已经可以清晰的看到MVC完整的结构了。
	JSP:视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户;
	Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;
	JavaBean:模型层,完成具体的业务工作,例如:开启、转账等。

在这里插入图片描述
JSP Model2适合多人合作开发大型的Web项目,各司其职,互不干涉,有利于开发中的分工,有利于组件的重用。但是,Web项目的开发难度加大,同时对开发人员的技术要求也提高了。

四.JavaWeb经典三层架构

在这里插入图片描述


我们常说的三层框架是由JavaWeb提出的,也就是说这是JavaWeb独有的!
所谓三层是表述层(WEB层)、业务逻辑层(Business Logic),以及数据访问层(Data Access)。
WEB层:包含JSP和Servlet等与WEB相关的内容;
业务层:业务层中不包含JavaWeb API,它只关心业务逻辑;
数据层:封装了对数据库的访问细节;

  注意,在业务层中不能出现JavaWeb API,例如request、response等。也就是说,业务层代码是可重用的,甚至可以应用到非Web环境中。业务层的每个方法可以理解成一个功能,例如转账业务方法。业务层依赖数据层,而Web层依赖业务层!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值