美文网首页
Servlet四——请求对象

Servlet四——请求对象

作者: 嗷老板 | 来源:发表于2018-04-01 16:32 被阅读0次

  HttpServletResponse
  请求对象封装了HTTP协议的请求行,请求头,请求体,我们可以通过请求对象的方法来获取这些信息。

一、获取请求行

  • 获取完整的URL:StringBuffer getRequestURL()
  • 获取请求行中的资源路径:String getRequestURI()
  • 获取请求方式:String getMethod()
  • 获取当前项目的路径:String getContextPath()
  • 获取请求行中资源路径后面的参数:String getQueryString()

示例:

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 Demo1 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取完整的URL
        StringBuffer url = request.getRequestURL();
        response.getWriter().println(url.toString());
        // 获取请求行中的资源路径
        String uri = request.getRequestURI();
        response.getWriter().println(uri);
        // 获取请求方式
        String method = request.getMethod();
        response.getWriter().println(method);
        // 获取当前项目的路径
        String path = request.getContextPath();
        response.getWriter().println(path);
        // 获取请求行中资源路径后面的参数
        String queryString = request.getQueryString();
        response.getWriter().println(queryString);

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
获取请求行

注意:
  getRequestURL()返回的是一个可变字符串,不能直接使用String来接收
  getQueryString()获取的是资源路径后面的参数,请求体里的数据无法获取

二、获取请求头

  • 获取所有的请求头name:Enumeration getHeaderNames()
  • 通过name来获取请求头value:String getHeader(String name)

示例:

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 Demo2 extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Enumeration<String> names = request.getHeaderNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            String value = request.getHeader(name);
            response.getWriter().println(name+"---"+value);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
请求头信息

三、获取表单提交的数据

  这里获取的数据是在请求体中的数据,也就是获取post请求方式的表单中的数据。

  • String getParameter(String name) :根据表单项的name来获取表单项的value
    注意:
      有表单项提交过来,但是没有值, 打印的是空字符串;表单项根本没有提交过来,打印的就是null,就不能调用字符串的方法,否则会报空指针异常。
  • String[] getParameterValues(String name) 根据表单项的name获取表单项value的数组,一般使用在复选框等表单项中。
  • Map getParameterMap(): 获取表单提交来的所有数据,并封装成一个map返回,一些框架(工具类)会使用这个方法
    注意:  返回值使用泛型时应该是Map<String,String[]>形式,因为有时像checkbox这样的组件会有一个name对应多个value的时候,所以该Map中键值对是<String-->String[]>的实现。
  • Enumeration getParameterNames() 获取提交过来表单项所有的name
    注意:
      注册按钮提交过来没有意义,所以注册按钮千万不要写name属性

示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>获取表单数据</title>
</head>
<body>
    <form action="/requestdemo/Demo3" method="post">
    用户名:<input type="text" name="username"/><br/>
    密码:<input type="text" name="password"/><br/>
    兴趣爱好:<input type="checkbox" name="hobbies" value="basketball"/>打篮球
            <input type="checkbox" name="hobbies" value="travel" />旅游
            <input type="checkbox" name="hobbies" value="swimming"/>游泳<br/>
    <input type="submit" value="提交"/>
    </form>
</body>
</html>
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 Demo3 extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        response.getWriter().println("username:"+username);
        
        String[] hobbies = request.getParameterValues("hobbies");
        for (String hobby : hobbies) {
            response.getWriter().println("hobby:"+hobby);
        }
        
        Enumeration<String> names = request.getParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            response.getWriter().println(name);
        }
    }

    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
form.html
表单数据

四、表单提交数据乱码问题的处理

  如果我们在上面的案例中填入中文,就会出现下面的乱码问题。


form.html
乱码问题

原因:
  编码前后不一致,表单提交数据用的是UTF-8,请求对象接收数据转换成字符串,用的是默认的ISO-8859-1。

