什么是Servlet?
Servelt是什么?网上有很多的回答,就拿菜鸟教程的话说:Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。其实说明白了Servlet就是运行在服务器端的一个Java小程序,是Sun公司提供的一套规范,让用户来处理客户端的请求,响应给浏览器一些动态资源。因此Servlet的实质就是Java代码,通过Java代码的API动态的向客户端输出数据。
Servlet规范包含了三个技术要点:1)Servlet;2)Filter(过滤器);3)Listener(监听器)。
小试Servlet
Servlet的实现其实就是实现Servlet的一个接口,实现类要实现Servlet中的几个方法:init(ServletConfig config)、service(ServletRequest request,ServletResponse response)以及destory()。
init(ServletConfig config)方法,即Servlet的初始化,只会在第一次访问的时候,才会调用这个方法,方法参数中的ServletConfig代表的是Servlet对象封装的配置信息;service方法是每次访问Servlet的接口都会调用;destory则是在服务器正常关闭的时候,才会被调用。
创建好Servlet实现类之后需要在Web.xml中手动配置Servlet。指定Servlet的名字和class的位置(包含报名),然后配置访问路径即在Servlet-mapping中指定当浏览器访问什么路径史访问指定的Servlet。
然后就可以启动Tomcat浏览器输入相应的地址就可以访问指定的Servlet。
客户端访问服务器的过程
客户端在访问服务器中我们创建的Servlet的过程是经历了四个步骤:
1)解析请求地址,如果发现虚拟路径,则解析web.xml文件后访问相应的Servlet,反之则直接访问服务器下的静态资源。
2)先判断Servlet是否存在于容器中,没有就创建并存放到容器中。
3)解析客服端提交的Http请求,将其信息解析到Request对象中,创建一个表示响应的Response对象,调用指定的Servlet类中的Service(ServletRequest req,ServletResponse res)方法。
4)将Response对象封装为Http响应并返回给客户端。
Servlet配置初始化信息
Servlet的基本信息可以在Servlet交给容器管理时进行参数的初始化配置。这些初始化参数信息都是配置在Web.xml中。
如果所示在Servlet配置的时候加入两个初始化参数,在Init(ServletConfig config)中进行获取。
Servlet的进阶
Servlet中的Service方法是Tomcat的唯一会调用的,但是针对于不同的请求类型(GET、POST、PUT、DELETE等)若是写不同的Servlet显得十分笨重,所以可以在Service方法中自己根据请求的类型来执行相应的方法。
public class BaseServlet implements Servlet {
private ServletConfig config;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.config=config;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String method = request.getMethod();
if(method.equalsIgnoreCase("get")){
doGet(request,response);
}else if(method.equalsIgnoreCase("post")){
doPost(request,response);
}else{
System.out.println("请求不支持");
return;
}
}
private void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
private void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
使用的时候只需要继承上面这个类重写doGet、doPost方法就可以重复使用一个Servlet。
上面的BaseServlet其实就是简单版本的HttpServlet。查看HttpServlet源码的Service方法便可知晓,只是加了更多的验证逻辑比如"Last-Modified"和“If-Modified-Since”的验证等。
Servlet的杂谈
在客服端访问后台服务器的时候会根据其请求地址来判断是否为虚拟路径来进行不同的返回,这里的虚拟路径包括了三种情况:
1)完全匹配,访问的资源与匹配的资源名称完全相同才能访问。
2)目录匹配,只要是在一个目录下,就回访问那个。
3)扩展名匹配,只要以什么结尾都会访问。
服务启动起来都有一个默认的欢迎界面,这里也是一样的,在Web.xml中的<welcome-file-list></welcome-file-list>也可以配置欢迎界面的地址。