web应用Servlet详解

servlet介绍

servlet是web应用的一个十分重要的角色,负责动态创建网页以及对客户端的请求进行处理和响应。它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

servlet的生命周期

servlet是统一由web容器来进行管理,无需用户自己创建。
1.servlet创建以及实例化。容器先在内存中找servlet是否已经实例化,如果有直接从内存中拿出来用,如果没有才自己进行创建以及实例化。
2.servlet初始化,它只在servlet被创建后执行一次,无法再次调用。
3.服务,执行servlet的service()方法,service方法里面调用的是实现的servlet的doGet或者doPost方法。
4.销毁,当servlet执行完毕后,会释放资源,由容器来进行自动回收和销毁,调用destroy()方法。

idea创建web应用

在file里面选择新建工程,选择java里面的web Application选项,注意看下面要勾选创建web.xml,如果没有勾选的话要自己配置web.xml
创建完成后,我在新建java文件,写servlet和filter的时候找不到javax.servlet的包,我查了一下,是没有导入tomcat服务器的配置,所以选择file按钮,然后点击 project structure按钮(快捷键是ctrl+alt+shift+s),选择Modules,点击右边有个“+”的符号,然后选择library,选择tomcat服务器就可以了,然后我们继承HttpServlet和实现Filter就可以看到了我们的需要的类和接口了。

servlet的代码示例

创建servlet有三种方式:
1.实现Servlet接口
2.继承HttpServlet类
3.继承GenericServlet类
HttpServlet是继承了GenericServlet,但是HttpServlet多出了一些方法,具体可以查看API文档

1
2
3
4
5
6
7
8
9
10
11
public class MyServlet extends HttpServlet{
protected void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
//...逻辑代码,处理请求
}

protected void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
//...逻辑代码,处理请求
}
}

虽然我们写了servlet的类,但是我们运行后容器并不能找到servlet文件,因为我们没有在web.xml文件里面写配置

servlet的配置

1
2
3
4
5
6
7
8
9
<servlet>
<servlet-name>内部名称</servlet-name>
<servlet-class>serlvet包名+类名(文件地址)</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>内部名称</servlet-name>
<url-pattern>映射地址(地址栏输入)</url-pattern>
</servlet>

地址匹配的模式可以有精确(/xxxx),路径(/xx/),扩展名(.do)
配置寻找相应的servlet的顺序是先servlet-mapping,比对地址是否相同(url-pattern),然后拿到内部名称(servlet-name),然后通过内部名称找到类的地址(servlet-class),然后实例化

过滤器

用户在将请求发送给servlet处理时,如果我们需要预先做一下筛选,那么可以增加一些效率以及可复用性。

过滤器的工作原理是:用户发请求经过过滤器(过滤路径相匹配才可以),然后过滤器会将请求数据过滤一遍再发送给servlet,如果有其他的过滤器那么会依次经过过滤器,最后发给servlet,servlet将请求处理完成 后响应,响应过程中也要经过之前通过的过滤器。

经过过滤器的顺序是由web.xml文件里面filter-mapping的顺序来进行,因为java文件编译成的字节码的执行顺序是由上至下进行,所以会先执行web.xml文件里面上面的filter。

过滤器的生命周期

过滤器的生命周期是和servlet的生命周期是一样的:
1.实例化,实例化过滤器类,只执行一次,并且也是有web容器创建
2.初始化,也有init()方法,里面是过滤器初始化的操作
3.服务,执行doFilter()方法里的操作,对请求数据进行处理
4.销毁,也有destroy()方法,由web容器自动销毁

过滤器的示例

过滤器的创建只能是实现Filter的接口

1
2
3
4
5
6
7
8
9
10
11
12
import javax.servlet.*;
import java.io.IOException;

public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//对请求进行处理
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
filterChain.doFilter(servletRequest,servletResponse);//如果没有其他的filter是可以不写的,当然写了也没有关系
}
}

过滤器的配置

当然过滤器也是有配置的

1
2
3
4
5
6
7
8
9
<filter>
<filter-name>自己起名字</filter-name>
<filter-class>相应的类的地址</filter-class>
</filter>

<filter-mapping>
<filter-name>自己起名字</filter-name>
<url-pattern>路径匹配</url-pattern>
</filter-mapping>

过滤器的路径匹配有四种方式,精准(/xxxx),目录(/xx/),扩展名(.do),全体(/*)
过滤器的匹配顺序是由小到大,先精准,然后目录,然后扩展名,然后全体

web容器

web容器是提供给web应用程序的一个环境变量,以及管理web应用程序的一个服务器程序。我们使用最常见的web容器就是tomcat
web容器里面有详细分工,有servlet容器,jsp容器等,不同容器工作任务不同。

servlet上下文

servlet上下文就是ServletContext,servlet上下文是web容器给web应用程序创建的一块共享的内存区域。servlet上下文随着服务器启动而产生,随着服务器关闭而销毁。