【JavaWeb-Servlet】笔记(1)--- Servlet规范;Servlet接口实现类;Servlet对象生命周期;HttpServletResponse/HttpServletRequest;请求对象和响应对象生命周期;欢迎资源文件

前言:


Servlet规范介绍:

1.servlet 规范来自于 JAVAEE 规范中的一种。

2.作用:

1)指定【动态资源文件】开发步骤。

2)指定Http服务器调用动态资源文件规则。

3)指定Http服务器管理动态资源文件实例对象规则。

 

Servlet接口实现类:

1.Servlet接口来自于Servlet规范下的一个接口,这个接口存在于Http服务器提供的 jar 包中。

2.Tomcat服务器(也是一种Http服务器)下的lib文件中有一个 servlet-api.jar 来存放 Servlet 接口(javax.servlet.Servlet接口)。

3.Servlet规范认为,Http服务器能调用的【动态资源文件】必须是一个Servlet接口实现类。

 

Servlet接口实现类开发步骤:


第一步:创建一个Java类继承 HttpServlet父类,使之成为一个Servlet接口实现类。

       提问:为什么不直接创建一个Java类实现Servlet接口?

                 因为Servlet接口中除了doGet()和doPost(),还有很多抽象方法,但是非抽象类实现接口,必须要重写接口中的所有方法,而我们需要使用的方法只有doGet()和doPost(),这样就大大增加了我们写代码的工作量。而通过 HttpServlet 抽象类(作为一个“中介”)来实现Servlet接口,将我们需要使用的两个方法保留,而将Servlet中我们不需要的方法重写为非抽象方法,这样我们再创建一个Java类来继承HttpSerlet抽象类,既得到了我们需要用的两个方法,又不需要重写接口中的其他方法,so nice ~ ~

 

第二步:重写 HttpServlet 父类两个方法,doGet( )或doPost( )。

package com.burnyouth.controller;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class OneServlet extends HttpServlet {
    //执行doGet()还是doPost()取决于客户端服务器发过来的请求
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("OneSelect类针对浏览器发送GET请求方式处理");
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("OneSelect类针对浏览器发送POST请求方式处理");
    }
}

 

第三步:将 Servlet 接口实现类信息【注册】到Tomcat服务器。

文件路径:【网站】--->【web】--->【WEB-INF】--->web.xml

<!--将Servlet接口实现类的路径地址交给Tomcat-->
<servlet>
    <!--声明一个变量存储servlet接口实现类路径-->
    <servlet-name>mm</servlet-name>
    <!--声明servlet接口实现类路径-->
    <servlet-class>com.burnyouth.controller.OneServlet</servlet-class>
</servlet>

<!--为了降低用户访问Servlet接口实现类难度,需要设置简短请求别名-->
<servlet-mapping>
    <servlet-name>mm</servlet-name>
    <!--设置简短请求别名,别名在书写时必须以"/"为开头-->
    <url-pattern>/one</url-pattern> 
</servlet-mapping>

如果此时用户通过浏览器向 Tomcat 索要 OneServlet 时的地址:  http://localhost:8080/myWeb/one

 

Servlet对象生命周期:


1.网站中所有的Servlet接口实现类的实例对象,只能由Http服务器负责创建。开发人员不能手动创建Servlet接口实现类的实例对象,所以我们以后几乎不需要再写 main方法了。

2.默认的情况下,Http服务器只有在接收到对于当前 Servlet 接口实现类第一次请求时才会自动创建这个Servlet接口实现类的实例对象。

   如何使 Http 服务器在启动时自动创建某个Servlet接口实现类的实例对象?

<servlet>
    <!--声明一个变量存储servlet接口实现类类路径-->
    <servlet-name>oneServlet</servlet-name> 
    <servlet-class>com.burnyouth.controller.OneServlet</servlet-class>
    <!--填写一个大于0的整数即可-->
    <load-on-startup>1</load-on-startup>
</servlet>

 

3.在Http服务器运行期间,一个Servlet接口实现类只能被创建出一个实例对象。

4.在Http服务器关闭时刻,自动将网站中所有的Servlet对象进行销毁。

 

HttpServletResponse接口:


1.介绍:

1)HttpServletResponse 接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar。

2)HttpServletResponse 接口实现类由Http服务器负责提供。

3)HttpServletResponse 接口负责将 doGet/doPost 方法的执行结果写入到【响应体】中交给浏览器。

4)开发人员习惯于将 HttpServletResponse 接口修饰的对象称为【响应对象】。

2.主要功能:

1) 将执行结果以二进制形式写入到【响应体】

package com.burnyouth.controller;

import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;


//演示 HttpServletResponse接口的功能一:
public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        //假设result为执行结果
        String result = "Hello World";

        //通过响应对象,向Tomcat索要输出流
        PrintWriter out = null;
        try {
            out = response.getWriter();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //通过输出流,将执行结果以二进制形式写入到响应体
        out.write(result);
    }
}

注意:

out.writer方法可以将【字符】,【字符串】,【ASCII码】写入到响应体,所以实际开发过程中,都是通过out.print()将真实数据写入到响应体(防止数字被以ASCII码的方式解读等)。

 

2) 设置响应头中[content-type]属性值,从而控制浏览器使用对应编译器将响应体二进制数据编译为【文字,图片,视频,命令】。

package com.burnyouth.controller;

