Servlet介绍
Servlet是一个Web容器,我们通常用的Servlet是httpservlet,而httpservlet则又继承了genericServlet,而generiservlet又实现了Servlet接口;
Servlet工作原理
客户端发送请求至服务器,服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并转发给服务器,服务器将响应返回给客户端;
Servlet容器将Servlet类载入内存,并产生Servlet实例和调用它的具体方法,用户发起请求,Servlet容器调用service()方法,同时传入ServletRequest和ServletResponse对象,ServletRequest对象里封装了当前http请求,我们也不需要进行解析,ServletResponse表示当前用户的http请求响应,然后我们在返回给用户即可;
在一个应用程序中,每种Servlet类型只能有一个实例,对于每一个应用程序,Servlet容器都会创建一个ServletContext对象。封装了上下文的环境详情。每个应用程序只有一个ServletContext,一个Servlet对应一个上下文;
Servlet声明周期是:先进行实例化,然后是初始化,提供服务,在销毁,最后不可用,在这五个生命周期中,初始化调用的是init方法,这个方法只有一个,而提供服务则调用的是service方法,在我们的service层中,继承了httpServlet,其实就是对应了doGet(),doPost()方法,Servlet是单例的,非线程安全,所以说一般有一下几种解决方案:
- 继承SingleThreadModel,但是这样每次都会创建一个新的Servlet实例,比较消耗服务器内存,降低性能;
- 尽量避免使用全局变量,Servlet是一个单例多线程,使用全局变量会使浏览器访问时出现混乱;
- 通过使用ThreadLocal,内部是一个Map结构,用当前线程作为key,它会创建多个get,set 方法;
- 可以加锁用来解决线程问题;
servlet的配置文件 web.xml
<servlet>
<servlet-name>ImageCodeServlet</servlet-name> <servlet-class>org.leopard.code.ImageCodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImageCodeServlet</servlet-name>
<url-pattern>/d</url-pattern>
</servlet-mapping>
描述
在web.xml中,先写一个Servlet标签,Servlet标签中有两个子标签,一个叫Servlet-name,这个name可以随便起,但是要保证唯一性,另外一个就是Servlet-class,这个Servlet-class对应的就是后天提供服务的Servlet,除此之外还有一个Servlet-mapping,有子标签Servlet-name,要保证和上面的Servlet-name一致,还有一个子标签url-pattern,这是一个虚拟路径,用来发送请求地址的URL;