Servlet一——概述
Servlet是Java所提供的一门用于开发动态WEB资源的技术,也是JavaEE的规范之一
一、Servlet的入门案例
首先我们来做一个Servlet的入门案例:向用户的客户端(浏览器)输出一些内容
1、开发步骤:
(1)创建一个WEB项目
(2)在WEB项目中创建一个类,让该类去实现Servlet接口或者继承Servlet接口的实现类
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Demo1 implements Servlet{
//摧毁Servlet对象,WEB服务器关闭时会调用destroy方法
@Override
public void destroy() {
// TODO Auto-generated method stub
}
//获取ServletConfig对象
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
//第一次访问Servlet时进行初始化,并调用方法init()
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
//Servlet的核心方法,访问Servlet对象都会调用service方法
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
arg1.getWriter().println("hello");
}
}
类中的五个方法,都是接口中的抽象方法,需要进行重写。
(3)在web.xml文件中进行相关的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>web06</display-name>
<servlet>
<servlet-name>Demo1</servlet-name>
<servlet-class>com.itheima.servlet.Demo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>/Demo1</url-pattern>
</servlet-mapping>
</web-app>
Servlet配置的细节:
servlet-mapping:对资源的映射路径进行配置,“/”代表当前项目
除了可以配置资源名称,也可以进行路径的配置,而且路径可以有多层,但是在访问的时候,必须输入配置文件中完整的路径。
同一个Servlet可以配置多个应映射路径,都可以对文件进行访问。
配置Servlet映射路径时可以使用通配符(),使用通配符只有两种格式:
格式1:.扩展名,比如*.do,但是不能以正斜杠开头,可以使用任意资源名称.do访问
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
格式2:如果以正斜杠开头,也必须使用"/"来结尾,资源名称可以任意写,也可以不写,访问时可以加扩展名也可以不加,但是配置的时候不能再后面加上扩展名。
<servlet-mapping>
<servlet-name>Demo1</servlet-name>
<url-pattern>/Demo1/*</url-pattern>
</servlet-mapping>
load-on-startup:配置创建Servlet对象的时间,属性值为正整数,数值越小,优先级越高。如果对这个属性进行配置,tomcat启动的时候会直接创建Servlet的对象
(4)发布WEB项目到WEB服务器
2、案例的改进
操作步骤中的第二步可以使用Eclipse直接创建Servlet,用Eclipse生成的Servlet不用进行配置,Eclipse直接就帮我们配置好了。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Demo
*/
public class Demo extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Demo() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().println("hello");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
二、Servlet的执行过程
Servlet的执行过程.png三、Servlet的体系结构
Servlet的体系结构.png四、Servlet的生命周期
出生:
第一次访问Servlet时由WEB服务器创建对象,并调用init方法
活着:
每次访问Servlet都会调用他的service方法,在service方法中,根据请求方式的不同执行不同的doXXX方法。
死亡:
当服务器关闭的时候,会销毁Servlet对象,这个时候destroy方法就会被调用
五、Servlet的线程安全问题
如果有多个客户端并发访问同一个Servlet,WEB服务器会为每一个客户端的请求创建一个线程,在线程中调用Servlet的service方法。如果多个线程并发的访问同样的数据,那个时候就有可能会出现线程的安全问题。
解决方法:
1、把有可能会出现问题的代码扔进同步代码块里面,但是会影响网站的反应速度
2、让Servlet去实现一个接口SingleThreadModel,每次访问服务器,都会创建一个Servlet对象,但是多个对象中的数据都不一样,线程安全问题就不存在了。这个接口已经过时了
3、尽量减少使用成员变量