import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        //既有文字信息又有HTML标签命令
        String result="Java<br/>HTML<br/>";

        //在得到输出流之前,设置响应头content-type属性(使浏览器用正确的编译器解读数据)
        response.setContentType("text/html;charset=utf-8");

        //向Tomcat索要输出流
        PrintWriter out = null;
        try {
            out = response.getWriter();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //通过输出流将结果写入到响应体
        out.print(result);
    }
}

注意:

在默认的情况下,content-type属性的值为“text”,此时浏览器将会采用【文本编译器】对响应体二进制数据进行解析。

所以一定要在得到输出流之前,通过响应对象对响应头中content-type属性进行重新赋值,令浏览器使用正确的编译器解读数据。

 

3) 设置响应头中【location】属性,将一个请求地址赋值给 location,从而控制浏览器向指定服务器发送请求。

package com.burnyouth.controller;

import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        String result = "http://www.baidu.com";

        //通过响应对象,将地址赋值给响应头中location属性
        try {
            //浏览器在接收到响应包之后,如果发现响应头中存在location属性,自动通过地址栏向location指定网站发送请求
            response.sendRedirect(result);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

HttpServletRequest接口:


1.介绍:

1)HttpServletRequest 接口来自于Servlet规范中,在Tomcat中存在servlet-api.jar。

2)HttpServletRequest 接口实现类由Http服务器负责提供。

3)HttpServletRequest 接口负责在doGet/doPost方法运行时读取Http请求协议包中信息。

4)开发人员习惯于将 HttpServletRequest 接口修饰的对象称为【请求对象】。


2.作用:

1)可以读取Http请求协议包中【请求行】信息。

   知识小贴士:     

           URI:资源文件精准定位地址(请求行并没有URI属性),实际上URI就是URL中截取的一个字符串,URI(格式为:/网站名/资源文件名)用于让Http服务器对被访问的资源文件进行定位。

package com.burnyouth.controller;

import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        //通过请求对象,读取【请求行】中【url】信息

        String url = request.getRequestURL().toString();

        //通过请求对象,读取【请求行】中【method】信息
        String method = request.getMethod();

        //通过请求对象,读取【请求行】中URI信息
        String uri =  request.getRequestURI();// substring

        System.out.println("URL: "+url);
        System.out.println("method: "+method);
        System.out.println("URI:"+uri);
    }
}

 

控制台:

 

2)可以读取保存在Http请求协议包中【请求头】或则【请求体】中的请求参数信息。

package com.burnyouth.controller;

import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.util.Enumeration;

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        //通过请求对象获得【请求头】中【所有请求参数名】(将所有请求参数名称保存到一个枚举对象进行返回)
        Enumeration paramNames = request.getParameterNames();
        while (paramNames.hasMoreElements()) {
            String paramName = (String) paramNames.nextElement();

            //通过请求对象读取指定的请求参数的值
            String value = request.getParameter(paramName);
            System.out.println("请求参数名 " + paramName + "--->请求参数值 " + value);
        }
    }
}

 

3)可以代替浏览器向Http服务器申请资源文件调用(后面再曰)

 

请求对象和响应对象生命周期:


1.在Http服务器接收到浏览器发送的【Http请求协议包】之后,自动为当前的【Http请求协议包】生成一个【请求对象】和一个【响应对象】。

2.在Http服务器调用doGet/doPost方法时,负责将【请求对象】和【响应对象】,作为实参传递到方法,确保doGet/doPost正确执行。

3.在Http服务器准备推送Http响应协议包之前,负责将本次请求关联的【请求对象】和【响应对象】销毁。

4、换一种说法:

【请求对象】和【响应对象】生命周期贯穿一次请求的处理过程中。
【请求对象】和【响应对象】相当于用户在服务端的代言人。

5、请求对象和响应对象生命周期图示:

 

 

欢迎资源文件:


1.试问,用户愿意记“杠来杠去”的网站资源文件名还是网站名呢?显然是后者,通过在地址栏中输入网站名,然后再通过“点点点”就可以访问这个网站下的各种资源文件了!

2.什么是欢迎资源文件?

          用户发送了一个针对某个网站的【默认请求】时,此时由Http服务器会自动从当前网站返回的资源文件就是欢迎资源文件。

  默认请求张啥样?

          http://localhost:8080/myWeb(当前网站)/(打个比方)

  正常请求张啥样?

         http://localhost:8080/myWeb/index.html(打死比方)

3、在我们没有手动指定欢迎资源文件是谁时,Tomcat 指定的默认欢迎资源文件规则:

1)文件位置:Tomcat安装位置/conf/web.xml

2)规则命令:

咱们浅浅地翻译一下哈:服务器返回欢迎资源文件,先找一下有没有【index.html】,没有?再找一下有没有【index.htm】,没有?再找一下【index.jsp】,还没有???来人,给我把404打在公屏上!

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

4.手动配置当前网站的默认欢迎资源文件规则:

1)规则位置:  网站/web/WEB-INF/web.xml

2)规则命令:  

<welcome-file-list>
    <!--
        自定义默认欢迎资源文件规则:
            servlet作为默认欢迎资源时,开头斜线必须抹掉
    -->
    <welcome-file>login.html</welcome-file>
    <welcome-file>user/find</welcome-file>
</welcome-file-list>

 

自定义设置网站的欢迎资源文件定位规则后,此时 Tomcat 默认定位规则将失效。

 

posted @   猿头猿脑的王狗蛋  阅读(204)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
1
点击右上角即可分享
微信分享提示