• JSP内置对象之request对象【学习笔记】


    request对象是JSP中重要的对象,每个request对象封装着一次用户的请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径。

    一、获取请求头与请求参数

    web应用是请求/响应架构的应用,浏览器发送请求时通常总会附带一些请求头,还可能包含一些请求参数发送给服务器,服务器端负责解析请求头/请求参数的就是JSP或Servlet,而JSP和Servlet取的请求参数的途径就是request。request是httpServletRequest接口的实例,它提供了如下方法来获得请求参数:

      • String getParameter(String paramName) :获取paramName请求参数的值。
      • Map getParameterMap() :获取所有请求参数名和参数值所组成的Map对象。
      • Enumeration getParameterNames() :获取所有请求参数名所组成的Enumeration对象。
      • String[] getParameterValues(String name) : paramName请求参数的值,当该请求参数有多个值时,该方法将返回多个值所组成的数组。

    httpSevletRequest提供如下方法来访问请求头:

      • String getHeader(String name): 获取指定请求头的值
      • java.util.Enumeration<String> getHeaderNames(): 获取所有请求头的名称
      • java.util.Enumeration<String> getHeaderNames(String name):获取指定请求头的多个值
      • int getIntHeader(String name):获取指定请求头的值,并将其转化为整数。


    请求头通常由浏览器自动添加,因此一次请求总是包含若干请求头;请求参数通常需要开发人员控制添加,客户端发送请求参数通常分为两种情况:

    1、GET方式请求:直接在浏览器地址栏输入所发送的请求;提交表单时,该表单对应的form元素没有设置method属性,或设置method属性为get,这几种请求都是GET方式的请求。GET方式请求会将请求参数的名和值转换成字符串,并附加在原URL之后,因此可以在浏览器的地址栏上看到请求参数名和值,GET请求传输的数据量较小,不能大于2KB。

    2、POST方式请求:这种方式通常使用提交表单的方式来发送,且需要设置form元素的method属性为post。POST传输的数据量较大,请求参数大小通常受服务器的限制。POST方式发送的请求参数以及对应的值放在HTML HEADER中传输,用户不能在地址栏上看到请求参数的值,安全性较高。

    代码示例:

      表单页面:form.jsp

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
     2 <%@ page contentType="text/html; charset=utf-8" language="java" errorPage="" %>
     3 <!DOCtype html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     4     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     5 <html xmlns="http://www.w3.org/1999/xhtml">
     6 <head>
     7     <title>收集参数的表单页</title>
     8 </head>
     9 <body>
    10 <form id="form1" method="post" action="request.jsp">
    11 用户名:<br/>
    12 <input type="text" name="name"><hr />
    13 性别:<br />
    14 男:<input type="radio" name="gender" value="男">
    15 女:<input type="radio" name="gender" value="女"><hr />
    16 喜欢的颜色:<br />
    17 红:<input type="checkbox" name="color" value="红">
    18 蓝:<input type="checkbox" name="color" value="蓝">
    19 绿:<input type="checkbox" name="color" value="绿">
    20 来自的国家:<br />
    21 <select name="country">
    22     <option value="中国">中国</option>
    23     <option value="美国">美国</option>
    24     <option value="俄罗斯">俄罗斯</option>
    25 </select><hr />
    26 <input type="submit" value="提交">
    27 <input type="reset" value="重置">
    28 </form>
    29 </body>
    30 </html>
    View Code

      request.jsp

     1 <%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %>
     2 <%@ page import="java.util.*" %>
     3 <!DOCtype html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     4     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     5 <html xmlns="http://www.w3.org/1999/xhtml">
     6 <head>
     7     <title> 获取请求头/请求参数</title>
     8 </head>
     9 <body>
    10 <%
    11 //获取所有请求头的名称
    12 Enumeration<String> headerNames = request.getHeaderNames();
    13 while(headerNames.hasMoreElements()){
    14     String headerName = headerNames.nextElement();
    15     //获取每个请求、及其对应的值
    16     out.println(headerName+"-->"+ request.getHeader(headerName) +"<br />");
    17 }
    18     out.println("<hr />");
    19     request.setCharacterEncoding("utf-8");
    20     //下面依次获取表单域的值
    21     String name = request.getParameter("name");
    22     String gender = request.getParameter("gender");
    23     //如果某个请求参数有多个值,将使用该方法获取多个值
    24     String[] color = request.getParameterValues("color");
    25     String national = request.getParameter("country");
    26 %>
    27 您的名字: <%=name%> <hr />
    28 您的性别: <%=gender%> <hr />
    29 
    30 您喜欢的颜色: <%for(String c :color)
    31     {out.println(c+"");} %> <hr />
    32 您来自的国家:<%=national%> <hr />
    33 </body>
    34 </html>
    View Code

      使用GET方式获得请求参数

      GET请求的获取方式与POST方式一样,不过需要注意的是,页面发送请求时在地址栏增加的请求参数值都是由英文字符组成的,如果请求参数值中包含非西欧字符,需

      要将请求参数重新编码。

      获得GET请求里的中文字符:

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
     2 <%@ page contentType="text/html; charset=utf-8" language="java" errorPage="" %>
     3 <!DOCtype html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     4     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     5 <html xmlns="http://www.w3.org/1999/xhtml">
     6 <head>
     7     <title> 获取包含非西欧字符的GET请求参数 </title>
     8 </head>
     9 <body>
    10 <%
    11 //获取请求里包含的查询字符串
    12     String rawQueryStr = request.getQueryString();
    13     out.println("原始查询字符串:"+ rawQueryStr+"<hr />");
    14     //使用URLDecoder解码字符串
    15     String queryStr = java.net.URLDecoder.decode(rawQueryStr,"utf-8");
    16     out.println("解码后查询字符串为:"+queryStr+"<hr />");
    17     //以&符号分解查询字符串
    18     String[] paramPairs = queryStr.split("&");
    19     for (String paramPair : paramPairs){
    20         out.println("每个请求参数名、值对为:"+paramPair+"<hr />");
    21         
    22         String[] nameValue = paramPair.split("=");
    23         out.println(nameValue[0] +"参数的值是:"+nameValue[1]+"<hr />");
    24     }
    25 %>
    26 </body>
    27 </html>
    View Code

      当然,你也可以在获取请求参数值之后对请求参数值重新编码。

        //获得原始的请求参数
        String rawName = request.getParameter("name");
        //将请求参数值使用ISO-8895-1字符串分解成字节数组
        byte[] rawBytes = rawName.getBytes("ISO-8859-1");
        //将字节数组重新解码成字符串
        String name = new String(rawBytes, "utf-8")

      2、操作request范围的属性

      HttpServletRequest还包含如下两种方法,用于设置和获取request范围的属性。

    •   setAttribute(String attName,Object attValue);
    •   Object getAttribute(String attName);

      3、执行forward或include

      request还有一个功能就是执行forward和include,也就是代替JSP所提供的forward和include动作指令

      getRequestDispatcher(String path).include(ServletRequest request,ServletResponse response);

      getRequestDispatcher(String path).forward(SevletRequest request,ServletResponse response);

      注意:使用request的getRequestDispatcher(String path)方法时,该path字符串必须以斜线开头。

     

  • 相关阅读:
    【判环】Perpetuum Mobile
    【计算几何】Water Testing
    【动态规划】Überwatch
    【规律】Cunning Friends
    【转载】【最短路Floyd+KM 最佳匹配】hdu 2448 Mining Station on the Sea
    【动态规划】Concerts
    【计算几何】The Queen’s Super-circular Patio
    【规律】Farey Sums
    【规律】Growing Rectangular Spiral
    Mancala II
  • 原文地址:https://www.cnblogs.com/freeabyss/p/3251839.html
Copyright © 2020-2023  润新知