1.1 Servlet入门案例
1.1.1 Servlet简介
Servlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
- 摘自WIKI
1.1.2 入门案例开发及其步骤
- 开发步骤
- 创建一个WEB项目
- 之前已经讲过了
- 在WEB项目中创建一个类,让该类去实现Servlet接口(继承Servlet接口的实现类)
- 实现一个方法
- 创建一个WEB项目
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
res.getWriter().println("小熊先生");
}
创建项目以及继承.png
- 添加web.xml文件并且在文件中进行相关的配置 添加如下代码
- 可以从其他项目先拷贝 然后修改
<servlet>
<servlet-name>DemoServlet</servlet-name>
<servlet-class>com.heima.servlet.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DemoServlet</servlet-name>
<url-pattern>/DemoServlet</url-pattern>
</servlet-mapping>
- 发布WEB项目至WEB服务器
1.2 Servlet的执行过程
- 通过主机名查找硬件服务器
- 通过端口号查找WEB服务器
- 通过项目名称查找发布在WEB服务器的项目
- 通过资源名称查找映射的路径
- 通过映射的路径查找Servlet的name
- 查找相同的Servlet的name
- 查找到要执行的Java类
1.3 使用Eclipse创建Servlet
- 创建WEB项目
- 创建servlet
在src下
创建servlet.png- 创建完成
web.xml文件已经自动创建,可以打开看看,里面的配置已经自动补全
但是这里是重要的内容,如果你删除src中的.class文件,xml文件是无法自动删除配置的
实现其中的方法就可以
public class Demo01 extends HttpServlet {
private static final long serialVersionUID = 1L;
public Demo01() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().println("lalal");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
1.4 Servlet补充知识
servlet结构.png- 这里讲解一下上图的Httpservlet
按住ctrl 鼠标点击Httpservlet可以跳转方法,这里我已经给大家把图截好了
HttpServlet 中的servicr 继承了 GennericServel 在往上则是实现了 servlet 的方法
这里和我们第一个入门案例相同了,就是都是实现了service 方法
大家了解下
1.5Servlet的生命周期
servlet的方法
方法 | 描述 |
---|---|
destroy() | Called by the servlet container to indicate to a servlet that the servlet is being taken out of service. |
init(ServletConfig config) | Called by the servlet container to indicate to a servlet that the servlet is being placed into service. |
service(ServletRequest req, ServletResponse res) | Called by the servlet container to allow the servlet to respond to a request. |
- 出生
- 第一次访问Servlet时由WEB服务器创建对象
- 第一次访问Servlet时进行初始化,并调用方法init()
- 活着
- 每次访问Servlet都会调用他的service方法
- 死亡
- 当WEB服务器关闭的时候会销毁Servlet的对象
- 当WEB服务器关闭的时候会调用destory()方法
为了更加清晰易懂的说明,可以使用下面的自己代码调试一下
public class Demo2Servlet extends HttpServlet {
public Demo2Servlet() {
//创建对象时调用
System.out.println("Servlet的对象创建了");
}
@Override
public void init() throws ServletException {
//初始化
System.out.println("Servlet被初始化了");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("Servlet被执行了");
}
@Override
public void destroy() {
//销毁
System.out.println("Servlet被销毁了");
}
1.6 Servlet的线程安全问题
如果有多个客户端并发的访问同一个Servlet,WEB服务器会为每一个客户端的请求创建一个线程,在线程中调用Servlet的service方法,如果多个线程并发的访问同样的数据,那这个时候就有可能会出现线程的安全问题
- 方法1:
- 一般情况下我们会采用多线程的中学习过的同步锁,但是同步锁会导致只能有一个线程访问,造成的最直接的结果就是,只有一个人可以访问这个网站,其他人需要等待
- 方法2: 实现SingleThreadModel接口,这个实际的产生的结果就是每次访问都会创造一个对象 ,依然不能解决问题,是一个已经过时的接口。
public class Demo3Servlet extends HttpServlet implements SingleThreadModel {
int num = 0;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
num++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(num);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
- 还有最后一个比较直接的办法,减少成员变量的使用,尽可能的使用局部变量。
1.7 Servlet的一些配置细节
-
servlet-mapping
- 除了可以配置资源名称,也可以进行路径的配置,而且路径可以有多层
同一个Servlet我们可以配置多个映射路径
配置Servlet映射路径时可以使用通配符(*),使用通配符只有两种格式-
格式1
-
.扩展名,比如.do
不能以正斜杠开头
-
.扩展名,比如.do
-
格式2
- 可以使用正斜杠开头,也需要使用"/"来结尾
不能在后面加上扩展名
- 可以使用正斜杠开头,也需要使用"/"来结尾
-
- 除了可以配置资源名称,也可以进行路径的配置,而且路径可以有多层
<servlet>
<description></description>
<display-name>Demo4Servlet</display-name>
<servlet-name>Demo4Servlet</servlet-name>
<servlet-class>com.itheima.servlet.Demo4Servlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Demo4Servlet</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
- load-on-startup
- tomcat启动的时候直接创建Servlet的对象
<servlet>
<description></description>
<display-name>Demo3Servlet</display-name>
<servlet-name>Demo3Servlet</servlet-name>
<servlet-class>com.itheima.servlet.Demo3Servlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
- 配置启动的时候加载 <load-on-startup>2</load-on-startup>
- 如果初始化的时候做了一些耗时操作,为了防止第一个人访问的时候很慢,就可以采用这种方式
- 传一个正整数 越小优先级越高
网友评论