实现servlet接口并优化代码解读

3.2.1 方式一:直接实现类实现servlet接口,并全部重写servlet接口中的方法

 

实现类:

//Servlet 接口是用来获取浏览器请求(request)的数据,以及将处理完的数据响应(response)给浏览器
public class ServletDemo1 implements Servlet {
   
    //第一次请求访问
    public void init(ServletConfig servletConfig) throws ServletException { }

    //处理请求数据(业务逻辑的处理);每当获取一个请求,返回一个响应信息
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("你好,servlet");
    }

    //关闭服务器,进行销毁
    public void destroy() { }
   
    public ServletConfig getServletConfig() { return null; }
   
    public String getServletInfo() { return null; }
}

 

 

Web.xml配置文件:

<!--配置servlet具体信息-->
    <servlet>
        <!--注册的servlet的名称-->
        <servlet-name>demo1</servlet-name>
        <!--servlet实现类的文件路径 - 包名 + 类名-->
        <!--
配置servlet 包名 + 类名-->
        <servlet-class>com.heima.cn.a_servlet.ServletDemo1</servlet-class>
    </servlet>

    <!--配置servlet映射路径-->
    <servlet-mapping>
        <!--获取注册的servlet名称-->
        <servlet-name>demo1</servlet-name>

        <!--访问的url地址,前面需要加 / -->
      <!--  url
地址 -> 协议(http(广泛的协议),https(更安全的协议),ftp(上传下载协议)) +

      +  域名(www.baidu.com or ip地址) +端口号(默认80.浏览器自动添加) + 资源位置(index.com +

      + 键值对 id  = ?)    -->

        <!--组件的访问路径-->
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>

 

 

浏览器访问:

实现servlet接口并优化代码解读

 

 

3.2.2 方式二:GenericServlet优化方案

3.2.2.1 自己定义的GenericServlet优化实现

实现:

1.自定义抽象类GenericServlet实现servlet接口,获取servlet所有方法,并将service()方法定义为抽象方法

 

2.自定义servletdemo类继承抽象类GenericServlet,实现并重写service方法

 

 

实现类

public  abstract class GenericServletDemo1 implements Servlet {
    public void init(ServletConfig servletConfig) throws ServletException { }

    public ServletConfig getServletConfig() { return null; }

    //抽象方法定义格式
    //    void destroy();
   
    //
抽象方法 -- 修饰符 abstract 返回值类型 方法名 (参数列表)
    public abstract void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException ;

    //一般方法
    public String getServletInfo() { return null; }

    public void destroy() { }
}

 

 

继承类

public class ServletDemo2 extends  GenericServletDemo1 {
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("实现了servlet");
    }
}

 

 

Web.XML配置文件

<!--配置servlet具体信息-->
<servlet>
    <servlet-name>demo2</servlet-name>
    <servlet-class>com.heima.cn.a_servlet.ServletDemo2</servlet-class>
</servlet>

<!--配置servlet映射路径-->
<servlet-mapping>
    <servlet-name>demo2</servlet-name>
    <url-pattern>/demo2</url-pattern>
</servlet-mapping>

 

 

 

结果

网页输入                                                                                         控制台输出

实现servlet接口并优化代码解读               实现servlet接口并优化代码解读

       

 

3.2.2.2 系统定义的GenericServlet优化实现

实现类

public class ServletDemo3 extends GenericServlet {
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("系统定义的servlet优化实现");
    }
}

 

 

web.xml配置文件

<!--配置servlet具体信息-->
<servlet>
    <servlet-name>demo3</servlet-name>
    <servlet-class>com.heima.cn.a_servlet.ServletDemo3</servlet-class>
</servlet>

<!--配置servlet映射路径-->
<servlet-mapping>
    <servlet-name>demo3</servlet-name>
    <url-pattern>/demo3</url-pattern>
</servlet-mapping>

 

 

结果:

        网页输入数据                                                      控制台输出结果

实现servlet接口并优化代码解读                        实现servlet接口并优化代码解读

 

 

3.2.3 方式三: HttpServlet 优化方案

实现 ---- 区分表单(from)中提交的方法(method= get or method = post)