问题的处理:
  对于post请求:
    设置请求对象创建字符串所使用的编码为UTF-8


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 Demo3 extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        
        String username = request.getParameter("username");
        response.getWriter().println("username:"+username+"<br />");
        
        String[] hobbies = request.getParameterValues("hobbies");
        for (String hobby : hobbies) {
            response.getWriter().println("hobby:"+hobby+"<br />");
        }
        
        Enumeration<String> names = request.getParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            response.getWriter().println(name+"<br />");
        }
    }

    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

  对于get请求
    浏览器按照表单页面的编码(UTF-8)进行转码,转成字节数组,拼接在请求资源的后面,接下来把字节数组做一个转义(url编码)在发送
    服务器首先拿到这个数据做一个url解码(正确的),然后把解码之后的数据按照ISO-8859-1拼成字符串(错误)

  这两种问题都可以通过这种做法解决问题:将字符串打回原形,再用UTF-8的编码转换成字符串

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 Demo3 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        byte[] bys = request.getParameter("username").getBytes("ISO-8859-1");
        String username = new String(bys,"UTF-8");
        response.getWriter().println("username:"+username+"<br />");
        
        String[] hobbies = request.getParameterValues("hobbies");
        for (String hobby : hobbies) {
            response.getWriter().println("hobby:"+hobby+"<br />");
        }
        
        Enumeration<String> names = request.getParameterNames();
        while(names.hasMoreElements()){
            String name = names.nextElement();
            response.getWriter().println(name+"<br />");
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
问题的解决

五、请求对象实现转发和包含

    RequestDispatcher rd = request.getRequestDispatcher("register.html");
    rd.forward(request, response);
    rd.include(request, response);

和ServletContext实现转发和包含的区别:
  用ServletContext实现转发和包含,路径必须以正斜杠开头,request对象路径可以不用正斜杠开头

六、使用请求对象实现数据共享

ServletContext 上下文对象 范围是当前的web应用
  时间范围 tomcat 一加载项目 tomcat关闭
  空间范围 整个web应用
request 请求对象 范围是当前的请求 需要同一个请求才能实现数据的共享
  时间范围 一个请求开始,请求结束
  空间范围 当前这个请求里面

示例:

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 Demo4 extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置数据
        request.setAttribute("username", "zhangsan");
        
        //转发数据
        RequestDispatcher rd = request.getRequestDispatcher("/Demo5");
        rd.forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
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 Demo5 extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取数据
        Object obj = request.getAttribute("username");
        response.getWriter().println(obj);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
共享数据

相关文章

  • Servlet四——请求对象

      HttpServletResponse  请求对象封装了HTTP协议的请求行,请求头,请求体,我们可以通过请求...

  • JSP九大内置对象及四个作用域

    request 请求对象 类型 javax.servlet.ServletRequest 作用...

  • 4. Java Web Servlet开发中涉及的对象

    Servlet开发中涉及的对象: HttpservletRequest对象: 封装请求信息HttpServletR...

  • SpringMVC流程

    用户的请求以http形式进入到servlet容器中,servlet容器把请求解析成一个对象,这个对象中包含了解析得...

  • 深入理解Tomcat——Servlet容器(Container)

    深入理解Tomcat——Servlet容器 Servlet容器处理客户端的请求并填充response对象。Serv...

  • 模糊查询SQL

    servlet获取请求参数,把参数封装为Javabeans对象,在调用方法,传入刚才封装的对象,

  • jsp九大内置对象

    JSP中九大内置对象及作用域: request请求对象类型 javax.servlet.ServletReques...

  • Servlet

    Servlet简介: Servlet响应客户请求过程: Servlet容器响应客户请求的过程: Servlet生命...

  • 初识Servlet

    一、servlet的一生 当一个请求映射到一个从未被访问过的servlet时,容器还未创建该servlet对象,所...

  • Web考试应急

    1、servlet的生命周期: a、实例化b、初始化c、处理请求服务d、对象销毁简述:servlet在首次访问时会...

网友评论

      本文标题:Servlet四——请求对象

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