MVC工作流程
Controller
接收用户的请求,并决定调用哪个Model来进行处理
Model
用逻辑处理用户的请求并返回数据
View
将返回的数据呈现给用户
![image-20220514134047211](https://anonymouscrush.oss-cn-qingdao.aliyuncs.com/img/image-20220514134047211.png)
Servlet
Servlet 其实是在 Java Web 容器中运行的小程序。用户通常使用 Servlet 来处理一些较为复杂的服务器端的业务逻辑。
Servlet的配置
基于web.xml
在 web.xml 中,Servlet 的配置在 Servlet 标签中,Servlet 标签是由 Servlet 和 Servlet-mapping 标签组成,两者通过在 Servlet 和 Servlet-mapping 标签中相同的 Servlet-name 名称实现关联。
<servlet>
<servlet-name>snoop</servlet-name>
<servlet-class>SnoopServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>snoop</servlet-name>
<url-pattern>/snoop</url-pattern>
</servlet-mapping>
基于注解方式
Servlet3.0以上的版本中,开发者无须在 web.xml 里面配置 Servlet,只需要添加@WebServlet
注解即可修改 Servlet 的属性。
@WebServlet(urlPatterns={"/test"})
public class test extends HttpServlet{
...
}
Servlet的访问流程
通过在浏览器地址栏中输入 user 比如 http://example.com/user ,即访问 url-pattern 标签中的值,浏览器发出请求,服务器通过 servlet-mapping 标签中找到文件名为 user 的 url-patternd ,通过其对应的 servlet-name 寻找 servlet 标签中 servlet-name 相同的 servlet;再通过 servlet 标签中的 servlet-name 获取 servlet-class 参数;最后得到具体的 class 文件路径,继而执行 servlet-class 标签中 class 文件的逻辑。
Servlet的接口方法
HTTP有8种请求方法,分别为GET、POST、HEAD、OPTIONS、PUT、DELETE、TRACE、以及CONNECT方法。Servlet接口中也对应着相应的请求接口,service()方法会检查HTTP请求类型,然后在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。
-
init()接口
在 Servlet 实例化后,Servlet容器会调用 init() 方法来初始化该对象,主要是使 Servlet 对象在处理客户请求前可以完成一些初始化工作,例如建立数据库的连接,获取配置信息等工作。 init() 方法在第一次创建 Servlet 时被调用,在后续每次用户请求时不再被调用。
init() 方法的定义如下:
public void init() throws ServletException{ // 初始化代码 }
-
service()接口
service()方法是执行实际任务的主要方法。Servlet容器(Web服务器)调用service()方法来处理来自客户端(浏览器)的请求,并将格式化的响应写回给客户端,每次服务器接收到一个Servlet请求时,服务器都会产生一个新的线程并调用服务。service()方法被调用之前,必须确保init()方法正确完成。
service()方法的定义如下:
public void service(ServletRequest request,ServletRequest response) throws ServletException,IOException{ // 处理用户请求的代码 }
-
doGet()/doPost()等接口
doGet()等方法根据HTTP的不同请求调用不同的方法。如果HTTP得到一个来自URL的GET请求,就会调用doGet()方法。
此类方法的定义如下:
public void doGet(ServletRequest request,ServletRequest response) throws ServletException,IOException{ // 处理不同HTTP请求的代码 }
-
destroy()接口
当Servlet容器检测到一个Servlet对象应该从服务种被移除时,会调用destroy()方法,以便Servlet对象释放它所使用的资源,保存数据到持久存储设备中。例如将内存中的数据保存到数据库中、关闭数据库连接、停止后台线程,把Cookie列表或单击计数器写入磁盘,并执行其他类似的清理活动等。destroy()方法与init()方法相同,只会被调用一次。
destroy()方法定义如下:
public void destroy(){ // 终止操作的代码 }
-
getServletConfig()接口
getServletConfig()方法返回 Servlet 容器调用 init() 方法时传递给 Servlet 对象的 ServletConfig 对象, ServletConfig 对象包含 Servlet 的初始化参数。开发者可以在 Servlet 的配置文件 web.xml 中,使用
<init-param>
标签为 Servlet 配置一些初始化参数。<servlet> <servlet-name>servlet</servlet-name> <servlet-class>org.test.TestServlet</servlet-class> <init-param> <param-name>userName</param-name> <param-value>panda</param-value> </init-param> <init-param> <param-name>E-mail</param-name> <param-value>test@test.net</param-value> </init-param> </servlet>
可在 Servlet 中通过 getServletConfig() 获得一些初始化的参数。
-
getServletInfo()接口
getServletInfo() 方法会返回一个 String 类型的字符串,包括关于 Servlet 的信息,如作者、版本及版权等。
Servlet的生命周期
Servlet生命周期指的是Servlet从创建直到销毁的整个过程。