Servlet

1.Servlet介绍

在这里插入图片描述
servlet代码

package com.atguigu.servlet;

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

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet 被访问了");
    }

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

    @Override
    public void destroy() {

    }
}

web.xml代码

<?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 标签给 Tomcat 配置 Servlet 程序 -->
    <servlet>
        <!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class 是 Servlet 程序的全类名-->
        <servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--servlet-mapping 标签给 servlet 程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern 标签配置访问地址 <br/>
            / 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径 <br/>
            /hello 表示地址为:http://ip:port/工程路径/hello <br/>
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

2.url 地址到 Servlet 程序的访问

在这里插入图片描述

3.Servlet 的生命周期

在这里插入图片描述

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

package com.atguigu.servlet;

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

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//        System.out.println("Hello Servlet 被访问了");
        //类型转换,因为他有getMethod()方法
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        //获取请求方式
        String method = httpServletRequest.getMethod();
        if("GET".equals(method)){
            doGet();
        }else if("POST".equals(method)){
            doPost();
        }
    }

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

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

    @Override
    public void destroy() {

    }
}

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

在这里插入图片描述

package com.atguigu.servlet;

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 HelloServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet中的get请求");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet中的post请求");
    }
}

6.使用 IDEA 创建 Servlet 程序

在这里插入图片描述

7.Servlet 类的继承体系

在这里插入图片描述

package com.atguigu.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "HelloServlet3")
public class HelloServlet3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet3中的post请求");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet3中的get请求");
    }
}

8.ServletConfig类

8.1 介绍

在这里插入图片描述

8.2 ServletConfig 类的三大作用

在这里插入图片描述

package com.atguigu.servlet;

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

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("初始方法");
        // 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());
    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//        System.out.println("Hello Servlet 被访问了");
        //类型转换,因为他有getMethod()方法
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        //获取请求方式
        String method = httpServletRequest.getMethod();
        if("GET".equals(method)){
            doGet();
        }else if("POST".equals(method)){
            doPost();
        }
    }

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

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

    @Override
    public void destroy() {

    }
}

8.3 注意点

getServletConfig()方法会返回一个ServletConfig,该对象是由HttpServlet父类初始化所赋值的,如果重写该方法时没有调用父类的init方法的话,则默认运行子类方法即我们重写的init方法,则ServletConfig对象没有值,会报空指针异常在这里插入图片描述

package com.atguigu.servlet;

import javax.servlet.ServletConfig;
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 HelloServlet2 extends HttpServlet {
    //会报空指针异常的写法
    @Override
    public void init(ServletConfig config) throws ServletException {

    }
    //正确写法
//    @Override
//    public void init(ServletConfig config) throws ServletException {
//        super.init(config);
//    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        System.out.println(servletConfig);

        System.out.println(servletConfig.getInitParameter("username"));
    }

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

    }
}

没有调用父类init方法时的运行结果
在这里插入图片描述

9.ServletContext 类

9.1 什么是 ServletContext?

在这里插入图片描述

9.2 ServletContext 类的四个作用

当存储数据时,如果没有重新部署或者重新打开工程文件的话,ServletContext存储的数据不会被销毁,不同程序上的ServletContext是同一个。
在这里插入图片描述

package com.atguigu.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "HelloServlet3")
public class HelloServlet3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet3中的post请求");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1、获取 web.xml 中配置的上下文参数 context-param
        ServletContext servletContext = 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 代码的 web 目录<br/>
         */
        System.out.println("工程部署的路径:"+servletContext.getRealPath("/"));
        System.out.println("工程下css目录的绝对路径是:"+servletContext.getRealPath("/css"));
        //4.ServletContext 像 Map 一样存取数据
        System.out.println(servletContext);
        System.out.println("存储之前Context1 获取 key1 的值是: "+servletContext.getAttribute("key1"));

        //存储key1
        servletContext.setAttribute("key1","value1");
        System.out.println("Context1 中获取域数据 key1 的值是:"+ servletContext.getAttribute("key1"));

    }
}

10 HTTP协议

10.1 什么是HTTP协议

在这里插入图片描述

10.2 请求的HTTP协议格式

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

10.3 响应的 HTTP 协议格式

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

11.HttpServletRequest类

11.1 作用

在这里插入图片描述

11.2 常用方法

在这里插入图片描述
代码

package com.atguigu.serlvet;

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 RequestAPIServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // i.getRequestURI() 获取请求的资源路径
        System.out.println("URI => " + req.getRequestURI());//URI => /07_servlet/servlet
        // ii.getRequestURL() 获取请求的统一资源定位符(绝对路径)
        System.out.println("URL=>" + req.getRequestURL());//http://localhost:8080/07_servlet/servlet
        // iii.getRemoteHost() 获取客户端的 ip 地址
        /*** 在 IDEA 中,使用 localhost 访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
         * 在 IDEA 中,使用 127.0.0.1 访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
         * 在 IDEA 中,使用 真实 ip 访问时,得到的客户端 ip 地址是 ===>>> 真实的客户端 ip 地址<br/>
         */
        System.out.println("客户端ip地址:" + req.getRemoteHost());//客户端ip地址:127.0.0.1
        // iv.getHeader() 获取请求头
        System.out.println("请求头 User-Agent ==>> " + req.getHeader("User-Agent"));//请求头 User-Agent ==>> Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36
        // vii.getMethod() 获取请求的方式 GET 或 POST
        System.out.println("请求方式=>" + req.getMethod());//请求方式=>GET

    }
}

11.3 如何请求参数

