[toc]
## Servlet 简介
Java Servlet是和平台无关的服务器端组件,**它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式**。
![](https://box.kancloud.cn/5ff9c18c15e248758a9bf66a76150dd9_999x332.png)
Servlet本质上就是一个运行在Servlet容器中的java类,现在充当容器的就是Tomcat
### 第一个Servlet——HelloWorld
1.创建一个Java类实现Servlet接口,用response给客户端一个hello world的响应
~~~
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter pw = resp.getWriter();
//向客户端发送信息
pw.println("hello world");
pw.close();
}
}
~~~
2.配置xml文件
~~~
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>Servlet.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
</web-app>
~~~
其中
~~~
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>Servlet.FirstServlet</servlet-class>
</servlet>
~~~
servlet-name的值可以随便起,但是Servlet-class必须严格按照类的位置写
~~~
<servlet-mapping>
<servlet-name>first</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
~~~
Servlet-mapping里的Servlet-name要和上面的保持一致,url-pattern表示的是为first映射一个访问路径/first(类似于提供一个能够访问到游戏角色的方式,其中/代表我们web应用的根目录)
### Servlet的生命周期
1.创建Servlet对象(注意:只创建一个对象并且只初始化一次)
2.Servlet完成初始化
3.对外提供服务
4.在关闭服务器或者服务器重启时销毁
### load-on-startup
可以指定Servlet被创建的时机
~~~
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.neusoft.javaweb.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
~~~
在加载完Servlet后直接就创建了Servlet实例,并进行了初始化,在此期间我们并没有提出请求。
如果配置了多个Servlet, load-on-startup的值越小越先启动(包括0,负数不会被启动,还是需要发出请求才创建实例并初始化);
### Servlet可能面临的问题
1.创建多少个对象的问题:只会创建一个对象和初始化一次
2.由于是创建了一个对象
由于一个资源(Servlet)会同时被多个客户端访问就会出现多个线程访问同一个资源的情况,
这个时候就要考虑线程安全问题
**如何避免**:不要在Servlet使用全局变量来作为下一步操作的判断依据。如果非得这么做,需要加锁。