javaweb之Servlet(总体第六篇)

一、详细学习内容

1、servlet技术

(1)什么是Servlet

  • servlet是javaEE规范之一,其实就是一个接口
  • Servlet是javaweb三大组件之一,三大组件分别是Servlet程序,Filter过滤器,Listen监听器
  • Servlet是运行在服务器上的java小程序,它可以接受客户端发送过来的请求,并响应数据给客户端

(2)写一个Servlet程序

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

  • 创建项目
    在这里插入图片描述

  • 编写类实现接口
    在这里插入图片描述

  • 配置web.xml
    在这里插入图片描述

  • 结果
    在这里插入图片描述
    在这里插入图片描述

(3)理解登录流程

在这里插入图片描述
首先我们写了自己的web项目,就是有了一个helloServlet的程序,它就做为整个项目,然后它会发布到Tomcat作为服务器,然后你就可以访问了。

(4)Servlet生命周期

  • 1、首先执行Servlet构造器方法
  • 2、执行init初始化方法
  • 3、执行service方法【每次访问都会调用】
  • 4、执行destroy销毁方法
    方法1,2是在第一次访问的时候访问。

(5)理解doGet和doPost方法

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

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

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

    @Override
    public void destroy() {

    }

    /**
     * 做 get 请求的操作
     */
    public void doGet(){
        System.out.println("get 请求");
        System.out.println("get 请求");
    }

    /**
     * 做 post 请求的操作
     */
    public void doPost(){
        System.out.println("post 请求");
        System.out.println("post 请求");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

(6)通过继承HTTPServlet实现Servlet

在这里插入图片描述

  • 看一下继承关系
    在这里插入图片描述
public class HelloServlet2 extends HttpServlet {
    /**
     * doGet()在 get 请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        System.out.println("doGet方法");
    }
    /**
     * doPost()在 post 请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        System.out.println("doPost 方法");
    }
}
  • 同样的配置web.xml文件

(7)通过idea创建servlet

在这里插入图片描述
在这里插入图片描述

(8)Servlet类继承关系

在这里插入图片描述

2、ServletConfig类

  • 是Servlet的配置类
  • Servlet程序和ServletConfig对象都是由Tomcat负责创建,我们负责使用
  • Servlet程序默认是第一次访问的时候创建,ServletConfig是每个servlet程序创建时,就创建一个对应的ServletConfig

(1)ServletConfig类的三大作用

  • 获取Servlet程序的别名servlet-name的值
  • 获取初始化参数init-param
  • 获取ServletContext对象
<servlet>
        <!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-classServlet 程序的全类名-->
        <servlet-class>cn.mldn.servlet2.servlet3.HelloServlet2</servlet-class>
        <!--init-param 是初始化参数-->
        <init-param>
            <!--是参数名-->
            <param-name>username</param-name>
            <!--是参数值-->
            <param-value>root</param-value>
        </init-param>
        <!--init-param 是初始化参数-->
        <init-param>
            <!--是参数名-->
            <param-name>url</param-name>
            <!--是参数值-->
            <param-value>jdbc:mysql://localhost:3306/test</param-value>
        </init-param>
    </servlet>
    <!--servlet-mapping 标签给 servlet 程序配置访问地址-->
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
  • servlet标签给Tomcat配置Servlet程序
  • servlet-mapping是配置访问的路径
  • servlet-name是标签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("初始化参数 url 的值是;" + servletConfig.getInitParameter("url"));
// 3、获取 ServletContext 对象
System.out.println(servletConfig.getServletContext());
}

在这里插入图片描述

3、ServletContext类

(1)什么是ServletContext类

  • ServletContext 是一个接口,它表示 Servlet 上下文对象
  • 一个web工程,只是一个servletContex对象的实例
  • servletContext对象时一个域对象
  • servletContext是在web工程部署启动的时候创建,在web工程时候销毁

(2)什么是域对象

什么是域对象?域对象,是可以像 Map 一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围,整个 web 工程。存数据就用put()方法,setAttribute(),而取对象则是get(),getAttribute()实现,然后可以删除数据remove(),removeAttribute()

  • 其实这个很好理解,比如说我们把前端项目看成一个域对象,我后端给你一个cookie,然后你保存下来,存起来,全局整个前端都是共享这部分数据的。

(3)ServletContext类的作用

  • 获取web.xml中配置的上下文参数context-param
  • 获取当前的工程路径,格式:/工程路径
  • 获取工程部署后再服务器硬盘上的绝对路径
  • 想Map一样存数据
public class HelloServlet2 extends HttpServlet {
    /**
     * doGet()在 get 请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
// 1、获取 web.xml 中配置的上下文参数 context-param
        ServletContext context = getServletConfig().getServletContext();
        String username = context.getInitParameter("username");
        System.out.println("context-param 参数 username 的值是:" + username);
        System.out.println("context-param 参数 password 的值是:" +
                context.getInitParameter("password"));
// 2、获取当前的工程路径,格式: /工程路径
        System.out.println( "当前工程路径:" + context.getContextPath() );
// 3、获取工程部署后在服务器硬盘上的绝对路径
/**
 * / 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录<br/>
 */
        System.out.println("工程部署的路径是:" + context.getRealPath("/"));
        System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
        System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));
    }
    /**
     * doPost()在 post 请求的时候调用
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        System.out.println("doPost 方法");
    }
}
  • 这个比较重要,到时候在开发中用比较多,到时候我们可以存在Redis里面,方便存取。
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
<param-name>password</param-name>
<param-value>root</param-value>
</context-param>
public class ContextServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// 获取 ServletContext 对象
ServletContext context = getServletContext();
System.out.println(context);
System.out.println("保存之前: Context1 获取 key1 的值是:"+ context.getAttribute("key1"));
context.setAttribute("key1", "value1");
System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
}
}

4、HTTP协议

http协议就是客户端和服务器之间通信时,发送数据需要遵守的规则。

(1)请求HTTP协议格式

  • http://localhost:8083/helloservlet_war_exploded/hello

客户端发送消息叫请求
服务器回应消息叫回应

(2)请求的类型

HTTP拥有如下请求:GET POST HEAD PUT DELETE CONNECT TRACE OPTIONS
常用的请求如下请求:GET,POST请求

  • Get请求:请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • POST提交:把提交的数据放置在是HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据
    例子就是我们自己编写的表单。
    在这里插入图片描述
    在这里插入图片描述

因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变

(3)常见的请求头

  • Accept:表示客户端可以接受的数据类型
  • Accept-Languege:表示客户端可以接受的语言类型
  • User-Agent:表示客户端浏览器的信息
  • Host:表示请求时的服务器ip地址

在这里插入图片描述
在这里插入图片描述

(4)响应的Http协议格式

  • 响应行
    (1) 响应的协议和版本号
    (2) 响应状态码
    (3) 响应状态描述符
  • 响应头
    (1) key : value 不同的响应头,有其不同含义
    空行
  • 响应体 ---->>> 就是回传给客户端的数

在这里插入图片描述

  • 常见的响应码
    • 200:请求成功
    • 302:表示请求重定向
    • 404:表示请求服务器已经收到了,但是你要的数据不存在
    • 500:表示服务器已经收到请求,但是服务器内容错误。

(5)MIME类型说明

  • MIME:是HTTP协议中数据类型

  • MIMEden英文全称是Multipurpose Internet Mail Extension多功能Internet邮件扩充服务,MIME类型的格式是“大类型/类型”,并与某一种文件的扩展名相对应。
    在这里插入图片描述
    在这里插入图片描述

  • 用浏览器查看一下
    在这里插入图片描述
    在这里插入图片描述

二、请求头和响应头总结

1、请求头

在这里插入图片描述
在这里插入图片描述

2、响应头

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、以请求哔站的是链接分析

  • 响应头
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

三、HttpServletRequest和HttpServletResponse

1、HTTPServletRequest

(1)HTTPServletRequest的作用

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。
然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的
信息

(2)常用 的API

  • getRequestURI():获取请求的资源路径

  • getRequestURL():获取请求的统一资源定位符

  • getRemoteHost():获取客户端的ip地址

  • getHeader():获取请求头

  • getParameter():获取请求的参数

  • getParameterValues()获取请求的参数,多个值的时候用

  • getMethods():获取请求的方法get或者post

  • setAttribute(key,value):设置域数据

  • getAttribute(key):获取域数据

  • getRequestDispatcher():或者请求转发对象

  • 案例分析
    在这里插入图片描述
    在这里插入图片描述

(3)获取请求的参数

在这里插入图片描述
在这里插入图片描述

(4)解决POST请求中文乱码问题

在这里插入图片描述

(5)请求转发

什么是请求转发?
请求就是请求,转发就是服务器接受到请求之后,从一次资源跳转到另一个资源的操作叫做请求转发。
在这里插入图片描述

(6)base标签作用

在这里插入图片描述

(7)web中/再用用

  • 在web中/是一种绝对路径
  • /如果被浏览器解析,得到的地址是会是:http://ip:端口号/工程路径
  • /如果被服务器解析,得到的是:http://ip:duankouhao/工程路径

2、HTTPServletResponse

(1)HTTPServletResponse作用

HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置

(2)返回的方式

  • 字符流:getOutputStream(),常用于下载(传递二进制数据)
  • 字符流:getWriter(),常用于回传字符串

上面两同时只能用一个。

(3)如果给客户端返回数据

在这里插入图片描述
而且这个是java的里面的数据流的操作格式,最后要关闭流的传输。

(4)解决响应的乱码问题

// 设置服务器字符集为 UTF-8

  • resp.setCharacterEncoding(“UTF-8”);

// 通过响应头,设置浏览器也使用 UTF-8 字符集

  • resp.setHeader(“Content-Type”, “text/html; charset=UTF-8”

// 它会同时设置服务器和客户端都使用 UTF-8 字符集,还设置了响应头
// 此方法一定要在获取流对象之前调用才有效

  • resp.setContentType(“text/html; charset=UTF-8”);

(5)请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值