Javaweb--JavaWeb--tomcat之HttpServlet使用详解,HttpServletRequest与HttpServletResponse

一、通过HttpServletRequest对象 获取请求的信息

通过doGet或doPost方法的第一个参数(HttpServletRequest对象)获取请求信息

1.代码获取请求信息

package com.my.servlet;

import java.io.IOException;
import java.util.Enumeration;

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

public class SrcHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGetting");
        System.out.println("req.getRequestURI---"+req.getRequestURI());
        System.out.println("req.getRequestURL---"+req.getRequestURL());
        System.out.println("req.getRemoteHost---"+req.getRemoteHost());
        System.out.println("req.getRemoteAddr---"+req.getRemoteAddr());
        System.out.println("req.getMethod---"+req.getMethod());
        System.out.println("=====================遍历获取请求头的内容=====================");
        System.out.println("req.getHeader---"+req.getHeader("User-Agent"));
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String s = headerNames.nextElement();
            String value = req.getHeader(s);
            System.out.println(s+"----"+value);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPosting,获取表单数据");
        req.setCharacterEncoding("utf-8"); // 设置编码格式,防止中文乱码
        Enumeration<String> parameterNames = req.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String s = parameterNames.nextElement();
            String value = req.getParameter(s);
            System.out.println(s+"----"+value);
        }
    }
}

浏览器访问http://localhost:8080/default/shs后返回:

doGetting
req.getRequestURI---/default/shs
req.getRequestURL---http://localhost:8080/default/shs
req.getRemoteHost---0:0:0:0:0:0:0:1
req.getRemoteAddr---0:0:0:0:0:0:0:1
req.getMethod---GET
=====================遍历获取请求头的内容=====================
req.getHeader---Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Mobile Safari/537.36
host----127.0.0.1:8080
connection----keep-alive
pragma----no-cache
cache-control----no-cache
sec-ch-ua----" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile----?1
upgrade-insecure-requests----1
user-agent----Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Mobile Safari/537.36
accept----text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site----none
sec-fetch-mode----navigate
sec-fetch-user----?1
sec-fetch-dest----document
accept-encoding----gzip, deflate, br
accept-language----zh-CN,zh;q=0.9

2.获取post请求的表单数据

使用html如下:放在web目录下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/default/shs" method="post">
    <input type="text" name="userName"/><br/>
    <input type="password" name="password"/><br/>
    <input type="submit" value="getBtn" />
</form>
</body>
</html>

浏览器访问http://localhost:8080/default/myHtml.html,点击[getBtn]按钮
在这里插入图片描述
控制台返回:

doPosting,获取表单数据
userName----yunweixiaocai
password----ywxc1234

二、通过HttpServletRequest对象实现请求转发

  • 使用请求对象的.getRequestDispatcher()方法获取 请求转发实例
  • 使用实例的forward()方法执行转发

SrcHttpServlet .java:

package com.my.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SrcHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("SrcHttpServlet do get");
        String userName = req.getParameter("UserName"); // 获取请求参数(URL中的参数)
        System.out.println("SrcHttpServlet "+userName);

        req.setAttribute("stats","pass"); // 设置全局参数供目标servlet获取使用

        RequestDispatcher requestDispatcher = req.getRequestDispatcher("/dhs"); // 请求转发实例,目标servlet为/dhs(DestHttpServlet)
        requestDispatcher.forward(req, resp); // 执行转发,携带原来的req与resp
    }
}

DestHttpServlet .java

package com.my.servlet;

import java.io.IOException;

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

public class DestHttpServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("DestHttpServlet do get");
        String userName = request.getParameter("UserName"); // 获取初始参数(url中的参数)
        System.out.println("DestHttpServlet "+userName);

        Object stats = request.getAttribute("stats"); // 获取转发者设置的全局参数
        System.out.println("DestHttpServlet "+stats);

        System.out.println("DestHttpServlet do other things...");
    }
}

浏览器访问:http://localhost:8080/default/shs?UserName=yunweixiaocai,加粗部分为携带的参数
控制台返回:

SrcHttpServlet do get
SrcHttpServlet yunweixiaocai
DestHttpServlet do get
DestHttpServlet yunweixiaocai
DestHttpServlet pass
DestHttpServlet do other things...

浏览器只有一个请求,不感知跳转
在这里插入图片描述

三、通过HttpServletResponse对象实现服务器响应

HttpServletResponse有两个响应流可以直接通过对象获取

  • PrintWriter流可实现文本响应:resp.getWriter();
  • ServletOutputStream流可实现文件传输: resp.getOutputStream();
    .

tips:一个响应里,两个流只能使用一个

package com.my.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SrcHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 两种响应流只能使用一个,不然会报错

        // 一、实现文本响应,先设置编码再获取流
        //1.设置字符编码,方式一:分步设置
        //resp.setCharacterEncoding("utf-8");// 设置服务器编码为utf-8
        //resp.setHeader("Content-Type","text/html; charset=utf-8"); // 设置浏览器字符编码为utf-8
        //方式二:一步到位
        //resp.setContentType("text/html; charset=utf-8");

        /*PrintWriter writer = resp.getWriter();
        writer.write("This is response content. 这是响应内容");*/



        // 二、实现文件下载,先设值内容格式,再获取流
        resp.setContentType("application/octet-stream");
        resp.setHeader("Content-Disposition", "attachment; filename=test.avi");

        ServletOutputStream outputStream = resp.getOutputStream();
        File file = new File("d:\\test.avi");
        FileInputStream fis = new FileInputStream(file);

        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = fis.read(bytes))!=-1){
            outputStream.write(bytes,0,len);
        }
    }
}

四、通过HttpServletResponse对象实现请求重定向

请求重定向是指,访问一个servlet时跳转到另一个servlet,实现两次请求(第二次请求自动实现)

SrcHttpServlet中:

package com.my.servlet;

import java.io.IOException;

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

public class SrcHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*resp.setStatus(302);
        resp.setHeader("Location","http://localhost:8080/default/dhs");*/

        // 或者
        resp.sendRedirect("/default/dhs");

    }
}

DestHttpServlet中:

package com.my.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 DestHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("srcHttpServlet's content");
    }
}

浏览器输入SrcHttpServlet映射的url:http://localhost:8080/default/shs后自动跳转到DestHttpServlet映射的url:http://localhost:8080/default/dhs:
在这里插入图片描述

五、本文配置的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>
        <servlet-name>srcHttpServlet</servlet-name>
        <servlet-class>com.my.servlet.SrcHttpServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>destHttpServlet</servlet-name>
        <servlet-class>com.my.servlet.DestHttpServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>srcHttpServlet</servlet-name>
        <url-pattern>/shs</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>destHttpServlet</servlet-name>
        <url-pattern>/dhs</url-pattern>
    </servlet-mapping>

</web-app>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值