IDEA(2020版)实现Servlet程序 – 每天进步一点点

IDEA(2020版)实现Servlet的生命周期 – 每天进步一点点

IDEA(2020版)实现ServletConfig和ServletContext – 每天进步一点点

IDEA(2020版)实现HttpServletResponse对象 – 每天进步一点点

本文主要介绍在IDEA中实现HttpServletResponse对象

源代码下载: https://box356.lanzoub.com/ij9CW2s8vp2h

1.获取请求行信息的相关方法

右击src—>New—>Create New Servlet,名称就叫TestServlet4_17

代码参考如下:

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;
import java.io.PrintWriter;

@WebServlet(name = "TestServlet4_17",value = "/test417")
public class TestServlet4_17 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        // 获取请求行的相关信息
        out.println("getMethod : " + request.getMethod() + "<br />");
        out.println("getRequestURI : " + request.getRequestURI() + "<br />");
        out.println("getQueryString:" + request.getQueryString() + "<br />");
        out.println("getProtocol : " + request.getProtocol() + "<br />");
        out.println("getContextPath:" + request.getContextPath() + "<br />");
        out.println("getPathInfo : " + request.getPathInfo() + "<br />");
        out.println("getPathTranslated : " + request.getPathTranslated() + "<br />");
        out.println("getServletPath:" + request.getServletPath() + "<br />");
        out.println("getRemoteAddr : " + request.getRemoteAddr() + "<br />");
        out.println("getRemoteHost : " + request.getRemoteHost() + "<br />");
        out.println("getRemotePort : " + request.getRemotePort() + "<br />");
        out.println("getLocalAddr : " + request.getLocalAddr() + "<br />");
        out.println("getLocalName : " + request.getLocalName() + "<br />");
        out.println("getLocalPort : " + request.getLocalPort() + "<br />");
        out.println("getServerName : " + request.getServerName() + "<br />");
        out.println("getServerPort : " + request.getServerPort() + "<br />");
        out.println("getScheme : " + request.getScheme() + "<br />");
        out.println("getRequestURL : " + request.getRequestURL() + "<br />");
    }

    public void doPost(HttpServletRequest request,
                       HttpServletResponse response) throws ServletException,
            IOException {
        doGet(request, response);
    }
}

在浏览器里输入下面的地址,注意和你实际的地址相匹配

http://localhost:8080/Servlet01_war_exploded/test417

运行结果如下:

2.获取请求头的相关方法

右击src,创建一个新的Servlet,名字为TestServlet4_18

代码参考如下:

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;
import java.io.PrintWriter;
import java.util.Enumeration;

@WebServlet(name = "TestServlet4_18",value = "/test418")
public class TestServlet4_18 extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        // 获取请求消息中所有头字段
        Enumeration headerNames = request.getHeaderNames();
        // 使用循环遍历所有请求头,并通过getHeader()方法获取一个指定名称的头字段
        while (headerNames.hasMoreElements()) {
            String headerName = (String) headerNames.nextElement();
            out.print(headerName + " : "
                    + request.getHeader(headerName) + "<br />");
        }
    }

    public void doPost(HttpServletRequest request,
                       HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

然后访问地址参考如下:

http://localhost:8080/Servlet01_war_exploded/test418

结果如下:

3.请求转发

请求转发实习两个Servlet之间的跳转,我们创建两个Servlet,第一个TestServlet4_19和TestServlet4_20,当我们访问TestServlet4_19的时候,自动跳转到TestServlet4_20。

右击Src,创建第一个TestServlet4_19,代码参考如下:

import javax.servlet.RequestDispatcher;
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 = "TestServlet419",value = "/test419")
public class TestServlet4_19 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse
            response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setAttribute("username", "张三");// 将数据存储到request对象中
        //RequestDispatcher dispatcher = request.getRequestDispatcher("/ResultServlet"); //原版
        RequestDispatcher dispatcher = request.getRequestDispatcher("/test420"); //新版
        dispatcher.forward(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse
            response) throws ServletException, IOException {
        doGet(request, response);
    }
}

再创建一个Servlet4_20,代码参考如下

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;
import java.io.PrintWriter;

@WebServlet(name = "TestServlet4_29",value = "/test420")
public class TestServlet4_20 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse
            response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String username = (String) request.getAttribute("username");
        if (username != null) {
            out.println("用户名:" + username + "<br/>");
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse
            response) throws ServletException, IOException {
        doGet(request, response);
    }
}

我们访问第一个Servlet的地址

http://localhost:8080/Servlet01_war_exploded/test419

运行结果如下:

4.获取请求参数

右击web——>New——>HTML file,名称为form.html

代码参考如下:

(注意,action的地址已经修改)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>
<form action="/Servlet01_war_exploded/test422" method="POST">
    用户名:<input type="text" name="username"><br />
    密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password">
    <br />
    爱好:
    <input type="checkbox" name="hobby" value="sing">唱歌
    <input type="checkbox" name="hobby" value="dance">跳舞
    <input type="checkbox" name="hobby" value="football">足球<br />
    <input type="submit" value="提交">
</form>
</body>
</html>

然后右击src创建一个servlet,名字为TestServlet4_22

代码参考如下:

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 = "TestServlet4_22",value = "/test422")
public class TestServlet4_22 extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("用户名:" + name);
        System.out.println("密  码:" + password);
        // 获取参数名为“hobby”的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.print("爱好:");
        for (int i = 0; i < hobbys.length; i++) {
            System.out.print(hobbys[i] + ", ");
        }
    }
    public void doPost(HttpServletRequest request,
                       HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

我们在浏览器里访问form.html

http://localhost:8080/Servlet01_war_exploded/form.html

实现效果如下:

5.解决请求参数中文乱码问题

设置方法就是在代码中加入下面的代码

request.setCharacterEncoding("utf-8");

在上述文件TestServlet4_22中,已经加了上述代码,所以结果没有乱码

如果去掉这段代码,就会出现中文乱码。

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 = "TestServlet4_22",value = "/test422")
public class TestServlet4_22 extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("用户名:" + name);
        System.out.println("密  码:" + password);
        // 获取参数名为“hobby”的值
        String[] hobbys = request.getParameterValues("hobby");
        System.out.print("爱好:");
        for (int i = 0; i < hobbys.length; i++) {
            System.out.print(hobbys[i] + ", ");
        }
    }
    public void doPost(HttpServletRequest request,
                       HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}