Request和Response

1.1 POST和GET请求

1.1.1 GET请求

发出GET请求的主要方式:
 (1)在浏览器输入URL按回车
 (2)点击<a>超链接
 (3)点击submit按钮,提交 <form method=“get”>表单
GET请求特点:
 会将请求数据添加到请求URL地址的后面,只能提交少量的数据、不安全

1.1.2 POST请求

发出POST请求的方法如下:
 点击submit按钮,提交 <form method=“post”>表单
POST请求的特点:
 请求数据添加到HTTP协议体中,可提交大量数据、安全性好

1.2 ServletRequest接口

1.2.1 基本概念

  • javax.servlet.ServletRequest接口主要用于向servlet提供客户端请求信息,可以从中获取到任何请求信息。
  • Servlet容器创建一个ServletRequest对象,并将其作为参数传递给Servlet的service方法。

1.2.2 常用的方法

方法声明 作用
String getParameter(String name) 以字符串形式返回请求参数的值,如果该参数不存在,则返回空值。
String[] getParameterValues (String name) 返回一个字符串对象数组,其中包含给定请求参数所具有的所有值,如果该参数不存在,则返回空值。
Enumeration getParameterNames( ) 返回包含此请求中包含的参数名称的字符串对象的枚举。如果请求没有参数,则方法返回空枚举。
Map<String, String[]> getParameterMap( ) 返回请求参数的键值对,一个键可以对应多个值。
String getRemoteAddr() 根据请求决定调用doGet还是doPost方法
String getRemoteAddr() 返回发送请求的客户端或最后一个代理的IP地址
int getRemotePort() 返回发送请求的客户端或最后一个代理的端口号

1.3 HttpServletRequest接口

1.3.1 基本概念

  • javax.servlet.http.HttpServletRequest接口是ServletRequest接口的子接口,主要用于提供HTTP请求信息的功能。
  • 不同于表单数据,在发送HTTP请求时,HTTP请求头直接由浏览器设置。
  • 可直接通过HttpServletRequest对象提供的一系列get方法获取请求头数据。

1.3.2 常用的方法

方法声明 作用
String getRequestURI( ) 以字符串形式返回请求参数的值,如果该参数不存在,则返回空值。
StringBuffer getRequestURL( ) 返回一个字符串对象数组,其中包含给定请求参数所具有的所有值,如果该参数不存在,则返回空值。
String getMethod( ) 返回包含此请求中包含的参数名称的字符串对象的枚举。如果请求没有参数,则方法返回空枚举。
String getQueryString( ) 返回请求参数的键值对,一个键可以对应多个值。
String getServletPath( ) 根据请求决定调用doGet还是doPost方法

1.3.3 Servlet接收中文乱码

接收乱码原因

  • 浏览器在提交表单时,会对中文参数值进行自动编码。
  • 当Tomcat服务器接收到浏览器请求后自动解码,当编码与解码方式不一致时,就会导致乱码。

解决POST接收乱码

  • 接收之前设置编码方式:request.setCharacterEncoding(“utf-8”)
  • 注意:必须在调用request.getParameter(“name”)之前设置

解决GET接收乱码

