Servlet
1、Servlet是什么?
Servlet是与平台无关的服务器组件,绝大多情况下用来拓展基于HTTP协议的web服务器,它运行在Web服务器(也就是tomcat),负责与服务端进行通信。
2、Servlet的功能
主要的功能在于交互式浏览和修改数据,生产动态Web内容,简单说两点主要功能-创建并返回基于客户请求的动态HTML页面-与数据库进行通信。
3、Servlet的使用
Servlet本身是一组接口,自定义一个类,并且Servlet接口,这个类就具备了接受客户端请求以及做出相应的功能。
package com.code.servlet;
import javax.servlet.*;
import java.io.IOException;
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//用于初始化
}
@Override
public ServletConfig getServletConfig() {
return null;//获取Servlet对象
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//进行服务与客户端通信
}
@Override
public String getServletInfo() {
return null;//返回一些Servlet信息
}
@Override
public void destroy() {
//卸载对象
}
}
复制代码
写完之后还无法执行,浏览器不能直接访问Servlet文件,只能通过映射的方式来间接的访问Servlet,所以需要我们进行配置,主要有两种配置方式
- 基于xml文件的配置方式,在WEB-INF文件夹中找到web.xml文件进行配置,将demo1与MyServlet进行映射,即在浏览器地址栏中直接访问demo就可以映射到MyServlet
<servlet>
<servlet-name>hello</servlet-name> //可以随意起个名字
<servlet-class>com.code.servlet.MyServlet</servlet-class>
</servlet> //需要填充路径
<servlet-mapping>// 映射
<servlet-name>hello</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
复制代码
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("我是Servlet,我已经接收到客户端请求");
servletResponse.setContentType("text/html;charset=UTF-8");
servletResponse.getWriter().write("客户端你好,我已接收到你的请求");
}
复制代码
在MyServlet中的service添加代码演示。之后使用tomcat使用运行MyServlet即可。
首先我们会得到index.jsp里面的内容然后通过/demo即可跳转
- 也可以使用注解的方式
@WebServlet("/demo1")
public class MyServlet implements Servlet {
}
复制代码
得出的结果和xml配置时完全一致的
4、Servlet的生命周期
- 当浏览器访问Servlet时,Tomcat会查询当前Servlet的实例化对象是否存在,如果不存在则通过反射机制动态创建对象->通过init方法对对象完成初始化操作->调用service方法完成有任务逻辑操作->最后关闭Tomcat时,会调用destory方法,释放当前对象所占用的资源。
- 如果浏览器中存在Servlet的实例对象则直接执行service完成业务逻辑操作最后关闭
- Servlet的生命周期创建对象使用的是无参构造函数(只会调用一次),初始化inti(只会调用一次),service服务(可以调用多次),destory(在关闭时调用一次)
5、从Servler->GenericServlet->HttpServlet
代码变得更为简单化,我们定义的Servlet类只需继承HttpServlet即可,重写doGet和doPost
package com.code.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("get");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("post");
}
}
复制代码
HTTP请求常用的四种类型(类似增删改查)
- Get 读取
- Post 保存
- Put 修改
- Delete 删除
GenericServlet实现Servlet接口,同时为他的子类屏蔽了不常用的方法,子类只需要重写service方法即可。
HttpServlet继承GenericServlet,根据请求类型进行分发处理,Get进入doGet方法,Post进入doPost方法。
总的来说即Servlet接口中的service方法中包括doGet,doPost,GenericServlet中包含了init,service,destory方法,HttpServlet继承时可以直接根据类型选择执行doGet,doPost,Put,Delete方法等。
第一次写博客,希望看到有错误的地方或有不同见解能指出