首页 > 技术文章 > Servlet入门

cyxy31521 2018-07-26 17:16 原文

Servlet入门
1. 什么是servlet
Servlet 运行在服务端的Java小程序,是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态web资源。
Servlet是JavaWeb三大组件之一(Servlet、Filter、Listener),是最重要的组件。
Servlet 的作用
 
1. 接收请求 :接收客户端发送的请求数据;
2. 业务逻辑的处理;
3. 响应结果 :将处理结果响应给客户端(浏览器);
2、Servlet入门开发步骤
 
1. 创建一个普通java类实现Servlet接口;
2. 重写Servelt接口中的所有抽象方法;
3. 注册这个类;
    1. 在web.xml中配置这个类的信息;
    2. 配置这个类的映射路径;
4. 在service方法中处理请求和响应的业务逻辑;
5. 发布项目,启动项目之后,通过映射路径访问这个类;

  

 
3、入门案例一
 
需求:编写一个Servlet,接收客户端(浏览器)的请求:
接收到请求之后给浏览器响应数据"hello world"

 

实现步骤:
1. 创建一个普通java类FirstServlet 实现Servlet接口,并重写Servlet接口的所有抽象方法;
 
 1 import javax.servlet.*;
 2 import java.io.IOException;
 3  
 4 public class FirstServlet implements Servlet {
 5     @Override
 6     public void init(ServletConfig servletConfig) throws         ServletException {
 7         System.out.println("初始化");
 8     }
 9  
10     @Override
11     public ServletConfig getServletConfig() {
12         return null;
13     }
14     @Override
15     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
16         System.out.println("业务逻辑");
17         servletResponse.getWriter().println("hello world");
18     }
19  
20     @Override
21     public String getServletInfo() {
22         return null;
23     }
24  
25     @Override
26     public void destroy() {
27         System.out.println("销毁");
28     }
29 }                    

 

2. 在web.xml中配置这个FirstServlet 的类路径和映射路径,配置信息如下
【注意】 url-pattern 映射路径前面必须添加"/";
 
1 <servlet>
2   <servlet-name>first</servlet-name>
3   <servlet-class>zf.zjq.demo1.FirstServlet</servlet-class>  
4 </servlet>
5  
6 <servlet-mapping>
7   <servlet-name>first</servlet-name>
8   <url-pattern>/first</url-pattern>
9 </servlet-mapping>

 

3.启动访问 localhost:8080/first
 
 
Servlet生命周期(从创建到销毁)

1. 谁创建:tomcat创建; 2. 何时创建:第一次访问这个Servlet的时候   特点:     1. 只会创建一次(单例);     2. 对象创建完成之后,会调用init()方法;     3. 如何工作:每次请求到这个Servlet时,由service方法处理请求和响应信息; 1. service()方法接收用户的请求,和处理响应;   2. 特点:     1. 每次对这个Servlet的访问都会由service()方法来处理;     2. service()方法的两个参数:request和response对象专门用来处理请求和响应; 4. 何时销毁:   Servlet对象在服务器正常关闭的时候销毁,销毁前会调用destory()方法; 注意:Servlet对象是单例的,会不会产生线程安全问题? 答:线程安全问题的产生是因为要争夺共同的资源,所以只要不在Servlet类中设置成员变量就可以避免。

 

 
 
优化方案1,案例二
使用GenericServlet优化GenericServlet类是一个抽象类,它实现了多个接口,其中有一个是Servlet,所以它重写了Servlet接口中的所有方法。我们只需要继承GenericServlet类,重写其中的service方法即可
 
1. 编写一个普通的java类,SecondServlet ,继承GenericServlet;
 
package zf.zjq.demo1;
 
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
 
public class SecondServlet extends GenericServlet {
 
  @Override
  public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    servletResponse.getWriter().print("hello GenericServlet!");
  }
}

 

2.在web.xml配置SecondServlet :
<servlet>
  <servlet-name>second</servlet-name>
  <servlet-class>zf.zjq.demo1.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>second</servlet-name>
  <url-pattern>/second</url-pattern>
</servlet-mapping>
 
3. 启动tomcat并访问:localhost:8080/second
 
 
优化方案2 ,案例三
Sun公司提供了HttpServlet,对GenericServlet再次进行扩展和功能加强。编写Servlet就可以采用继承HttpServlet来完成servlet的开发,这样的Servlet可以获取更多的业务功能。
 
步骤
1,编写一个普通的java类,ThirdServlet ,继承HttpServlet ;
package zf.zjq.demo1;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
public class ThirdServlet extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("处理get请求提交的数据");
    doPost(req,resp);
  }
 
  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("处理post请求提交的数据……");
    resp.getWriter().println("hello world");
  }
}

 

 
2.在web.xml配置SecondServlet :
 
<servlet>
  <servlet-name>third</servlet-name>
  <servlet-class>zf.zjq.demo1.ThirdServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>third</servlet-name>
  <url-pattern>/third</url-pattern>
</servlet-mapping>

 

3. 启动tomcat并访问:localhost:8080/third
 
 
3,Servlet映射路径配置规范
url-pattern中的映射路径配置存在以下几种方式:
1. 完全匹配   /user/hello    资源路径为/user/hello时可以访问
2. 目录匹配   /user/*      资源路径中含有/user目录均可访问
3. 后缀名匹配   *.do       资源路径中以.do结尾的均可访问
4. 缺省路径     /       访问的路径找不到,就会去找缺省路径
tomcat获得匹配路径时,优先级顺序:1 >2 > 3 > 4 一般使用完全匹配,即一个Servlet对应一个映射路径。
 
4,小结
1. Servlet编程的作用:接收浏览器的请求,处理请求数据,给浏览器响应数据;
2. Servlet接口:
  1. Sun公司规定如果想要在服务端接收和响应客户端的数据,必须实现Servlet接口;
  2. 由于Servlet是一个接口,实现Servlet接口后必须重写其中所有的方法;
3. GenericServlet:
  1. GenericServlet:是一个抽象类,它实现了Servlet接口,与协议无关;
  2. 继承GenericServlet,只需要重写service方法即可接收和响应数据;
4. HttpServlet:
  1. HttpServlet:是一个抽象类,它继承了GenericServlet,为HTTP请求定制的;
  2. 继承HttpServlet,重写doGet和doPost方法,能够更加方便地处理不同请求的数据;
 
 
 

推荐阅读