携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情 >>
体系结构
Servlet是一个接口,下面有两个抽象子类。
其中GenericServlet抽象类直接实现Servlet接口,HttpServlet继承GenericServlet抽象类;
request和response
- request和response对象是由服务器创建的。
- request对象是来获取请求消息,response对象是来设置响应消息
- request和response对象是ServletRequest接口的两个子接口HttpServletRequest和HttpServletResponse声明的两个对象,用来处理请求和响应进而与客户端进行交互;
- ServletRequest接口 的子接口 HttpServlet比较常用,一般使用HttpServleRequestt来声明request对象;response同理;
- 通过request对象可以获得请求行数据中的请求方式,URI,请求参数,HTTP协议等;还可以获得请求头数据和请求体数据;
- 通过response对象可以设置响应消息;响应行,响应头,响应体;
- HTTP传输数据类型:ContentType
request域
域对象:一个有作用范围的对象,可以在范围内共享数据;
作用范围:一次请求。一般用于请求转发的多个资源中共享数据;
方法:
void setAttribute(String name, Object obj):存储数据;Object getAttribute(String name):根据键获取数据;void removeAttibute(String name):根据键移除键值对数据;
Servlet请求响应流程
-
浏览器发送请求到服务器(请求)
-
服务器接收浏览器的请求进行解析,创建request对象存储请求数据
-
服务器调用对应的Servlet进行请求处理,并将request对象作为实参传递给Servlet的service方法
-
Servlet的service方法执行请求处理:
-
设置请求的编码格式
request.setCharacterEncoding("utf-8"); -
设置响应的编码格式
response.setContentType("text/html;charset=utf-8"); -
获取请求信息
-
处理请求信息
- 创建业务层对象
- 调用业务层对象的方法
-
响应请求处理
- 直接响应
- 请求转发
- 重定向
-
请求转发
服务器内部资源跳转的一种方式。
request.getRequestDispatcher("servletname").forward(request,response);
- 请求转发的两个Servlet属于一次请求,可以使用request对象共享数据;
- 浏览器地址栏信息不改变,
- 只能转发到当前服务器的资源;
- 刷新时可能导致表单重复提交。
- / :表示项目根目录
重定向
资源跳转的方式。
response.sendRedirect("url");
- 使用时机:解决当前Servlet无法处理请求的问题以及表单重复提交的问题。
- 重定向的两个Servlet属于两次请求,拥有两个request对象;
- 浏览器地址会改变,Servlet之间数据不能共享。
- 可以重定向到其他站点的资源;
- 两次请求的数据共享需要使用session,session依赖于cookie。
- / : 表示服务器根目录,绝对路径需要加上虚拟项目名
ServletContext对象
request解决了一次请求内的数据共享问题,session解决了一个用户不同请求的数据共享问题,而不同用户之间的数据共享问题则需要使用ServletContext对象。
特点
1. 由服务器创建
2. 用户共享
3. 一个项目只有一个
生命周期
服务器启动到服务器关闭
使用:
//1.获取ServletContext对象(三种方式,等价)
ServletContext sc = this.getServletContext();
ServletContext sc2 = this.getServletConfig().getServletContext();
ServletContext sc3 = request.getServletContext();
//ServletContext sc3 = req.getSession().getServletContext();
//2.使用ServletContext对象完成数据共享
sc.setAttribute(String name,Object value);
sc.getAttribute(String name);//返回Object对象类型数据
//3.获取项目中web.xml中的全局配置数据
sc.getInitParameter(String name);//返回String类型数据
//4.获取项目根的根路径信息
sc.getRealPath();
功能:
-
获取MIME类型:在互联网通信过程中定义的一种文件数据类型;
格式:大类型/小类型 text/html;
方法:String getMinmeType(String file);
-
域对象:共享数据;所有用户共享数据;
- setAttribute(String name, Object value);
- getAttribute(String name);
- removeAttribute(String name);
-
获取文件的真实(服务器)路径;
- String getRealPath(String path);
文件下载
设置请求头信息:
-
setHeader("content-disposition", "attachment;filename=xxx");
-
setHeader("content-type", this.getServletContext().getMinmeType(filename));
- HTTP传输数据类型:ContentType;
- 这里要在响应头中设置HTTP传输数据的类型MIME为文件对应的类型;
注意:文件名的中文问题要根据浏览器版本信息设置对应的文件编码方式;
ServletConfig
ServletConfig对象是Servlet的专属对象(域对象).
问题:
如何获取在web.xml中给每个Servlet单独配置的数据?
解决:
使用ServletConfig对象
使用:
-
获取ServletConfig对象
ServletConfig sc = this.getServletConfig(); -
获取web.xml中的配置数据
String value = sc.getInitParameter("name")
Web.xml文件使用总结
作用:
存储项目相关的配置信息,保护Servlet。解耦一些数据对程序的依赖。
使用位置:
每个Web 项目中;
Tomcat服务器中(在服务器conf目录下)
区别:
Web项目下的web.xml文件为局部配置,针对本项目的配置;
Tomcat下的web.xml文件为全局配置,配置公共信息;
内容(核心组件)
全局上下文配置(全局配置参数)
Servlet配置
过滤器配置
监听器配置
加载顺序:
Web容器会按ServletContext -> context-param -> listener -> filter -> servlet这个顺序加载组件,这些元素可配置在web.xml文件中的任意位置。
在服务器启动时完成加载。
server.xml
问题:
浏览器发起请求后,服务器根据请求在webapps目录下调用对应的的Servlet进行请求处理。那么为什么是webapps目录,难道不能是其他的文件吗?
解决:
了解server.xml文件的配置信息
server.xml文件的核心组件
<Server>
<Service>
<Connector/>
<Connector/>
<Engine>
<Host>
<Context/>
</Host>
</Engine>
</Service>
</Server>
热部署
<Context path="/Pet" reloadable="true" docBase="F:/PetWebroot"/>