Loading

servlet关于HttpServletRequest 对象

常见方法的具体实现

已经学习完了,Servlet的一些基本原理,现在开始进行实际的运用实现。
文中web.xml 和 index.html是共用的代码
回顾一下Servlet的作用:

  • 获取用户提交数据
  • 获取浏览器附加信息
  • 处理数据(访问数据库或调用接口)
  • 给浏览器产生一个响应
  • 在响应中添加附加信息

获取请求头信息常见方法

package com.hhxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 获取请求信息,使用的是HttpServletRequest
 * */
public class DemoServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //返回客户端浏览器发出请求的完整URL,属于StringBuffer类型
        StringBuffer requestURL =req.getRequestURL();
       //返回请求行中制定的URI(除去主机端口)
        String requestURI= req.getRequestURI();
        //返回发送请求的主机IP地址
        String remoteAddr =req.getRemoteAddr();
        PrintWriter out = resp.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01Transitional//EN\">");
        out.println("<HTML>");
        out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println(" <BODY>");
        out.println("requestURL:"+requestURL+"<br/>");
        out.println("requestURI:"+requestURI+"<br/>");
        out.println("remoteAddr:"+remoteAddr+"<br/>");
        out.println(" </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }
}

输出结果:

// requestURL:http://localhost:8080/demo//test.do
// requestURI:/demo//test.do
// remoteAddr:0:0:0:0:0:0:0:1

获取请求数据

由于会有单选框和多选框的形式因此在获取值得时候,方法是不一样的。有的是指,有的是键值对,有的是枚举。这里难度不在于使用这个方法,而在于如何把这个内容响应到浏览器页面,会涉及之前的容器内容
需要注意的是,是请求数据,因此使用doPost提交方式下面代码主要反映主要的代码

根据key获取指定的value,适合单选框

 //参数是表单当中的name=“”
 String username = req.getParameter("username");

获取复选框(Checkbox)中的值,一个key,可能对应多个值

//返回的是数组类型
        String[] userlikes =req.getParameterValues("userlike");
//传入的内容必须是对象或者对象数组,不能是基本数据类型通过Arrays.asList()方法转为List类型
        List<String> strings =Arrays.asList(userlikes);

由于String数组直接打印的话是对象的引用,因此需要进行遍历,可以转为List,而可以通过Arrays.toString(int[] )函数来输出;而因为List Set Map等集合类都实现了toString()方法,所以可以直接打印输出

获取所提交数据的key

Enumeration<String> parameterNames =req.getParameterNames();
        List<String> keys =new ArrayList<>();
        while(parameterNames.hasMoreElements()){
           //为了便于遍历,将放在List当中
         keys.add(parameterNames.nextElement());
        }

该方法返回的是一个枚举类型,因此需要通过遍历获取,依旧采用List获取

使用Map结构获取提交数据

Map<String,String[]> parameterMap = req.getParameterMap();
 Iterator<Map.Entry<String,String[]>> iterator =parameterMap.entrySet().iterator();
        while (iterator.hasNext()){
            Map.Entry<String ,String[]> entry =iterator.next();
            out.println("keys:"+entry.getKey()+"Value:"+Arrays.asList(entry.getValue())+"<br/>");
        }
 //或者使用
 Set<Map.Entry<String,String[]>> entries = parameterMap.entrySet();
        for (Map.Entry<String, String[]> stringEntry : entries) {
           value是一个字符串数组,直接输出是对象的引用,使用Arrays.asList进行转换
   out.println("keys:"+stringEntry.getKey()+"Value:"+Arrays.asList(stringEntry.getValue())+"<br/>");
      }

获取请求中所有的数据并存放到一个 Map 结构中,该方法返回一个 Map,其中 key 为 String 类型 value 为 String[]类型。

以上调用,都是以字符形式进行的,而响应的获取使用即可

 PrintWriter out = resp.getWriter();

设置数据编码

请求的数据包基于字节在网络上传输,Tomcat 接收到请求的数据包后会将数据包中的 字节转换为字符。在 Tomcat 中使用的是 ISO-8859-1 的单字节编码完成字节与字符的转换, 所以数据中含有中文就会出现乱码,可以通过 req.setCharacterEncoding("utf-8")方法来对提交的数据根据指定的编码方式重新做编码处理。这个方法要写在其他请求方法之前,解决因输入中文,请求乱码的问题

 req.setCharacterEncoding("utf-8");

获取请求头信息

  • 根据请求头中的 key 获取对应的 value。
String header = req.getHeader("Accept-Language");
  • 获取请求头中所有的 key,该方法返回枚举类型。获得所有key之后,可以通过getHeader()获得值
 Enumeration<String> headerNames =req.getHeaderNames();
 PrintWriter out = resp.getWriter();
  while (headerNames.hasMoreElements()){
            String key =  headerNames.nextElement();
            String value = req.getHeader(key);
            out.println("key:"+key+" Value:"+value+"<br/>");

        }

HttpServletRequest 对象的生命周期

当有请求到达 Tomcat 时,Tomcat 会创建 HttpServletRequest 对象,并将该对象通过参数 的方式传递到我们 Servlet 的方法中,当处理请求处理完毕并产生响应后该对象生命周期结束。

补充 请求方式get和post区别

get

向指定的资源发出“显示”请求。GET 请求中会将请求中传递的数据包含在 URL 中并在 浏览器的地址栏中显示。GET 请求传递数据时要求数据必须是 ASCII 字符。GET 请求可以被 浏览器缓存。
GET - 从指定的服务器中获取数据

post

向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包 含在请求体中。POST 请求传递数据时,数据可以试试 ASCII 字符也可以是字节型数据,默认 为字符型。POST 请求默认情况下不会被浏览器所缓存。
POST - 提交数据给指定的服务器处理

区别

  • get在浏览器回退时是无害的,而post会再次提交请求(get方式不会发送请求,post的则会向url发出请求)
  • get产生的url地址可以被bookmark(添加到书签),post的不行
  • get请求会被浏览器主动缓存(cache),而post不会,除非手动
  • get请求只能进行url编码,而post支持多种编码
  • get请求参数会被完整保留在浏览器历史记录中(因为是在url中传递的,而历史记录保存的是url),而post中参数不会被保留(只会保留post请求参数,而提交数据不会保留)
  • get请求在url中传送有长度限制,而post没有。对参数的数据类型get只支持ASII字符,而post可以是字符和字节
  • post更安全,因为get参数直接暴露在url上,因此不能用来传递敏感信息
  • get参数通过url传递,post放在请求体中(request body)
posted @ 2020-09-09 23:33  笑忘舒  阅读(154)  评论(0编辑  收藏  举报