美文网首页
J2EE--HttpServletRequest

J2EE--HttpServletRequest

作者: RicherYY | 来源:发表于2020-08-20 18:00 被阅读0次
  1. 什么是Request?
  2. 为什么要使用Request?
  3. 怎么使用Request?
  4. 其它功能
  5. 中文乱码问题解决

1. 什么是Request?

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

2. 为什么要使用Request?

  • 使用Request对象来分析出对应的Servlet去执行对应的业务逻辑
  • 使用Request对象来获取、转发、数据共享等功能

3. 怎么使用Request?

根据HTTP协议我们可以得知,一次数据请求包含:

  • 请求行:请求方式 请求url 请求协议/版本
  • 请求头:客户端浏览器告诉服务器一些信息
  • 请求空行:空行,就是用于分割POST请求的请求头,和请求体的。
  • 请求体:封装POST请求消息的请求参数的

3.1 获取请求行数据

方法 说明
String getMethod() 获取请求方式
String getContextPath() 获取虚拟目录
String getServletPath() 获取Servlet路径
String getQueryString() 获取get方式请求参数
String getRequestURI() 获取请求URI
String getRemoteAddr() 获取客户机的IP地址

示例代码

@WebServlet("/demo")
public class ServletDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取虚拟目录
        System.out.printf(req.getContextPath()+"\n");
        //获取URI
        System.out.printf(req.getRequestURI()+"\n");
    }

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

效果演示

image.png image.png

补充

3.2 获取请求头数据

方法 说明
String getHeader(String name) 通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames() 获取所有的请求头名称

3.3 获取请求体数据

请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
步骤:

  1. 获取流对象
    BufferedReader getReader():获取字符输入流,只能操作字符数据
    ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
    在文件上传知识点后讲解
  2. 再从流对象中拿数据

4. 其它功能

4.1 获取请求参数

获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数

方法 说明
String getParameter(String name) 根据参数名称获取参数值 username=zs&password=123
String[] getParameterValues(String name) 根据参数名称获取参数值的数组 hobby=xx&hobby=game
Enumeration<String> getParameterNames() 获取所有请求的参数名称
Map<String,String[]> getParameterMap() 获取所有参数的map集合

示例代码

html页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户登录</h1>

<form action="demo" method="POST">
    用户名:<input type="text" name="username"/>
    <br/>
    密 码:<input type="password" name="password"/>
    <br/>
    <input type="checkbox" name="usertype" value="administrator"/>管理员
    <input type="checkbox" name="usertype" value="user"/>普通用户
    <br/>
    <input type="submit" value="提交">

</form>

</body>
</html>
Servlet页面
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //防止中文乱码
        req.setCharacterEncoding("utf-8");
        //获取username的参数(输入值)
        System.out.printf(req.getParameter("username")+ "\n");
        //获取password的参数(输入值)
        System.out.printf(req.getParameter("password")+ "\n");
       //根据参数名称获取参数值的数组
        String [] result= req.getParameterValues("usertype");
        for (String s : result) {
            System.out.println(s);
        }
    }

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

演示结果

image.png

4.2 请求转发

一种在服务器内部的资源跳转方式

4.2.1 步骤:

  1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
  2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

4.2.2. 特点:

  1. 浏览器地址栏路径不发生变化
  2. 只能转发到当前服务器内部资源中。
  3. 转发是一次请求

示例代码

LoginServlet
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {

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

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

        String user_name = req.getParameter("username");

        if (user_name.equals("aaa")){
            req.getRequestDispatcher("/failServlet").forward(req,resp);
        }
    }
}
FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

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

        //设置编码
        resp.setContentType("text/html;charset=utf-8");
        //输出
        resp.getWriter().write("登录失败,用户名或密码错误");
    }
}

效果展示

image.png image.png

4.3 共享数据

  • 域对象:一个有作用范围的对象,可以在范围内共享数据
  • request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法 说明
void setAttribute(String name,Object obj) 存储数据
Object getAttitude(String name) 通过键获取值
void removeAttribute(String name) 通过键移除键值对

示例代码

LoginServlet
@WebServlet("/demo")
public class ServletDemo extends HttpServlet {

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

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

        String user_name = req.getParameter("username");

        if (user_name.equals("aaa")){
            //存放数据
            req.setAttribute("shareData",user_name);
            //转发
            req.getRequestDispatcher("/failServlet").forward(req,resp);
        }
    }
}
FailServlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

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


        //设置编码
        resp.setContentType("text/html;charset=utf-8");

        //获取存放数据
        String data =(String) req.getAttribute("shareData");
        //输出
        resp.getWriter().write("登录失败,用户名或密码错误");
        resp.getWriter().write("用户"+data+"不允许登录!");
    }
}

效果显示

image.png image.png

4.4 获取ServletContext

ServletContext getServletContext()

5. 中文乱码问题

中文乱码问题:

  • get方式:tomcat 8 已经将get方式乱码问题解决了
  • post方式:会乱码解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");

相关文章

  • J2EE--HttpServletRequest

    什么是Request? 为什么要使用Request? 怎么使用Request? 其它功能 中文乱码问题解决 1. ...

网友评论

      本文标题:J2EE--HttpServletRequest

      本文链接:https://www.haomeiwen.com/subject/xrewdktx.html