Servlet基本内容①

1. Servlet 技术

a.什么是Servlet

1. Servlet是JavaEE规范之一。		规范就是 接口
2. Servlet是JavaWeb三大组件之一。	三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。
3. Servlet是运行在服务器上的一个Java小程序,他可以接收客服端送过来的请求,并响应数据给客户端。

.

b.手动实现Servlet程序

1. 编写一个类去实现Servlet接口
2. 实现service方法,处理请求,并响应数据
3. 到web.xml中配置servlet程序的访问地址

.

c.Servlet 程序的示例代码:

  • 常见错误1:url-pattern 中配置的路径没有以斜杠打头。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Hs87Hav-1604418485617)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102221016965.png)]

.

  • 常见错误2:servlet-name 配置的值不存在:
<servlet>标签和<servlet-mapping>标签的<servlet-name>标签的内容不一致

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8TTvLxF-1604418485620)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102221314394.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0g2mXE1a-1604418485623)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102221250803.png)]
在这里插入图片描述

.

  • 常见错误3:servlet-class 标签的全类名配置错误:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-skZp8cQy-1604418485626)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102221653477.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLQQH7bV-1604418485629)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102221710805.png)]

.

d.url地址到Servlet程序的访问原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MV41z6x8-1604418485631)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102222856667.png)]

.

e.Servlet 的生命周期

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

说明:
	第一、第二步,是在第一次访问时,创建Servlet程序会调用
	第三步,都会调用service方法
	第四步,在web工程停止的时候调用
public class HelloServlet implements Servlet {