html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>提交</title>
</head>
<body>
    <form action="http://localhost:8080/07_servlet/parameterServlet">
        用户名:<input type = "text" name = "username">
        密码:<input type = "password" name = "password">
        兴趣爱好:<input type="checkbox" name="hobby" value="cpp">C++
        <input type="checkbox" name="hobby" value="java">Java
        <input type="checkbox" name="hobby" value="js">JavaScript<br/>
        <input type="submit">
    </form>
</body>
</html>

java代码

package com.atguigu.serlvet;

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 RequestAPIServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // i.getRequestURI() 获取请求的资源路径
        System.out.println("URI => " + req.getRequestURI());//URI => /07_servlet/servlet
        // ii.getRequestURL() 获取请求的统一资源定位符(绝对路径)
        System.out.println("URL=>" + req.getRequestURL());//http://localhost:8080/07_servlet/servlet
        // iii.getRemoteHost() 获取客户端的 ip 地址
        /*** 在 IDEA 中,使用 localhost 访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
         * 在 IDEA 中,使用 127.0.0.1 访问时,得到的客户端 ip 地址是 ===>>> 127.0.0.1<br/>
         * 在 IDEA 中,使用 真实 ip 访问时,得到的客户端 ip 地址是 ===>>> 真实的客户端 ip 地址<br/>
         */
        System.out.println("客户端ip地址:" + req.getRemoteHost());//客户端ip地址:127.0.0.1
        // iv.getHeader() 获取请求头
        System.out.println("请求头 User-Agent ==>> " + req.getHeader("User-Agent"));//请求头 User-Agent ==>> Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36
        // vii.getMethod() 获取请求的方式 GET 或 POST
        System.out.println("请求方式=>" + req.getMethod());//请求方式=>GET

    }
}

11.4 Post请求中乱码问题解决

post代码

package com.atguigu.serlvet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;

public class ParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doget方法");
        //获取请求的参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobby = req.getParameterValues("hobby");

        System.out.println("用户名:"+username);
        System.out.println("密码:" + password);
        System.out.println("兴趣爱好:" + Arrays.asList(hobby));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置请求体的字符集为 UTF-8,从而解决 post 请求的中文乱码问题
        req.setCharacterEncoding("UTF-8");
        System.out.println("dopost方法");
        //获取请求的参数
        //注意:一定要先设置好字符集再获取,先获取后再设置的话无效
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobby = req.getParameterValues("hobby");

        System.out.println("用户名:"+username);
        System.out.println("密码:" + password);
        System.out.println("兴趣爱好:" + Arrays.asList(hobby));
    }
}

12.请求的转发

在这里插入图片描述
在这里插入图片描述
srevlet代码

package com.atguigu.serlvet;

import javax.servlet.RequestDispatcher;
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 Servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求的参数(办事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在 Servlet1(柜台 1)中查看参数(材料):"+username);
        // 给材料 盖一个章,并传递到 Servlet2(柜台 2)去查看
        req.setAttribute("key","柜台1的章");
        // 问路:Servlet2(柜台 2)怎么走
        //请求转发必须要以斜杠打头,/ 斜杠表示地址为:http://ip:port/工程名/ , 映射到 IDEA 代码的 web 目录
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
        //走向servlet2柜台
        requestDispatcher.forward(req,resp);
    }
}

servlet2代码

package com.atguigu.serlvet;

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 {
        //获取请求的参数(办事的材料)查看
        String username = req.getParameter("username");
        System.out.println("在 Servlet2(柜台 2)中查看参数(材料):" + username);
        //查看是否有柜台1的章
        Object key = req.getAttribute("key");
        System.out.println("是否有柜台1的章:"+key);

        //处理自己的业务
        System.out.println("柜台2处理自己的业务");
    }
}

13.base 标签的作用

在这里插入图片描述
Java代码

package com.atguigu.serlvet;

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 ForwardC extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("经过了ForwardC");

        req.getRequestDispatcher("/a/b/c.html").forward(req,resp);

    }
}

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    这是 a 下的 b 下的 c.html 页面<br/>
    <a href="../../index.html">跳回首页</a><br/>
</body>
</html>

14.Web中相对路径和绝对路径

在这里插入图片描述
/的不同意义
在这里插入图片描述

15.HttpServletResponse 类

在这里插入图片描述

15.1 两个输出流说明

在这里插入图片描述

15.2 如何往客户端回传数据以及解决乱码问题

package com.atguigu.serlvet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ResponseIOServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 要求 : 往客户端回传 字符串 数据。
        /** 设置字符集的第一种方式(不推荐使用)
         * //设置服务器的字符集为UTF-8
         * resp.setCharacterEncoding("UTF-8");
         * // 通过响应头,设置浏览器也使用 UTF-8 字符集
         *  resp.setHeader("Content-type","text/html;charset=UTF-8");
         */

        //设置字符集的第二种方式(推荐使用)
        resp.setContentType("text/html;charset=UTF-8");//要在获取流对象之前设置才有效
        PrintWriter writer = resp.getWriter();
        //如果不设置字符集的话会乱码
        writer.write("hello!你好");
    }
}

16.请求重定向

在这里插入图片描述
Response1代码

package com.atguigu.serlvet;

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 Response1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("曾到Response一游");
        /** 第一种请求重定向的方案(不推荐)
         *   // 设置响应状态码 302 ,表示重定向,(已搬迁)
         *  resp.setStatus(302);
         * // 设置响应头,说明 新的地址在哪里
         * resp.setHeader("Location","http://localhost:8080/07_servlet/response2");
         */

        //第二种请求重定向的方案(推荐使用)
        resp.sendRedirect("http://localhost:8080/07_servlet/response2");
    }
}

Response2代码

package com.atguigu.serlvet;

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 Response2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Response2执行");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值