一、Servlet简介
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
二、Servlet的运行过程
Servlet 的主要功能在于可以交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
1、客户端发送请求至服务器端。
2、服务器通过请求的 URI 信息找到对应项目下的 web.xml 文件,根据配置信息确定要调用的 Servlet
3、检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第5步,否则,执行第4步。
4、装载并创建该Servlet的一个实例对象,调用Servlet实例对象的init()方法。
5、创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
6、Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求。
7、服务器将响应返回给客户端。
三、Servlet的编写
1、在开发工具中创建web项目,创建普通的 java 类并继承 HttpServlet
2、重写 service 方法
3、在 service 方法中编写逻辑代码
4、在WEB-INF 文件夹下的 web.xml 文件中配置 servlet
四、web.xml 文件中的URL映射配置
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。
<servlet-mapping>元素用于映射一个已注册的Servlet的对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
<servlet>
<servlet-name>Servlet的注册名称</servlet-name>
<servlet-class>Servlet的完整类名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet的注册名称</servlet-name>
<url-pattern>Servlet的对外访问路径</url-pattern>
</servlet-mapping>
同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。
五、Servlet的生命周期
Servlet是一个供其他Java程序调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。即Servlet的生命周期为从第一次调用到服务器关闭。
init方法是对Servlet进行初始化的一个方法,会在Servlet第一次加载进行存储时执行。destory方法是在servlet被销毁时执行,也就是服务器关闭时。
如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。
六、service、doGet和doPost的区别
1、service 方法:
不管是get 方式还是post 方式的请求,如果Servlet 类中有service 方法,则优先调用Service 方法。
2、doGet 方法:
在没有service 方法的情况下,如果是get 方式的请求,则调用此方法处理请求。
3、doPost 方法:
在没有service 方法的情况下,如果是post 方式的请求,则调用此方法处理请求。
注意:如果在重写的service方法中调用了父类的service方法(super.service(arg0, arg1)),父类的 service 方法会根据请求方式调用相应的doGet和doPost方法执行。所以,一般情况下是不在重写的service中调用父类的service方法的,避免出现405错误。