Servlet(一)
一、Servlet规范
1.1、介绍
Servlet规范来自于JAVAEE规范中的一种
1.2 作用
- 在Servlet规范中,指定动态资源文件开发步骤
- 在Servlet规范中,指定Http服务器调用动态资源文件规则
- 在Servlet规范中,指定Http服务器管理动态资源文件实例对象规则
二、Servlet接口实现类
- Servlet接口来自于Servlet规范下的一个接口,这个接口存在于Http服务器所提供的jar包中
- Tomcat服务器中lib文件夹下有一个Servlet-api.jar存放着Servlet接口
- Servlet规范中任务,Http服务器调用的动态资源文件必须是一个Servlet接口实现类
三、Servlet接口实现类开发步骤
我们通常都是去继承HttpServlet而不是去实现Servlet接口呢?
首先要明白的就是抽象类的好处:
降低接口实现类对接口实现过程难度,将接口中不需要使用抽象方法交给抽象类完成
这样接口实现类只需要对接口需要的方法进行重写。
对于Servlet接口来说,除了service方法,其余四个方法用不到,重写加大开发难度,
HttpServlet抽象类继承了GenericServlet抽象类,这个GenericServlet抽象类实现了Servlet接
口,对Servlet接口中四个不常用的方法进行了空实现,所以使用继承HttpServler为我们开发更方
便
3.1、Tomcat调用Servlet实现类的规则
- Tomcat有能力创建Servlet实现类对象
Servlet oneServlet=new OneServlet();//这里假设OneServlet就是我们的实现类
- Tomcat根据实例对象调用service方法处理请求
oneServlet.service
3.2、开发步骤
1.创建一个java类继承与HttpServlet父类,使之成为Servlet接口实现类
2.重写HttpServlet父类两个方法,doGet和doPost
3.将Servlet接口实现类信息注册到Tomcat服务器
4.为了降低用户访问servlet接口实现类难度,需要设置简短请求别名
【网站】----->【web】------>【WEB-INF】----->web.xml
将Servlet接口实现类类路径地址交给Tomcat
<servlet>
<servlet-name>OneServlet</servlet-name>//声明一个变量存储servlet接口实现类类路径
<servlet-class>com.bd.rj.controller.OneServlet</servlet-class>//声明servlet接口实现类类路径
</servlet>
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>//设置简短的请求别名,不能忘了”/“
<servlet-mapping>
四、Servlet对象生命周期
1.网站中所有的servlet接口实现类的实例对象,只能由Http服务器负责创建。
开发人员不能手动创建Servlet接口实现类的实例对象
2.在默认的情况下,Http服务器接收到对于当前Servlet接口实现类第一次请求时自动创建这个Servlet接口实现类的实例对象
<load-on-stratup>1<load-on-startup>//表示tomcat启动时创建接口实现类对象
3.在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象
4.在Http服务器关闭的时刻自动将网站中所有的Servlet对象进行销毁
五、HttpServletResponse接口
5.1、基础介绍:
- 这个接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar
- HttpServletResponse接口实现类由http服务器负责提供
- HttpServletResponse接口负责将doGet和doPost方法执行结果写入到响应体交给浏览器
- 开发人员习惯于将HttpServletResponse接口修饰的方对象成为【响应对象】
5.2、作用:
- 将执行结果以二进制的形式写入到响应体
- 设置响应头中content-type属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字,图 片,视频,命令】
- 设置响应头location属性,将一个请求地址赋值给location从而控制浏览器向指定服务器发送请求
六、HttpServletRequest接口
6.1、基础介绍:
-
HttpservletRequest接口来自于servlet规范中,在Tomcat中存在servlet-api.jar
-
HttpservletRequest接口实现类由Http服务器负责提供
-
HttpservletRequest接口负责在doGet/doPost方法运行时读取tttp请求协议包中信息
-
开发人员习惯于将HttpservletRequest接口修饰的对象称为【请求对象】
6.2、作用:
-
可以读取日ttp请求协议包中【请求行】信息
-
可以读取保存在Http请求协议包中【请求头】或则【请求体】中请求参数信息
-
可以代替浏览器向Http服务器申请资源文件调用
七、Get和Post的区别
7.1、基础介绍:
GET产生一个TCP数据包;POST产生两个TCP数据包
-
GET请求:浏览器会把Header和data一并发送出去,响应为200状态码
-
POST请求:浏览器会先发送Header过去,响应为100,浏览器会再发送data到服务器
7.2、区别:
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制,允许二进制。
- GET请求只能进行url编码,而POST支持多种编码方式,可以为二进制使用多重编码。
- POST 比 GET 更安全,GET把参数包含在URL中,POST通过request body传递参数。
- 对参数数据长度的限制,GET方法URL的长度是受限制的,最大是2048个字符,POST参数数据是没有限制的。
- GET请求会被浏览器主动缓存,POST不会,除非手动设置。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
八、字符编码问题
8.1、Http Request的编码
通常浏览在发送一个请求到服务器的时候,不会设置字符编码,在服务器端为了统一编码,可以在filter 中使用request.setCharacterEncoding(“UTF-8”)来设置编码. 一般浏览器都是用默认的ISO-8859-1字符编码,要解决中文参数乱码的时候都必须这一步。
request.setCharacterEncoding("UTF-8")
8.2 、Http response的编码
Http response中可以设置输出到浏览器的数据使用的编码方法
response.setCharacterEncoding("UTF-8")
response.setContentType("text/html; charset=UTF-8")
如果只是单纯的设置编码,最好是response.setCharacterEncoding(“UTF-8”),因为response.setContentType(“text/html; charset=UTF-8”)是针对具体的MIME类型设置对应的字符编码。需要注意的是这里设置的编码对JSP页面不一定起作用,理由是JSP页面有自己设置字符编码的方式,而且优先级更高。