MVC分层开发
原因代码量越来越大,将所有的代码都写在main方法中,会造成代码的阅读性比较差,代码的可重用性比较差。
MVC分层开发模式的使用
将代码根据不同的功能进行分层开发(分层也就是不同的包)
特点:
-
降低代码的冗余,提高代码的重用性。
-
提高了代码的阅读性。
-
便于后期的维护升级。
-
降低代码之间的耦合度.
概念:
-
M:Model模型(service+dao+pojo)。
-
V:View视图(HTML页面+JSP页面)。
-
C:Controller控制器(Servlet)。
- com.zqwl.controller 编写Servlet代码
- com.zqwl.service 编写业务层的接口
- com.zqwl.service.impl 编写业务层的实现类
- com.zqwl.dao 编写持久层的接口
- com.zqwl.dao.impl 编写持久层的接口实现类
- com.zqwl.pojo 编写实体类
请求转发和请求重定向
Servlet就是用来处理浏览器发送的请求的,在一个项目中我们可以写多个Servlet去处理不同的请求。由于业务需求,可能会出现多个Servlet配合完成某一项功能。
例如:访问AServlet处理请求,AServlet处理完成后,还需要BServlet处理请求,由BServlet向浏览器响应。此时就需要多个Servlet配合完成某一项功能.
我们可以在A Servlet的service方法中调用B Servlet的service方法接着进行业务的处理。 但是Servlet对象是由服务器创建的,service方法也是由服务器进行调用的。所以,我们不能自己去调用。 应该在A Servlet的service方法中写一行特殊的代码,告诉tomcat服务器,让服务器去调用B Servlet的service方法接着进行请求的处理(在Servlet的service方法中完成其他Servlet的调用。 )
浏览器发起请求访问服务器,服务器接收到请求,解析请求,创建请求和响应对象,执行Servlet中service方法时, 将请求和响应对象传递给service方法中。
创建:请求到达服务器,执行servlet的service执行
销毁:响应回到浏览器
特点:
1.一次请求有效(请求过来和响应回去)
2.存储数据:req.setAttribute(String key, Object value);
3.获取数据:req.getAttribute(String key);
4.删除存储的数据: req.removeAttribute(String key);
//请求对象中存储数据
req.setAttribute("aa", "AServlet");
//请求转发
//1.获取请求转发器 参数为转发的路径
RequestDispatcher rp = req.getRequestDispatcher("/login.html");
//2.完成转发(使用相同的请求和响应对象)
rp.forward(req, resp);
//简单理解:调用BServlet中的service(req, resp)
总结:请求转发可以实现在后端Servlet之间的相互调用,一个请求由一个Servlet处理,转变为了多个Servlet的协同处理。
4. 请求重定向
当浏览器向Tomcat服务器发送请求时,由于一个Servlet1类无法完成所有请求响应工作,这时候Servlet1类会通知浏览器重新定向到另一个Servlet2类的请求。浏览器会再次发送请求访问Servlet2,来获得Servlet2的响应.
请求重定向到DServlet
特点:
访问CServlet,CServlet执行,CServlet中重定向到DServlet
1.CServlet以302状态响应回到浏览器。请求和响应对象 销毁了。
2.浏览器接收到重定向的响应后,重新发送请求到DServlet
3.DServlet接收到请求,处理请求,完成响应
地址栏改变,多次一次请求
通过方法获取项目名
String contextPath = req.getContextPath();
System.out.println(contextPath); // /Servlet_Day03_war_exploded
重定向时,1./指定项目名/资源名 2.url http://ip:port/指定项目名/资源名
resp.sendRedirect(contextPath + "/login.html");
Cookie对象
如果浏览器又发送了请求,而且本次请求需要用到上次请求传递过的数据,那么本次请求又要重新带上上次请求传递的数据。这样效率不高,而且用户体验度也差!
总结:
-
服务器决定哪些数据是以后的请求也会用到的。
-
服务器以响应的方式告诉浏览器将常用的这些数据存储起来,存储在浏览器端。
-
浏览器以后每次发送请求的时候需要带上这些存储起来的数据。
特点
Cookie是浏览器端的数据存储技术。是字符串存储数据。Cookie使用Key与Value结构存储数据。不安全,不适合存储重要的数据到浏览器端。 Cookie一个单个的存储数据大小限制在4097个字节。Cookie存储的数据中不支持中文,但Servlet4.0中支持。Cookie分为持久化Cooke与状态Cookie。Cookie对象保存在客户端浏览器内存或系统磁盘中。浏览器在保存同一域名所返回Cookie的数量是有限的。不同浏览器支持的数量不同 。浏览器每次请求时都会把与当前访问的域名相关的Cookie在请求中提交到服务端。Cookie是与域名绑定所以不支持跨一级域名访问。
Cookie的使用
创建Cookie,Cookie中保存的数据是键值对的方式
Cookie cookie = new Cookie("username", "root");
将创建好的Cookie添加到响应中,这样浏览器就会将Cookie中的信息保存起来了
resp.addCookie(cookie);
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);
}
}
存活时间:MaxAge 1.默认:浏览器的本次回话,浏览器不关闭,Cookie不销毁。浏览器关闭,Cookie销毁。 状态Cookie 2.设置存活时间: 正数:指定秒数后销毁 持久化Cookie 负数(默认):浏览器关闭销毁 0:立刻销毁
- 正数:表示在指定的秒数后过期
- 负数:表示浏览器一关,Cookie就会被删除(默认是-1)
- 零:表示马上删除Cookie
cookie2.setMaxAge(60*2);
cookie3.setMaxAge(0);
设置哪些资源可以使用Cookie:Path 1. /部署的项目名(默认):该项目中所有资源都可以使用 2. / :当前tomcat中部署的所有项目都可以使用 3. /部署项目名/资源名 :只有该资源可以使用 设置哪些域名可以使用Cookie:DoMain 1.默认:访问时的域名。 2.允许二级域名跨域。.zqwl.com -> www.zqwl.com aaa.zqwl.com 3.不允许一级域名跨域。www.zqwl.com -> www.baidu.com(不允许) 注意事项: localhost 和 127.0.0.1 为跨域。 访问时的端口号不一样也属于跨域。