Servlet学习


1.  什么是Servlet

  1.1 Servlet是JavaEE规范之一,规范就是接口。

  1.2 Servlet是JavaWeb 三大组件之一。三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。

  1.3 Servlet是运行在服务器上的一个java小程序,他可以接收客户端发送过来的请求,并响应数据给客户端。

2. 手动实现Servlet程序

  2.1 编写一个类去实现Servlet接口。

  2.2 实现service方法,处理请求,并响应数据。

 1 package com.example.web_02;
 2 
 3 import javax.servlet.*;
 4 import java.io.IOException;
 5 
 6 public class Servlet1 implements Servlet {
 7     @Override
 8     public void init(ServletConfig servletConfig) throws ServletException {
 9 
10     }
11 
12     @Override
13     public ServletConfig getServletConfig() {
14         return null;
15     }
16     /*
17         service方法是专门用来处理请求和相应的
18      */
19     @Override
20     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
21         System.out.println("Servlet1被访问了");
22     }
23 
24     @Override
25     public String getServletInfo() {
26         return null;
27     }
28 
29     @Override
30     public void destroy() {
31 
32     }
33 }

  2.3 到web.xml中配置servlet程序的访问地址。

<?xml version="1.0" encoding="UTF-8"?>

    
    
        
        Servlet1
        
        com.example.web_02.Servlet1
    
    
    
        
        Servlet1
        
        /servlet1
    

  2.4启动,调试

   

   默认访问index.jsp页面,更改路径为http://localhost:8080/web_02/servlet1

   输出结果为:

 

3.  Servlet程序常见错误

  常见错误1:url-pattern中配置的路径没有以“/”开头。常见错误2:servlet-name 配置的值不存在。常见错误3:servlet-class标签的全类名配置错误。

4. url地址如何定位到Servlet中去访问

  客户端(浏览器):http://localhost:8080/web_02/servlet1。http://表示HTTP协议,localhost是服务器ip,:8080是服务器端口号,/web_02是工程路径,/servlet1是资源路径。

  通过ip地址定位服务器,通过端口号定位到Tomcat(一个端口号只能对应一个程序,但一个程序可以对应多个端口号),通过工程路径确定访问那个工程,这里根据web.xml配置文件中由servlet-mapping部署的路径名/servlet1访问servlet-name为Servlet1的Servlet,再执行Servlet1中的service方法。

5. Servlet的生命周期

  (1)执行Servlet构造方法。(2)执行init初始化方法。(3)执行service方法。(4)执行destroy销毁方法。

示例:

 1 package com.example.web_02;
 2 
 3 import javax.servlet.*;
 4 import java.io.IOException;
 5 
 6 public class Servlet1 implements Servlet {
 7     public Servlet1() {
 8         System.out.println("构造方法被执行了");
 9     }
10 
11     @Override
12     public void init(ServletConfig servletConfig) throws ServletException {
13         System.out.println("初始化方法被执行了");
14     }
15 
16     @Override
17     public ServletConfig getServletConfig() {
18         return null;
19     }
20     /*
21         service方法是专门用来处理请求和相应的
22      */
23     @Override
24     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
25         System.out.println("Servlet1被访问了");
26     }
27 
28     @Override
29     public String getServletInfo() {
30         return null;
31     }
32 
33     @Override
34     public void destroy() {
35         System.out.println("销毁方法被执行了");
36     }
37 }

    修改地址后:

     结果输出,并不断刷新页面后显示:

6. Servlet对请求的分发处理

package com.example.web_02;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class Servlet1 implements Servlet {
    public Servlet1() {
        System.out.println("构造方法被执行了");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始化方法被执行了");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    /*
        service方法是专门用来处理请求和相应的
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Servlet1被访问了");
        //类型转换,因为HttpServlet有getMethod方法
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        System.out.println("请求的方法是"+method);

        if("GET".equals(method)){
            doGet();
        }else if("POST".equals(method)){
            doPost();
        }
    }

    public void doGet(){
        System.out.println("get请求");
    }

    public void doPost(){
        System.out.println("post请求了");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("销毁方法被执行了");
    }
}

7. 通过继承HttpServlet类来实现servlet程序

  一般在实际项目开发中,都是使用继承HttpServlet类的方法去实现Servlet程序。

  1、编写一个类去继承HttpServlet类。2、根据业务需要去重写doGet或doPost方法。3、到web.xml中配置Servlet程序的访问地址。

package com.example.web_02;

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 Servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
<?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>Servlet1servlet-name>
        
        <servlet-class>com.example.web_02.Servlet1servlet-class>
    servlet>
    
    <servlet-mapping>
        
        <servlet-name>Servlet1servlet-name>
        
        <url-pattern>/servlet1url-pattern>
    servlet-mapping>
    <servlet>
        <servlet-name>Servlet2servlet-name>
        <servlet-class>com.example.web_02.Servlet2servlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>Servlet2servlet-name>
        <url-pattern>/servlet2url-pattern>
    servlet-mapping>
web-app>

8. 使用IDEA创建servlet程序

    在对应包下new一个servlet,修改类名,并取消勾选吧下面create Java EE6+....,在web.xml文件中只需添加即可。

 <servlet-mapping>
        <servlet-name>Servlet3servlet-name>
        <url-pattern>/servlet3url-pattern>
    servlet-mapping>

9. Servlet类的继承体系

  javax.servlet  Interface Servlet(接口)被Class GenericServlet(类)实现。Class HttpServlet(类)继承Class GenericServlet(类),最后由自定义的Servlet程序继承Class HttpServlet(类)。Servlet接口只是定义Servlet程序的访问规范,GenericServlet类实现了Servlet接口。做了很多空实现,并持有一个ServletConfig类的引用,并对ServletConfig的使用做一些方法。HttpServlet抽取类实现了service()方法,并实现了请求的分发处理。

今天返校,由于时间紧迫,剩余的servlet内容明天记录在博客内。

相关