一、介绍:
1.servlet接口来自于Servlet规范下一个接口,这个接口存在Http服务器提供的jar包中
2.TomCat服务器下lib文件有一个servlet-api.jar存放servlet接口
3.servlet规范中规定,Http服务器能调用的【动态资源文件】必须是一个Servlet接口实现类
1 | //举个例子 |
二、ServLet接口实现类开发步骤:
1.创建一个Java类继承于HttpServlet父类,使之成为一个servlet接口实现类
2.重写HttpServlet父类两个方法,doGet或doPost
3.将网站->web->web_INF->web.xml文件配置
①将servlet接口实现类类路径地址交给tomCat
1 | <servlet> |
②为了降低用户访问servlet接口实现类难度,需要设置简短的别名
1 | <servlet-mapping> |
三、servlet对象的声明周期
1.网络中所有的servlet接口实现类的实例对象只能由Http服务器负责创建
2.在默认情况下,Http服务器接收到对于当前Servlet接口实现类第一次请求时自动创建这个Servlet接口实现类的实例对象
在手动配置情况下,要求Http服务器在启动时自动创建接口实现类的实例对象
3.在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象,当你再去访问servlet时,不会再次创建
4.在Http服务器关闭时刻,自动将servlet接口实现类全部销毁
1 | //在xml文件中设置servlet |
下面我们来看看如何使用代码解释
1 | public class OneServlet extends HttpServlet { |
1 | <servlet>//xml文件 |
如图所示两个servlet的创建时间
四、HttpServletResponse接口
1.介绍:
1).HttpServletResponse接口来自于Servlet规范中,在TomCat中存在servlet-api.jar包中
2).HttpServletResponse接口实现类由Http服务器负责提供
3).HttpServletResponse接口负责将doGet和doPost方法执行结果写入到响应体中交给浏览器
4).HttpServletResponse接口修饰的对象称为响应对象
2.主要功能:
1).将执行结果以二进制形式写入到响应体中
2).设置响应头中content-type属性值,从而控制使用对应编译器将响应体二进制数据编译为对应的图片,视频或文本
3).设置响应头中location属性,将一个请求地址赋值给location从而控制浏览器向指定服务器发送请求
下面我们来看看代码层面的解释
其中xml文件在此省略,都是创建和起别名的代码文件
1 | /** |
但上述方法会存在一个问题,如果我们使用write输出字符,字符串,ASCII码写入到二进制文件中
1 | public class TwoServlet extends HttpServlet { |
所以经过上述问题,我们在绝大多数情况下均使用print来代替write
1 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
上述代码中出现两个问题:
其一:我们希望br作为标签使用,而不是作为字符串形式使用,问题在于浏览器在接受到相应的相应包后,根据相应包中content-type来决定编译方式,默认属性值为text,对应文本编译器,所以一定要在得到输出流之前设置编译方式
其二:我们发现如果输入中文会出现乱码形式,那么我们需要根据上述的格式,在content-type后设置UTF-8字符集
五、HttpServletRequest接口
1.介绍:
1).HttpServletRequest接口来自于Servlet规范中,在TomCat中存在servlet-api.jar包中
2).HttpServletRequest接口实现类由Http服务器负责提供
3).HttpServletRequest接口负责在doGet和doPost方法运行时读取Http请求协议包中的信息
4).HttpServletRequest修饰的对象成为请求对象
2.作用:
1).可以读取Http请求协议包中请求行的信息
2).可以读取保存在Http请求协议包中请求头或者请求体中的请求参数
3).可以替代浏览器向Http服务器申请资源文件调用
接下来时代码的实际分析
xml文件省略
1 | public class OneServlet extends HttpServlet { |
上述代码展示了如何利用请求对象的获取请求行中的信息
1 | public class TwoServlet extends HttpServlet { |
上述代码利用request请求对象来获取请求头中的参数信息
1 | public class ThreeServlet extends HttpServlet { |
上述代码表示如何利用请求对象来获取请求头或请求体中的参数信息,但上述代码存在一个问题
当Get形式发送中文参数内容,正常得到,当Post形式发送时,收取到的结果会是乱码
原因:
当浏览器以Get形式发送请求时,请求参数保存在请求头,在http请求包到达http服务器后,第一件事就是进行解码,请求头二进制内容由TomCat服务器进行解码,TomCat9.0默认使用的是UTF-8字符集
当浏览器以Post形式发送请求时,请求参数保存在请求体中,在http请求包到达http服务器中,请求体二进制内容由请求对象(request)负责解码,默认使用ISO-8859-1字符集
解决方案
在Post请求方式下,在读取请求体内容之前,应该通知请求对象使用UTF-8字符集进行解码
1 | request.SetCharacterEncoding("UTF-8"); |
六、请求对象与响应对象的声明周期
1.在Http服务器接收到浏览器发送的Http请求协议包后,自动为当前的Http请求协议包生成一个请求对象和响应对象
2.Http服务器调用doGet和doPost方法时,负责将请求对象和响应对象作为实参传递到方法中,确保doGet和doPost正确执行
3.在Http准备推送Http响应协议包时之前,负责将本次请求故关联的请求对象和响应对象销毁
请求对象和响应对象声明周期贯穿一次请求的处理过程
七、默认欢迎文件
用户发送了一个针对某位网站的默认请求时,此时由Http服务器自动从当前网站返回的资源文件
正常请求:http://localhost:8080/myWeb/index.html
默认请求:http://localhost:8080/myWeb/
Tomcat对于默认欢迎资源文件定位规则
1.定义规则的位置:TomCat安装包下的/conf/web.xml文件中
2.规则命令:先去找网站下的index.html文件,找不到去找index.htm文件,找不到再去找index.jsp文件,如果都没有找到则返回404页面
3.设置当前网站的默认欢迎资源文件
·网站/web/WEB-INF/web.xml文件
·命令规则
1 | <welcome-file-list> |
1 |
|
1 | 3.优点: |
1 | 3).请求方式:在请求转发过程中,浏览器只发送了一个Http请求协议包,参与本次请求的所有Servlet共享一个请求协议包,因为这些servlet接受的请求方式与浏览器发送的请求方式保持一致 |
1 | **十三、Cookie** |
1 | ***cookie相当于一个map,一个cookie只能存放一个键值对 |
1 | **十三、HttpSession接口:** |
}}
1 | 3.Http服务器如何将用户与HttpSession关联起来 |
1 | **十四、HttpServlertRequest接口实现数据共享** |
1 | **十五、Servlet规范拓展-----------监听器接口** |
1 | **5.ServletContextAttributeListener接口:** |
1 | **十六、Filter-----过滤器接口** |
}}
//在xml文件中注册Filter
1 | 3.过滤器对拦截的请求进行增强操作 |
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException{
servletRequest.setCharacterEncoding(“utf-8”);
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
配置xml文件
1 | 4.Filter拦截地址格式 |
1 | 2).命令作用:拦截地址通知tomcat在调用何种资源文件之前需要调用OneFilter过滤进行拦截 |
1 | 4).要求Tomcat在调用某一个文件夹下所有的资源之前,来调用OneFilter拦截 |
1 | 5).要求Tomcat在调用任意文件夹下某种资源之前,来调用OneFilter拦截 |
1 | 6).要求Tomcat在调用任意文件之前,来调用OneFilter拦截 |