文章目录
- Servlet
- servlet 简介
- Servlet 入门案例
- 页面编写
- 页面提交 get 请求
- Servlet 和 Tomcat 关系
- servlet-api
- get 和 post 请求
- Servlet 生命周期
- 案例
- HttpServletRequest 接口
- 简介
- 文件上传
- FileServlet 类
Servlet
servlet 简介
servlet 全称为 server applet 是服务器的小程序,是用 java 语言编写的服务器程序,目的是和浏览器交互并且动态的生成 web 内容; servlet 具体是指实现了 Servlet 接口的类,servlet 运行于支持 java 的应用服务 器(tomcat)中。 从原理上讲,servlet 可以响应任何的请求,但是在绝大多数时 servlet 用来扩展基于http 协议的 web 服务。 简单理解:之前学习过的 JDBC 技术是用来实现 java 语言和数据库之间的连接技术,现在 需要实现 java 语言和浏览器进行连接,就需要一个像 JDBC 这样的一个中间件,servlet 就作为这个中间件;
Servlet 入门案例
使用 servlet + jsp 技术,实现页面登录时用户名和密码输入,后台获取页面上输入的用 户名和密码;
页面编写
web.xml
servlet 类
/**
* 通过 web.xml 配置文件建立与前端页面和后台 servlet 连接
* 在 servlet 类中就可以针对页面发送的请求进行对应的处理;
* 处理请求的方案,要根据页面发送请求时的请求方式来决定:
* jsp 页面上常用两种请求方式:
* ① get -- servlet 类中可以使用 doGet 方法来进行请求的处理
* ② post -- servlet 类中可以使用 doPost 方法来进行请求的处理
* 如果不知道页面发送请求时的请求方式,servlet 类中有提供通用
* 方法 service 该方法可处理任意方式的请求;
* service 方法的工作原理:
* ① 拦截请求,任意请求方式的请求都能拦截
* ② 分析被拦截的请求具体使用的是哪种请求方式
* ③ 根据分析结果去调用对应的 doXXX 方法来处理该请求 */
public class LoginServlet extends HttpServlet {
/* Servlet 接口中定义好的 doGet 方法,用于页面的 get 请求处理*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 请求处理三部曲:
* ① 获取请求参数
* ② 请求参数处理
* ③ 响应结果给页面 */
String username = req.getParameter("username"); String pwd = req.getParameter("pwd");
System.out.println(username + "----" + pwd);
}
/* Servlet 接口中定义好的 doPost 方法,用于页面的 post 请求处理*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
/* Servlet 接口中定义好的 Service 方法,可用于任意请求处理*/
@Override
页面提交 get 请求
控制台输出结果
Servlet 和 Tomcat 关系
Servlet 是 tomcat 的一个组件,Servlet 的功能需要依赖 tomcat 的 servletapi.jar;在 web 工程启动时,有了这个 jar 包就可以直接使用里面的功能,tomcat
会直接解析运行。
Tomcat 在启动时,会根据 web.xml 配置文件进行容器的初始化;初始化
ServletConfig、ServletContext 对象,以及 HttpServletRequest 和
HttpServletResponse 对象;一起交给 Servlet;此后 Servlet 就具备了相关的一
些功能;
servlet-api
servlet-api 下主要有两部分内容;一个是 javax.servlet,另一个是
javax.servlet.http;
javax.servlet 中主要是一些接口的定义,例如 Servlet 接口、抽象类
GenericServlet,这些都是通用的接口或者抽象类;
javax.servlet.http 中定义了与 http 请求相关的类和接口;例如HttpServlet类、
HttpServletRequest 和 HttpServletResponse 接口;
Servlet 接口、 GenericServlet 抽象类、 HttpServlet类 三者之间的关系如下
图:
在自定义 servlet 类时,可以直接实现 Servlet 接口或者是继承抽象类
GenericServlet;但是不建议这么做,因为在接口和抽象类中会存在大量的抽象方法,需要
重写不必要的方法;HttpServlet 作为 GenericServlet 的子类,必然已经实现类接口
和抽象中的抽象方法,所有继承 HttpServlet 不需要去重写大量的抽象方法,只需要关注
我们需要的方法即可;
因此 HttpServlet 类时我们在自定义 Servlet 类的首选父类;
get 和 post 请求
get 和 post 是页面在进行数据提交时的两种不同方式,在 servlet 进行处理时也会有对
应的方法;
get -- doGet 方法
post -- doPost 方法
doGet 和 doPost 都是 service 方法的拆分;不管页面是以哪种请求方式进行请求的发
送,都会先通过 service 方法,由 service 方法进行分析,再来决定该调用什么方法进
行请求的处理;
两种请求方式的区别:
① 参数传递方式不同:
get 所有的请求参数都会在地址栏进行拼接;
post 不会在 url 中显示,而是在请求内容中,相对于 get 更安全
② 传送数据大小不同
get 传送的数据量较小,主要是因为 url 长度受限;
post 传送的数据一般认为是不受限制的;
③ 信息缓存
get 提交的数据能被缓存,请求保留在浏览器的历史记录中;
post 一半不能被缓存,不会保存在浏览器的历史记录中;
④ 编码方式与乱码
get 请求默认编码格式为 ISO-8859-1(tomcat8以前),tomcat8 以后默认为
utf-8;因此在使用 tomcat8 以前的版本进行请求参数获取时,需要进行编码格式的转换;
String username = request.getParamter("username");
String new_name = new String(username.getByte("iso-8859-
1"),"utf-8");
post 请求支持多种编码类型,可以使用更好的方式进行编码的转换
request.setCharacterEncoding("UTF-8");
如果是在响应的时候乱码,也可以使用 response 对象进行响应编码设置
response.setContentType("text/html",charset="utf-8")
总结:表单或者是 AJAX 在进行请求发送时,一般使用 post 请求方式;如果是 a 标签进
行请求的发送,默认是 get 请求;
Servlet 生命周期
案例
doGet 和 doPost 都是 service 方法的拆分;不管页面是以哪种请求方式进行请求的发
送,都会先通过 service 方法,由 service 方法进行分析,再来决定该调用什么方法进
行请求的处理;
两种请求方式的区别:
① 参数传递方式不同:
get 所有的请求参数都会在地址栏进行拼接;
post 不会在 url 中显示,而是在请求内容中,相对于 get 更安全
② 传送数据大小不同
get 传送的数据量较小,主要是因为 url 长度受限;
post 传送的数据一般认为是不受限制的;
③ 信息缓存
get 提交的数据能被缓存,请求保留在浏览器的历史记录中;
post 一半不能被缓存,不会保存在浏览器的历史记录中;
④ 编码方式与乱码
get 请求默认编码格式为 ISO-8859-1(tomcat8以前),tomcat8 以后默认为
utf-8;因此在使用 tomcat8 以前的版本进行请求参数获取时,需要进行编码格式的转换;
String username = request.getParamter("username");
String new_name = new String(username.getByte("iso-8859-
1"),"utf-8");
post 请求支持多种编码类型,可以使用更好的方式进行编码的转换
request.setCharacterEncoding("UTF-8");
如果是在响应的时候乱码,也可以使用 response 对象进行响应编码设置
response.setContentType("text/html",charset="utf-8")
总结:表单或者是 AJAX 在进行请求发送时,一般使用 post 请求方式;如果是 a 标签进
行请求的发送,默认是 get 请求;
Servlet 生命周期
Servlet 生命周期指 servlet 从初始化到被销毁的整个过程;整个过程分为三个阶段:
① 容器的初始化 -- init()
② 容器的使用 -- service -- doXX
③ 容器销毁 -- destroy
初始化是在服务器启动后第一次访问 servlet 时;容器只会初始化一次;
使用是在页面发送请求后,使用对应的方法进行请求的处理;
销毁是服务器关闭;
一个 Servlet 想要正常的工作,必须先进行容器的初始化,然后根据请求方式提供对应的服
务;
案例
public class LifeServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("容器被初始化了.....");
}
@Override
protected void service(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
System.out.println("提供服务.....");
}
@Override
public void destroy() {
System.out.println("容器被销毁.....");
}
}
web.xml
发送请求
执行结果
如果需要在服务器启动时就进行容器的初始化,可以在 web.xml 配置文件中进行初始化时间
的设置;
<load-on-startup>0</load-on-startup>
设置为大于等于0的整数,表示在服务器启动时就进行容器的初始化;
HttpServletRequest 接口
简介
HttpServletRequest 接口称为请求处理对象,是 ServletRequest 的子接口,在
Serlvlet 初始化时被创建(可能是容器启动时,或者是第一次访问容器时)并且交给
service 方法来使用;
请求对象可用于接收客户端请求、获取请求参数,还可以获取主机地址、端口号、请求方式、
项目路径等功能;
一个请求被分为三个部分:分别是请求行、请求头、请求体
请求行
通过 request 对象相应的方法可以获取请求行中的内容;请求行中主要包含:http 协议、
服务、端口、项目名称、请求方式、参数列表等;
jsp 页面
web.xml
servlet 类
请求头
请求头是当前用户发送的数据的描述信息;
请求头内容时浏览器在发送请求时自动添加的,不需要编程人员操作;
如果想要查看请求头中的内容,可以使用 getHeader 方法进行获取;
jsp 页面
web.xml
servlet 类
请求体
请求体就是发送请求是所携带的数据,也就是后台需要去获取的页面传递的参数;
使用 request 提供的 getParamter 方法或者是 getParamterValues 方法进行传递
参数的获取;两个方法的返回值都是 String 类型;即是不管页面上输入的是什么类型的数
据,最终获取到后都是字符串;
jsp 页面
web.xml
servlet 类
文件上传
文件上传指的是将本地的文件上传到服务器;使用 form 表单和请求对象来实现,和常规的请
求参数略有不同;
首先在 form 标签中需要添加一个额外的属性来支持表单实现文件上传的功能
<form action="" method="" enctype="multipart/form-data"></form>; 有
了 enctype="multipart/form-data" 属性,请求方式必须是 post 请求;
其次对于处理文件上传请求的 servlet 需添加一个注解 @MultipartConfig
jsp 页面