什么是Servlet?
- Servlet Applet:服务器小程序,在Java层面,提供的一个功能,接收前端请求,并对请求做出响应
- 功能:实现页面的动态化。让页面的数据实现动态化
- Servlet是sun公司初期为服务器程序设计的一套规范。必须实现一个接口Servlet
基于web.xml配置开发Servlet(了解)
1.创建项目,将项目转换为web项目
2.添加依赖:
1.将tomcat的servlet-api。jar复制到WEB-INF的lib文件夹里
2.右上角小齿轮->Modules->Dependencies->+号->添加tomcat依赖
3.创建一个普通Java类,名为XxxServlet,继承HttpServlet
4.重写service方法,参数为HttpXxxx
5.在web.xml中注册servlet,为servlet映射一个请求的路径(<servlet> <serlvet -Mapping>)
6.启动服务器,浏览器直接请求servlet
基于注解开发Servlet
- 标记类、方法、属性,告知程序要做哪些配置,如何执行
- @WebServlet():代替web.xml那一堆配置
Servlet的基本使用
接收数据,响应数据
@WebServlet("/data")
public class DataServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//HttpServletRequest->客户端请求对象。 包含了请求相关的所有信息。
//1.获取客户端发送的数据。
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("username = " + username);
System.out.println("password = " + password);
//HttpServletResponse->客户端响应对象,包含了响应相关的所有信息。
PrintWriter printWriter = resp.getWriter();
printWriter.println("ok!");
}
Servlet的继承结构
顶级接口是Servlet。
->有5个方法,必须要间接或直接的与Servlet接口产生关系
GenericServlet:通用Servlet
->帮我们过滤重写了4个不必需要的方法
->子类必须重写service方法。(无协议)
HttpServlet:专注与HTTP协议的Servlet。
->重写了GenericService的service,调用了自身重载的有HTTP协议的service方法。
->在方法内部对HTTP的请求方式做了不同的区分:
doGet:专注处理get请求
doPost:专注处理post请求
doPut:专注处理put请求
doDelete:专注处理deletei请求
正常开发来说,要严格要求每个Servet处理的请求具体的方式,但现在是学习阶段,省力气只写service。
Servlet生命周期
- 第一次请求会触发Servlet创建对象。(单例模式,懒汉式)
- 执行init方法,做一些前置性的初始化操作。
- 后续的每次请求执行的service方法
- 服务器关闭或重启或重新部署,会执行destory方法。卸载掉当前运行的所有servlet方法
ServletConfig(针对单个Servlet)
ServletConfig对象是Servlet对象的配置相关的信息
this.getServletConfig() 方法调用集合。
ServletContext(针对整个项目)
Context:代表整个项目,上下文
ServletContext对象代表是整个项目,该对象也是只有一个,全局对象。
获取方式:
ServletContext servletContext = servletConfig.getServletContext();
HttpServletRequest
HttpServletRequest代表的是Http协议的请求对象,其封装的是请求相关的所有内容(请求报文)
getRequestURL() :获取前端请求的地址(URL是统一资源定位符 // http://localhost:8080/项目/资源)
getRequestURI():获取前端请求的地址(URI是统一资源标识符)//在当前项目下的某个资源
HttpServletResponse
HttpServletResponse代表的是响应对象,其包含的是响应相关的内容(响应报文)
转发与重定向
- 无论是转发还是重定向,都是跳转的行为
- 浏览器地址栏的区别
- 数据共享的区别
转发
转发是服务器内部的行为。对于客户端而言,客户端只发送了一次请求。浏览器地址栏不发生改变。
1.创建转发的对象:
RequestDispatcher requestDispatcher = req.getRequestDispatcher("targrt.html);
2.使用请求调度对象,调度请求转发给谁
requestDispatcher.forword(req,resp);//浏览器请求的资源,资源将请求转发给了另一个资源,以完成一次响应。
//请求转发给另一个servlet
req.getRequestDispatcher("target1").forward(req,resp);
转发特点:
- 请求转发通过HttpServletRequest对象获取请求转发器实现;
- 请求转发是服务器内部的行为,对客户端是屏蔽的;
- 客户端只发送了一次请求,客户端地址栏不变
- 服务端只产生了一对请求和响应对象,这一对请求和响应对象会继续传递给下一个资源;
- 因为全程只有一个HttpServletRequest对象,所以请求参数可以传递,请求域中的数据也可以传递
- 请求转发可以转发给其他Servlet动态资源,也可以转发给一些静态资源以实现页面跳转;
- 请求转发可以转发给WEB-INF下受保护的资源
- 请求转发不能转发到本项目以外的外部资源
重定向
重定向是客户端发送了一次请求,得到了一个响应,该响应是新的请求路径,客户端再一次发送新请求,得到一次新响应。
//重定向去一个页面
resp.sendRedirect("target.html");
//重定向去一个Servlet
resp.sendRedirect("target1");
//重定向去项目以外的任意资源
resp.sendredirect("http://www.baidu.com");
重定向的特点:
- 响应重定向通过HttpServletResponse对象的sendRedirect方法实现
- 响应重定向是服务端通过302响应码和路径,告诉客户端自己去找其他资源,是在服务端提示下的客户端的行为
- 客户端至少发送了两次请求,客户端地址栏是要变化的;
- 服务端产生了多对请求和响应对象,且请求和响应对象不会传递给下一个资源
- 因为全程产生了多个HttpServletrequest对象,所以请求参数不可以传递,请求域中的数据也不可以传递
- 重定向可以是其他Servlet动态资源,也可以是一些静态资源以实现页面跳转;
- 重定向不可以到WEB-INF下受保护的资源
- 重定向可以到本项目以外的外部资源
路径问题
VSCode中路径:
绝对路径:磁盘当中某个文件。 D:\imgs\xxx.jpg
相对路径:../img/xxx.jpg
路径
资源在网络上的路径。
相对路径:
./当前路径(可以省略)、../上一级路径
绝对路径:
资源在网络上的路径(URL统一资源定位符)
/的作用
服务器角度:
在服务器中,/代表的是当前项目的绝对路径:
http://localhost:8080/day6_servlet/
客户端角度:
在客户端中,/代表的是当前访问的服务器的绝对路径
http://localhost:8080/
无论是转发,还是重定向,一定要分清楚两个角度:
浏览器解析/:服务器路径
服务器解析/: 上下文路径(项目访问路径)
MVC架构模式
三层架构(不是架构模式,只是业务逻辑的分层)
DAO:数据访问层
Service:业务处理层
View:视图层
三层架构是站在了功能的逻辑角度,进行职责的划分,各司其职
MVC架构模式
- M:Model,模型层。就是将数据库的数据转化成Java中的实体对象
- C:Controller,控制层,接收前端请求,调用M层,响应数据或结果到V层。
- V:View,视图层,显示给客户端的。
- MVC是站在了一个软件/项目的层面来考虑的划分,逻辑,数据,请求响应差分成了各个独立的组件,通过高内聚的行为,组合在一起,实现一个完整的流程。
项目的MVC结构
- DAO:
- Service:
- Controller
- Web