    public HelloServlet() {
        System.out.println("1 构造器方法");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2 init初始化方法");

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /*
    service()方法是专门用来处理请求和响应的
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3 service == Hello Servlet 被访问了");
    }

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

    @Override
    public void destroy() {
        System.out.println("4 destroy销毁方法");
    }
    
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9dT5Bm0D-1604418485633)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201102223831273.png)]

f.GET 和 POST 请求的分发处理

public class HelloServlet implements Servlet {
    /*
    service()方法是专门用来处理请求和响应的
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("3 service == Hello Servlet 被访问了");
        //类型转换
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        //获取请求方式
        String method = httpServletRequest.getMethod();

        if ("GET".equals(method)){
            getmethod();

        }else if ("POST".equals(method)){
            getmethod();
        }
    }

    public void getmethod(){
        System.out.println("get请求");
        System.out.println("get请求");
        System.out.println("get请求");
    }
    public void postmethod(){
        System.out.println("post请求");
        System.out.println("post请求");
        System.out.println("post请求");
    }
    
    
    
    //省略getServletInfo、destroy、getServletConfig、init、HelloServlet方法
}

.

g.通过继承 HttpServlet 实现 Servlet 程序

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

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


public class HelloServlet2 extends HttpServlet {

    //doGET()方法 在GET请求的时候调用
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2的doGet()方法");
    }

    
    //doPost()方法 在Post请求的时候调用
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet2的doPOST()方法");
    }
}
web.xml 中的配置

<servlet>
    <servlet-name>HelloServlet2</servlet-name>
    <servlet-class>com.achang.servlet.HelloServlet2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet2</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>

.

h.使用 IDEA 创建 Servlet 程序

  • 菜单:new->Servlet 程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u03Bj2v3-1604418485634)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201103195718573.png)]

  • 配置 Servlet 的信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JklfQxgF-1604418485635)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201103195957707.png)]

自动在文件夹下生成HelloServlet3类与doPost()、doPost
    
public class HelloServlet3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("helloservlet3的doPost方法");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("helloservlet3的doGET方法");
    }
}
自动在web.xml文件下生成<servlet>标签,
然后自己创建servlet-mapping指定url-pattern和url-pattern即可
    
<servlet>
    <servlet-name>HelloServlet3</servlet-name>
    <servlet-class>com.achang.servlet.HelloServlet3</servlet-class>
</servlet>
<servlet-mapping>
    <url-pattern>HelloServlet3</servlet-name>
    <url-pattern>/hello3</url-pattern>
</servlet-mapping>

.

i.Servlet类的继承体系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SNPjF0cg-1604418485637)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201103215106696.png)]

.

2. ServletConfig类

ServletConfig类从类名上来看,就知道是Servlet程序的配置信息类

Servlet程序和ServletConfig对象都是由Tomcat服务器负责创建,我们负责使用

Servlet程序默认是第一次访问的时候创建,ServletConfig是每个Servlet程序创建时就创建一个对应的ServletConfIg对象

.

a.ServletConfig类的三大作用

  1. 可以获取Servlet程序的别名servlet-name的值
  2. 获取初始化参数init-param
  3. 获取ServletConfig对象
  • web.xml 中的配置:
    <!-- servlet标签给Tomcat服务器配置Servlet程序 -->
    <servlet>
        <!-- servlet-name标签 是给Servlet程序起一个别名 (一般是类名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!-- servlet-class标签 是Servlet程序的全类名 -->
        <servlet-class>com.achang.servlet.HelloServlet</servlet-class>

        
        
        
        
        <!--init-param 是初始化参数-->
        <init-param>
            <!--参数名-->
            <param-name>username</param-name>
            <!--参数值-->
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <!--参数名-->
            <param-name>url</param-name>
            <!--参数值-->
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
        
        
        
        
        
        
    </servlet>
  • Servlet 中的代码:
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("2 init初始化方法");


//        1. 可以获取Servlet程序的别名servlet-name的值
        System.out.println("HelloServlet程序的别名是: "+ servletConfig.getServletName());
//        2. 获取初始化参数init-param
        System.out.println("初始化参数username的值是: "+servletConfig.getInitParameter("username"));
        System.out.println("初始化参数username的值是: "+servletConfig.getInitParameter("url"));
//        3. 获取ServletContext对象
        System.out.println(servletConfig.getServletContext());

    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6RyO7BH8-1604418485638)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201103221838028.png)]

.

3. ServletContext类

a.什么是ServletContext?

1.ServletContext是一个接口,它表示Servlet上下文对象

2.一个web工程,只有一个ServletContext对象实例

3.ServletContext对象是一个域对象。

4.ServletContext是在web工程部署启动的时候创建。在web工程停止的时候销毁。

  • 什么是域对象?

域对象,是可以像Map一样存取数据的对象。叫域对象

这里的域指的是,存取数据的操作范围,整个web工程。

			存数据					取数据				删数据
Map			put()				  get()				remove()	
域对象		  setAttribute()		getAttribute()	  removeAttribute()

.

b.ServletContext类的四个作用

1.获取web.xml中配置的上下文参数context-param

2.获取当前的工程路径, 格式:/工程路径

3.获取工程部署后在服务器磁盘上的绝对路径

4.像Map一样存取数据

ContextServlet演示代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        1.获取web.xml中配置的上下文参数context-param
        ServletContext servletContext = getServletConfig().getServletContext();
        String username = servletContext.getInitParameter("username");
        System.out.println("context-param参数username的值是: "+username);
        System.out.println("context-param参数password的值是: "+servletContext.getInitParameter("password"));
//        2.获取当前的工程路径, 格式:/工程路径
        System.out.println("当前工程路径: "+servletContext.getContextPath());
//        3.获取工程部署后在服务器磁盘上的绝对路径
        /*
            / 斜杆被服务器解析地址为:http://ip:port/工程名/     映射到IDEA代码的webapp目录
         */
        System.out.println("工程部署的路径是: "+servletContext.getRealPath("/"));
    }
web.xml 中的配置:

    <!--context-param是上下文参数(它属于整个web工程)-->
    <context-param>
        <param-name>username</param-name>
        <param-value>context</param-value>
    </context-param>

    <context-param>
        <param-name>password</param-name>
        <param-value>root</param-value>
    </context-param>
  • ServletContext 像 Map 一样存取数据:
Context1Servlet代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取ServletContext对象
    ServletContext context = getServletContext();
    System.out.println(context);//org.apache.catalina.core.ApplicationContextFacade@77aaf677
    System.out.println("保存之前: context中获取数据key1的value值是: "+context.getAttribute("key1"));//null