1.自定义抽象类HttpServlet继承抽象类GenericServlet类,实现service方法

 

2.调用service方法,将参数类型(ServletRequest servletRequest, ServletResponse servletResponse)强转为HttpServletRequest(提供请求信息)和  HttpServletResponse(发送响应信息)接口

多态转换:Interface HttpServletRequest  implements ServletRequest(接口)

 

3.调用HttpServletRequest接口中的public String getMethod()方法,用来区分表单提交的方法

 

4.判断表单提交方法类型,分别实现doGet()方法 和doPost()方法

 

5.自定义servlet类继承抽象类HttpServlet,调用并重写doGet()方法 和doPost()方法

 

6.注意点:表单当中的action参数需要和配置文件web.xml中url地址一致

<form action="/demo4" method="get" > 表单信息

<url-pattern>/demo4</url-pattern>  映射文件信息

 

 

抽象类

public abstract class HttpServlet extends GenericServlet(系统自定义优化实现) {
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

        //Interface HttpServletRequest  implements ServletRequest(接口) ---> 扩展 javax.servlet.ServletRequest 接口,为 HTTP servlet 提供请求信息

 

  多态强制转换类型,调用HttpServletRequest中的getmethod方法,获取发出请求的http方法名称(get或post)
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        //Interface HttpServletResponse implements servletResponse(接口)--> 扩展 ServletResponse 接口以提供特定于 HTTP 的发送响应功能
        HttpServletResponse response = (HttpServletResponse) servletResponse;

       service(request,response);
    }

    public void service(  HttpServletRequest request,   HttpServletResponse response) throws ServletException, IOException {
        //HttpServletRequest接口中的getmethod方法
 // public String getMethod() --> 返回用于发出此请求的 HTTP 方法的名称,例如 GETPOST PUT
        String  req = request.getMethod();
        if(req.equalsIgnoreCase("get")){
            //System.out.println("get方法获取表单");
            doGet(request,response);
        }else  if (req.equalsIgnoreCase("post")){
            //System.out.println("post方法获取表单");
            doPost(request,response);
        }else {
            System.out.println("servlet");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) { }

    public void doGet(HttpServletRequest request, HttpServletResponse response) { }
}

 

 

实现类

 

public class ServletDemo4 extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        //super.doPost(request, response);
        System.out.println("获取post方法提交的表单");
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) {
       // super.doGet(request, response);
        System.out.println("获取get方法提交的表单");
    }
}

 

 

index.html 表单信息

<body>
<form action="/demo4" method="get" >  跳转的url地址
    <input type="submit" value="提交">
</form>
</body>

 

 

Web.xml 配置文件(servlet信息)

  <!--配置servlet具体信息-->

    <servlet>

        <servlet-name>demo4</servlet-name>

        <servlet-class>com.heima.cn.a_servlet.ServletDemo4</servlet-class>

    </servlet>

 

    <!--配置servlet映射路径-->

    <servlet-mapping>

        <servlet-name>demo4</servlet-name>

        <url-pattern>/demo4</url-pattern>  表单的action

    </servlet-mapping>

 

 

结果:

 

网页信息界面                                             控制台信息界面

 

实现servlet接口并优化代码解读                    实现servlet接口并优化代码解读

 

 

系统定义的HttpServlet

自定义类

public class ServletDemo5 extends HttpServlet{

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       // super.doGet(req, resp);

        System.out.println("这是系统的doGet方法");

    }

 

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

       /// super.doPost(req, resp);

        System.out.println("这是系统的doPost方法");

    }

}

 

 

配置文件web.xml

<!--配置servlet具体信息-->
<servlet>
    <servlet-name>demo5</servlet-name>
    <servlet-class>com.heima.cn.a_servlet.ServletDemo5</servlet-class>
</servlet>

<!--配置servlet映射路径-->
<servlet-mapping>
    <servlet-name>demo5</servlet-name>
    <url-pattern>/demo5</url-pattern>
</servlet-mapping>

 

 

表单信息

<body>
<form action="/demo5" method="get">
    <input type="submit" value="注册">
</form>
</body>