将接收到的中文乱码重新编码:
 // 接收到get请求的中文字符串
 String name = request.getParameter("name");
 // 将中文字符重新编码,默认编码为ISO-8859-1
 String userName = new String(name.getBytes(“ISO-8859-1”),“utf-8");

1.3.4 代码示例

  1. 前端页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>请求参数的获取</title>
</head>
<body>
<!--表单-->
<form action="parameter" method="post">
    姓名: <input type="text" name="name"/><br/>
    密码: <input type="password" name="password"><br/>
    爱好: <input type="checkbox" name="hobby" value="basketball"/>篮球
         <input type="checkbox" name="hobby" value="Java"/>Java
         <input type="checkbox" name="hobby" value="run"/>跑步<br/>
    <input type="submit" value="提交">
</form>
</body>
</html>
  1. Servlet 服务端实现
package cn.guardwhy.servlet03;
/*
Request 相关方法
*/
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.util.Enumeration;
import java.util.Map;
import java.util.Set;

@WebServlet("/parameter")
public class RequestServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws 
        ServletException, IOException {
        // 1.设置编码
        request.setCharacterEncoding("utf-8");
        // 1.获取指定参数名称对应的参数值
        String name = request.getParameter("name");
        System.out.println("用户名:" + name);

        String[] hobbies = request.getParameterValues("hobby");
        System.out.print("爱好:");

        for(String hb : hobbies){
            System.out.print(hb + " ");
        }
        System.out.println();

        System.out.println("++++++++++++++++");

        // 2.获取所有参数的名称
        Enumeration<String> parameterNames = request.getParameterNames();
        System.out.print("获取到的所有参数:");
        while (parameterNames.hasMoreElements()){
            System.out.print(parameterNames.nextElement() + " ");
        }
        System.out.println();

        System.out.println("============");

        // 3.获取请求参数名和对应值
        Map<String, String[]> maps = request.getParameterMap();
        // 遍历集合
        Set<Map.Entry<String, String[]>> entries = maps.entrySet();
        for (Map.Entry<String, String[]> entry : entries){
            System.out.print(entry.getKey() + ":");
            for(String value : entry.getValue()){
                System.out.print(value + " ");
            }
            System.out.println();
        }
        System.out.println("~~~~~~~~~~~~~~~~~~~~~");

        // 4.获取客户端请求信息
        System.out.println("请求的IP地址:" + request.getRemoteAddr());
        System.out.println("请求的端口号:" + request.getRemotePort());
        System.out.println("请求资源的路径:" + request.getRequestURI());
        System.out.println("请求资源的完整路径为:" + request.getRequestURL());
        System.out.println("请求方式:" + request.getMethod());
        System.out.println("请求附带参数:" + request.getQueryString());
        System.out.println("请求Servlet路径:" + request.getServletPath());

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws 
        ServletException, IOException {

    }
}

执行结果

1.4 ServletResponse接口

1.4.1 基本概念

  • javax.servlet.ServletResponse接口用于定义一个对象来帮助Servlet向客户端发送响应。
  • Servlet容器创建ServletResponse对象,并将其作为参数传递给servlet的service方法。

1.4.2 常用方法

方法声明 作用
PrintWriter getWriter( ) 返回可向客户端发送字符文本的PrintWriter对象。
String getCharacterEncoding() 获取响应内容的编码方式。
void setContentType(String type) 如果尚未提交响应,则设置发送到客户端响应的内容类型。内容类型
可以包括字符编码规范,例如text/html;charset=UTF-8

1.5 HttpServletResponse接口

1.5.1 基本概念

  • javax.servlet.http.HttpServletResponse接口继承ServletResponse接口,以便在发送响应时提供特定于HTTP的功能。

1.5.2 常用的方法

方法声明 作用
void sendRedirect(String location) 使用指定的重定向位置URL向客户端发送临时重定向响应

1.5.3 代码示例

package cn.guardwhy.servlet03;
/*
Response 相关方法
*/
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;
import java.util.Map;
import java.util.Set;

@WebServlet("/parameter")
public class RequestServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
		// 向浏览器发出响应数据
        System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$");

        // 1.设置服务器和浏览器的编码方式
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        // 2.向浏览器中打印
        out.write("hello, ResponseServlet");
        System.out.println("服务器发送数据成功");
        // 3.关闭资源
        out.close();

    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

执行结果

1.6 ServletContext接口

1.6.1 基本概念

  • javax.servlet.ServletContext接口主要用于定义一组方法,Servlet使用这些方法与它的Servlet容器通信。
  • 服务器容器在启动时会为每个项目创建唯一的一个ServletContext对象,用于实现多个Servlet之间的信息共享和通信。
  • Servlet中通过this.getServletContext()方法可以获得ServletContext对象。

1.6.2 常用的方法

方法声明 作用
String getInitParameter(String name) 返回包含初始化参数值的字符串,如果该参数不存在,则返回null
Enumeration getInitParameterNames( ) 将servlet的初始化参数的名称作为字符串对象的枚举返回,如果servlet没有初始化参数,则返回空枚举
void setAttribute(String name, Object object) 将指定的属性名和属性值绑定到当前对象。
Object getAttribute(String name) 根据执行的属性名获取属性值。
void removeAttribute(String name) 删除指定的属性名信息。

1.6.3 配置方式

<!-- 对于ServletContext对象的参数进行配置 -->
<context-param>
    <param-name>username</param-name>
    <param-value>guardwhy</param-value>
</context-param>
<context-param>
    <param-name>password</param-name>
    <param-value>hxy162</param-value>
</context-param>

1.6.4 代码示例

package cn.guardwhy.servlet03;

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

/*
*   ServletContext:上下文域
*/

@WebServlet("/ContextServlet")
public class ContextServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.1配置参数的获取
        ServletContext servletContext = this.getServletContext();
        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
        // 1.2遍历集合
        while (initParameterNames.hasMoreElements()){
            String str = initParameterNames.nextElement();
            System.out.println(str + "===>" + servletContext.getInitParameter(str));
        }

        // 2.1 设置属性和获取属性信息
        servletContext.setAttribute("key", "guardwhy");
        Object key = servletContext.getAttribute("key");
        System.out.println("属性值:" + key);   // guardwhy

        // 2.2 移除属性
        servletContext.removeAttribute("key");
        key = servletContext.getAttribute("key");
        System.out.println("属性值:" + key);   // null
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

执行结果

posted @ 2021-10-28 18:32  guardwhy  阅读(72)  评论(0编辑  收藏  举报