MVC分层开发
随着代码量越来越大,将所有的代码都写在main方法中,会造成代码的阅读性比较差,代码的可重用性比较差。
可以将main方法中的代码拆分开,写到各个不同的类中,成立各个不同的方法。然后在main方法中调用。
作用
- 能够将代码根据不同的功能进行分层开发(分层也就是不同的包)
降低代码的冗余,提高代码的重用性。
提高了代码的阅读性。
便于后期的维护升级。
降低代码之间的耦合度。
MVC概念
M:Model模型(service+dao+pojo)
V:View视图(HTML页面+JSP页面)
C:Controller控制器(Servlet)
分层开发实现
MVC分层开发落地的使用,也就是创建不同的包,然后在不同的包中写功能不同的代码。具体的包结构如下:
com.zqwl.controller 编写Servlet代码
com.zqwl.service 编写业务层的接口
com.zqwl.service.impl 编写业务层的实现类
com.zqwl.dao 编写持久层的接口
com.zqwl.dao.impl 编写持久层的接口实现类
com.zqwl.pojo 编写实体类
补充说明
1.JavaBean:一种类的规格编写规范
javaBean在MVC设计模型中是model,又称模型层,在一般的程序中,我们称它为数据层,就是用来设置数据的属性和一些行为,然后提供获取属性和设置属性的get/set方法。
JavaBean是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。
以entity,domain,vo,pojo命名的包,包中的类都满足javaBean的规范
2.Entity
在entity包下面的实体类中所有的属性和数据库表中的字段,数据类型逐一对应
3.domain
domain包下实体类中的属性不仅会包含数据库中的字段,还会包含其他自定义属性
4.pojo
Plain Old Java Objects,普通 Java 对象,pojo包下面的实体类并没有严格定义
5.vo
view object,vo包下面的实体类的属性与数据库并没有关系,而是服务器与页面交互的视图数据(后台和前端进行交互的数据类)
请求转发与重定向
请求转发
当前出现的问题
Servlet就是用来处理浏览器发送的请求的,在一个项目中我们可以写多个Servlet去处理不同的请求。由于业务需求,可能会出现多个Servlet配合完成某一项功能。
解决问题的方案
可以在A Servlet的service方法中调用B Servlet的service方法接着进行业务的处理。 但是Servlet对象是由服务器创建的,service方法也是由服务器进行调用的,不能自己去调用。
应该在A Servlet的service方法中使用请求转发的方式(forward),告诉tomcat服务器,让服务器去调用B Servlet的service方法接着进行请求的处理。(从而达到在Servlet的service方法中完成其他Servlet的调用的目的)
代码示例
req.getRequestDispatcher("/url-pattern填的地址").forward(req,resp);
请求转发的特点
-
请求转发是一次请求,地址栏地址不变,还是访问第一个Servlet的地址。
-
请求转发是一次请求(共享请求和响应对象),所以转发内的各个Servlet共享一个request对象。
-
请求转发是Tomcat服务器内部的行为,用户是看不到的。
-
可以使用req.setAttribute(key,value)和getAttribute(key)实现请求转发内的Servlet的数据的流转。
-
注意:在学习的请求转发后,每个Servlet的访问方式就会有两种:
-
浏览器直接发起请求访问。
-
其他Servlet通过请求转发访问。
-
总结:请求转发可以实现在后端Servlet之间的相互调用,一个请求由一个Servlet处理,转变为了多个Servlet的协同处理。
请求重定向(redirect)
当浏览器向Tomcat服务器发送请求时,由于一个Servlet1类无法完成所有请求响应工作,这时候Servlet1类会通知浏览器重新定向到另一个Servlet2类的请求。浏览器会再次发送请求访问Servlet2,来获得Servlet2的响应。
代码示例
resp.sendRedirect(req.getContextPath() + "/url-pattern填的地址");
请求重定向的特点
-
重定向是两次请求,地址栏信息改变,地址会变成第二次请求的地址。
-
重定向的地址是浏览器收到第一次请求响应回来的地址,自动跳转的,用户不参与。
-
重定向的两次请求,request对象和response对象是不同的。
请求转发与请求重定向的比较
请求转发:
-
请求转发是一次请求,是Tomcat服务器内部的行为,共享同一个request对象和response对象。浏览器只需要发一次请求即可将业务处理完毕。
-
一般浏览器发起的查询功能会使用请求转发来完成请求的处理及结果的响应。
-
浏览器发起的是增删改的请求,如果使用请求转发来处理的话,因为转发后的地址栏信息是不变的,容易造成用户刷新页面后表单重复提交。
重定向:
-
重定向是两次请求,地址栏信息会改变,不共享同一个请求和响应对象。
-
一般用户的增删改请求会使用重定向的方式来处理请求。目的是保护第一次请求,避免用户因刷新页面造成表单重复提交。
请求转发与请求重定向的总结
如果需要将A Servlet的处理结果通过请求对象带到B Servlet中去使用,那就使用请求转发。
如果A Servlet的处理结果不需要带到B Servlet中去使用,那就使用重定向。
Cookie对象
客户端存储数据的技术
当前存在的问题
由于http协议是无状态的,浏览器发起请求(请求中一般是需要携带数据的),服务器接收到请求后调用相关的后端代码去处理该请求,处理完后会响应浏览器。 本次请求与响应结束后,相关的请求与响应数据就会销毁。如果浏览器又发送了请求,而且本次请求需要用到上次请求传递过的数据,那么本次请求又要重新带上上次请求传递的数据。这样效率不高,而且用户体验度也差。
解决方案
-
浏览器在发起请求的时候,请求达到服务器,服务器决定哪些数据是以后的请求也会用到的。
-
服务器以响应的方式告诉浏览器将常用的这些数据存储起来,存储在浏览器端。
-
浏览器以后每次发送请求的时候需要带上这些存储起来的数据。
Cookie的特点
-
Cookie是浏览器端的数据存储技术
-
Cookie使用字符串存储数据
-
Cookie使用Key与Value结构存储数据
-
不安全,不适合存储重要的数据到浏览器端
-
单个Cookie存储数据大小限制在4097个字节(4kb左右)
-
Cookie存储的数据中不支持中文,Servlet4.0中支持
-
Cookie分为持久化Cooke与状态Cookie
-
Cookie对象保存在客户端浏览器内存或系统磁盘中
-
浏览器在保存同一域名所返回Cookie的数量是有限的。不同浏览器支持的数量不同,Chrome浏览器为50个
-
浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中提交到服务端
-
Cookie是与域名绑定所以不支持跨一级域名访问
Cookie的使用
Cookie的创建及响应
Cookie中存放的是键值对的数据,而且要求值的类型只能为字符串类型
代码示例:
//创建Cookie,Cookie中保存的数据是键值对的方式
Cookie cookie = new Cookie("username", "root");
//将创建好的Cookie添加到响应中,这样浏览器就会将Cookie中的信息保存起来了
resp.addCookie(cookie);
Cookie数据的获取
代码示例:
Cookie[] cookies = req.getCookies();
if(cookies != null){
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name + ":" + value);
}
}
Cookie的存活时间设置
Cookie是可以设置在浏览器的存活时间的。
使用setMaxAge()方法可以设置存活时间:
正数:表示在指定的秒数后过期
负数:表示浏览器一关,Cookie就会被删除(默认是-1)
零:表示马上删除Cookie
代码示例:
Cookie cookie = new Cookie("life60", "life60");
cookie.setMaxAge(60);
resp.addCookie(cookie);
Cookie的path属性
Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不发。
path属性是通过请求的地址来进行有效的过滤。
如果不设置path属性,那Cookie的有效路径是当前项目。
代码示例:
Cookie cookie = new Cookie("path1","path1");
cookie.setPath(req.getContextPath() + "/abc");// 路径是 /工程路径/abc
resp.addCookie(cookie);
注意:如果想看到/工程路径/abc这个路径的Cookie,那你的地址栏中请求地址必须包含/工程路径/abc才行。
Cookie的domain属性
域名对应的就是咱们的ip地址。域名一般是以www开头,以com结尾
域名分为:顶级(一级)域名、二级域名
比如: www.baidu.com是顶级域名、.baidu.com是二级域名
Cookie是不支持顶级域名的跨域,支持二级域名的跨域
比如:在www.baidu.com这个一级域名中存储的Cookie值,在www.jd.com这个一级域名中是拿不到的!但是在news.baidu.com这个二级域名中是可以拿到的。
Cookie有domain属性,可以通过domain属性设置访问该Cookie的域名。如果设置为“www.itbz.com”,则只能是 "www.itbz.com" 可以访问。 如果设置为 ".itbz.com",则以 ".itbz.com" 结尾的域名都可以访问到该Cookie。