    context.setAttribute("key1","value1");

    System.out.println("Context1Servlet中获取数据key1的value值是: "+context.getAttribute("key1"));//key1
}
Context2Servlet代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //获取ServletContext对象
    ServletContext context = getServletContext();
    System.out.println(context);//org.apache.catalina.core.ApplicationContextFacade@11f32f19

    System.out.println("Context2Servlet中获取数据key1的value值是: "+context.getAttribute("key1"));//key1
}

不管是Context1Servlet还是Context2Servlet的context地址值为: org.apache.catalina.core.ApplicationContextFacade@11f32f19

表示它是在web工程销毁前都是一个对象,一个web工程就一个。

.

4. Http协议

a.什么HTTP协议

  • 什么是协议?

协议,指双方,或多方,相互约定,大家都需要遵守的规则,叫协议。

HTTP协议,指客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫HTTP协议

HTTP协议中的数据又叫报文。

.

b.请求的HTTP协议格式

客户端给服务器发送数据叫 请求。

服务器给客户端回传数据叫 响应。

请求又分为GET请求,和POST请求两种

①GET请求
1. 请求行
	① 		请求的方式				  GET
	② 		请求的资源路径[+?+请求参数]
    ③ 		请求的协议版本号			HTTP/1.1
    
2. 请求头
			key:value	组成		不同的键值对,表示不同的含义。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gaNoG78C-1604495778982)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201104201004268.png)]

.

②POST请求
1. 请求行
	① 	请求的方式				  POST
	② 	请求的资源路径[+?+请求参数]
    ③ 	请求的协议版本号			HTTP/1.1
    
2. 请求头
	①	key:value				 不同的请求头,有不同的含义
	
**空行**	----------------

3. 请求体	---> 就是发送给服务器的数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AK668X9Q-1604495778984)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201104202403555.png)]

.

③常用请求头的说明

Accept: 表示客户端可以接受的数据类型

Accept-Language: 表示客户端可以接受的语言类型

User-Agent: 表示客户端浏览器的信息

Host: 表示请求时的服务器ip和端口号

.

④哪些是GET请求,哪些是POST请求
  • GET请求有哪些:

    1.form标签 method=get

    2.a标签

    3.link标签引入css

    4.Script标签引入js文件

    5.img标签引入图片

    6.iframe引入html页面

    7.在浏览器地址栏中输入地址后敲回车

  • POST请求

    form标签 method=post

.

c.响应的HTTP协议格式

1. 响应行
	①	响应的协议和版本号			HTTP/1.1
	②	响应状态码				    
	③	响应状态描述符
	
2. 响应头
	①	key:value				不同的相应头,有其不同的含义
	
**空行**----------------

3. 响应体		---> 回传给客户端的数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EFLRa2ky-1604495778987)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201104204457010.png)]

.

d.常用的响应码说明

200 表示数据请求成功

302 表示请求重定向

404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)

500 表示服务器已经收到请求,但是服务器内部(代码)错误

.

e.MIME类型说明

MIME是HTTP协议中的数据类型。

MIME 的英文全称是"MultipurposeInternetMailExtensions" 多功能 Internet 邮件扩充服务。

MIME 类型的格式是“大类型/小 类型”,并与某一种文件的扩展名相对应。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I0zhHy7T-1604495778990)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201104205825551.png)]

在这里插入图片描述

.

f.谷歌浏览器如何查看 HTTP 协议

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pbi9QDT3-1604495778996)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201104211122830.png)]

.

g.火狐浏览器如何查看 HTTP 协议

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k218eoef-1604495778998)(C:\Users\PePe\AppData\Roaming\Typora\typora-user-images\image-20201104211459515.png)]

学习图片资源内容来源:
B站:尚硅谷2020最新版JavaWeb全套教程,java web零基础入门完整版
https://www.bilibili.com/video/BV1Y7411K7zz?
上为个人学习笔记
感谢分享

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