fufu学JAVA之HttpServletRequest接口详解

HttpServletRequest接口

HttpServletRequest接口的作用

每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的Http协议信息解析好封装到Request对象中,然后传递到Service方法中去,我们可以通过HttpServletRequest对象获取到请求的信息

HttpServletRequest接口的常用方法

  • getRequestURI():获取请求的URI地址
  • getRquestURL():获取请求的绝对路径地址
  • getRemoteHost():获取客户端的ip地址
  • getHeader():获取指定的请求头信息
  • getMethod():获取请求方式
  • getAttribute():获取会话域数据
  • setAttribute():设置会话域数据
  • getRequestDispatcher():获取请求转发对象
  • getParameter():获取请求的参数

如何获取请求的参数

直接上代码:

/head>
<body>
        <form action="http://localhost:2233/JavaWeb_02/getLoginMessage" method="post">
                用户名:<input type="text" name="username"/>
                密  码:<input type="password" name="pwd">
                    <input type="submit"/>
        </form>
</body>
</html>

以上定义了一个form表单,当我们点击提交按钮,就会将数据用户名和密码发送到指定的Servlet类,这里的action参数锁一下:http://localhost:2233/JavaWeb_02/getLoginMessage
http://localhost:2233/JavaWeb_02:表示当前的工程路径
/getLoginMessage:表示映射的Servler类

Servlet类的配置如下:

 <servlet>
        <servlet-name>GetLoginMessage</servlet-name>
        <servlet-class>com.hsf.servlet.GetLoginMessage</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>GetLoginMessage</servlet-name>
        <url-pattern>/getLoginMessage</url-pattern>
    </servlet-mapping>

Servlet类代码:

package com.hsf.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 GetLoginMessage extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        System.out.println("用户名:"+username);
        String pwd = req.getParameter("pwd");
        System.out.println("密码:" + pwd);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求的字符集为utf-8,从而解决post请求的中文乱码问题
        //这句话是设置请求体重内容的编码方式,因为get请求没有请求体,所以该方式不适合get请求。
        req.setCharacterEncoding("utf-8");
        String username = req.getParameter("username");
        System.out.println("用户名:"+username);
        String pwd = req.getParameter("pwd");
        System.out.println("密码:" + pwd);
    }
}

运行如下:
fufu学JAVA之HttpServletRequest接口详解

Request请求乱码的问题

本段选自kaka_1994的

https://blog.csdn.net/javakaka666/article/details/79950161
解决request中文乱码问题,要分成两种情况:get请求和post请求

1.Get //这里取到的值是iso编码过后的值, 是乱码。因为Tomcat中默认使用的是iso8859-1编码

    String username = request.getParameter("username");

  //这里使用ISO的编码, 先逆转回去,变成字节数据,然后在用U8的编码转成中文



    byte [] bytes = username .getBytes("ISO-8859-1");

username = new String(bytes, “utf-8”);

2.Post

//如果是Post方式提交的数据上来,解决乱码,一句话就可以了。

request.setCharacterEncoding(“UTF-8”); //这句话是设置请求体重内容的编码方式,因为get请求没有请求体,所以该方式不适合get请求。

请求转发的特点

客户端通过资源路径将请求发送给Servlet1,Servlet1拿到数据并对其进行处理,之后将请求转发给另一个Servlet2类,Servlet2类对参数进行处理再返回客户端
(画个图吧!)
fufu学JAVA之HttpServletRequest接口详解

以上,相信你应该已经对请求转发有一个大概的理解了,下面我们开始写代码:
我们先写一个form表单用来提交数据


        <form action="http://localhost:2233/JavaWeb_02/getLoginMessage" method="get">
                用户名:<input type="text" name="username"/>
                密  码:<input type="password" name="pwd">
                    <input type="submit"/>
        </form>

然后,创建一个的Servlet类去进行第一次接收处理

package com.hsf.servlet;

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 GetLoginMessage extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        System.out.println("用户名:"+username);
        String pwd = req.getParameter("pwd");
        System.out.println("密码:" + pwd);
        if(username.equals("fufu")&&pwd.equals("123456")){
            //获取请求转发对象,这里的参数表示要转发的位置
            RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servletDemo1");
            req.setAttribute("name","金木研");
            requestDispatcher.forward(req,resp);
        }

    }

处理完之后在会话域中存入数据并将请求转发,这时候,第二个Servlet类接收到请求,并从会话域中拿到数据进行判断,结果为真,再进行其他操作,否则进行操作

package com.hsf.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 ServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String requestURI = req.getRequestURI();
        if(req.getAttribute("name").equals("金木研")) {
            System.out.println("获取请求的地址 => " + requestURI);
            StringBuffer requestURL = req.getRequestURL();
            System.out.println("获取请求资源的绝对路径 => " + requestURL);
            String remoteHost = req.getRemoteHost();
            System.out.println("获取客户端(发送请求的)的ip地址 => " + remoteHost);
            String header = req.getHeader("Accept");
            System.out.println("获取请求头的指定信息:=>" + header);
            String method = req.getMethod();
            System.out.println("获取请求的方式 =>" + method);
        }else{
            System.out.println(req.getAttribute("name"));
        }
    }

这里稍微提一下,存入会话域里的数据只在当前会话过程中有效,当我们切断会话是获取不到会话域里的数据的,所以会抛出NullpaintException异常,

以上,就是请求转发的全过程了!!!

2020-11-29 今日任务完成

											————加油吧,代码人!
上一篇:SpringBoot自适应异常处理


下一篇:一百四十五