JavaWeb

JavaWeb-007-ServletRequest详解

2017-10-24  本文已影响65人  53b3f4658edc

简介

获取请求行的相关信息

GET /lampbrother/servlet/RequestURI?param1=a&param2=b HTTP/1.1

获取网络连接信息

获取请求头信息

获取请求参数

请求域属性

测试代码

login.jsp

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Insert title here</title>
    </head>
    <body>
        <form action="LoginServlet"  method="get">          <!-- action里面的值,就是对应的Servlet的url-pattern值 -->
            user:<input type="text" name="user"/>
            password:<input type="password" name="password"/>
            
            <br />                  
            interest:                                       <!-- 这里就存在一个name,多个取值的情况 -->
            <input type="checkbox" name="interest" value="reading"/>读书
            <input type="checkbox" name="interest" value="shopping"/>逛街
            <input type="checkbox" name="interest" value="watchTV"/>看电视
            <input type="checkbox" name="interest" value="writeCode"/>写代码
            
            <input type="submit" value="submit"/>
        </form>
    </body>
</html>

LoginServlet.java

package mac.com;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/*
 * ServletRequest:
 *  1.获取用户输入内容
 *      1.1.public String   getParameter(String name):根据请求参数的name,返回参数值。
 *      1.2.public String[] getParameterValues(String name):根据请求参数的name,返回参数值的数组。
 *      1.3.public Enumeratinon<String> getParameterNames():获取所有的name值。
 *      1.4.public 
 *  2.获取URI(URL = IP + 端口 + URI)(强转成HTTPServletRequest,这是ServletRequest的一个子接口)
 *      2.1.public String getRequestURI():获取请求的URI
 *  3.获取请求方式(强转成HTTPServletRequest,这是ServletRequest的一个子接口)
 *      3.1.public String getMethod():获取请求方式
 *  4.获取查询字符串(强转成HTTPServletRequest,这是ServletRequest的一个子接口)
 *      4.1.public String getQueryString():获取查询字符串(就是URL?后面的那一部分,所以POST请求方式值是null)
 *  5.和Attribute相关的方法,后面写
 *  6.基本上都可以获取,自己去查询API(强转成HTTPServletRequest,这是ServletRequest的一个子接口)
 *      
 */
public class LoginServlet implements Servlet{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public ServletConfig getServletConfig() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getServletInfo() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void init(ServletConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        
    }

    /*
     * public void  service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException:
     * 由 servlet 容器调用,以允许 servlet 响应某个请求。
     * 此方法仅在 servlet 的 init() 方法成功完成之后调用。
     * 应该为抛出或发送错误的 servlet 设置响应的状态代码。
     * servlet 通常运行在可同时处理多个请求的多线程 servlet 容器中。开发人员必须知道要同步对所有共享资源
     * (比如文件、网络连接以及 servlet 的类和实例变量)的访问。有关 Java 中多线程编程的更多信息,可从
     *  the Java tutorial on multi-threaded programming 中获得。
     *  req 包含客户端请求的 ServletRequest 对象
     *  res 包含 servlet 的响应的 ServletResponse 对象
     *  Throws  ServletException: 
     *      如果发生妨碍 servlet 正常操作的异常
     *  Throws  java.io.IOException: 
     *      如果发生输入或输出异常
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        /*
         * 每一次请求都会调用这个方法。
         */
        /*
         * ServletRequest:
         * 定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参
         * 数传递给该 servlet 的 service 方法。
         * ServletRequest 对象提供包括参数名称、参数值、属性和输入流的数据。扩展 ServletRequest 的接口可提供
         * 其他特定于协议的数据,例如 javax.servlet.http.HttpServletRequest 提供的 HTTP 数据。
         */
        
        /*
         * ServletResponse:
         * 定义辅助 servlet 将响应发送到客户端的对象。servlet 容器创建 ServletResponse 对象,
         * 并将它作为参数传递给 servlet 的 service 方法。
         */
        System.out.println("有人在请求我!!!");
        /*
         * ServletReques:封装了请求信息。
         * ServletResponse:封装了请求信息。
         * 他们的实现都是服务器完成的,当服务器调用service方法的时候,会自动的传入这两个各个参数。 
         */
        
        System.out.println("--------------------------------");
        
        /*
         * public String    getParameter(String name):
         * 以 String 形式返回请求参数的值,如果该参数不存在,则返回 null。
         * 请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串
         * 或发送的表单数据中。
         * 只有在确定参数只有一个值时,才应该使用此方法。如果参数可能拥有一个以上的值,则使
         * 用 #getParameterValues。
         * 如果将此方法用于一个有多个值的参数,则返回的值等于 getParameterValues 返回的数组中的第一个值。
         * 如果参数数据是在请求正文中发送的,比如发生在 HTTP POST 请求中,则通过 #getInputStream 或
         *  #getReader 直接读取正文可能妨碍此方法的执行。
         *  name    指定参数名称的 String
         *  return  表示单个参数值的 String
         */
        //1.获取form表单中name所对应的单个输入值
        String user = req.getParameter("user");
        String password = req.getParameter("password");
        System.out.println("user: " + user);
        System.out.println("password: " + password);
        System.out.println("--------------------------------");
        
        /*
         * public String[]  getParameterValues(String name):
         * 返回包含给定请求参数拥有的所有值的 String 对象数组,如果该参数不存在,则返回 null。
         * 如果该参数只有一个值,则数组的长度为 1。
         * name 包含请求其值的参数的名称的 String
         * return   包含参数值的 String 对象数组
         */
        //2.获取form表单中name的多个输入值
        String[] interestValues = req.getParameterValues("interest");
        for( String value : interestValues ) {
            System.out.println("interest: " + value);
        }
        System.out.println("--------------------------------");
    
        /*
         * ublic java.util.Enumeration<E>   getParameterNames()
         * 返回包含此请求中所包含参数的名称的 String 对象的 Enumeration。
         * 如果该请求没有参数,则此方法返回一个空的 Enumeration。
         * return   String 对象的 Enumeration,每个 String 都包含一个请求参数的名称;如果该请求没有参数,
         *          则返回一个空的 Enumeration
         */
        //3.获取所有的name值
        Enumeration<String> names = req.getParameterNames();
        while( names.hasMoreElements() ) {
            String name = names.nextElement();
            System.out.println("names: " + name);
        }
        System.out.println("--------------------------------");
    
        /*
         * public java.util.Map<K, V>   getParameterMap()
         * 返回此请求的参数的 java.util.Map。请求参数是与请求一起发送的额外信息。
         * 对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。
         * return   将参数名称作为键、参数值作为映射值的不可变 java.util.Map。参数映射
         *          中的键的类型为 String。参数映射中的值的类型为 String 数组。
         */
        //4.获取name-values的Map
        //Map
        Map<String, String[]> parameterMap = req.getParameterMap();
        //Keys
        Set<String> keySet = parameterMap.keySet();
        //key
        for( String name : keySet ) {
            //key-values
            String[] values = parameterMap.get(name);
            //key-value
            for( String value : values ) {
                System.out.println(name + ": " + value );
            }
        }
        System.out.println("------------------------------");
        
        /*
         * HttpServletRequest:
         * Implements: ServletRequest
         * Implemented by: HttpServletRequestWrapper
         * 扩展 javax.servlet.ServletRequest 接口,为 HTTP servlet 提供请求信息。
         * servlet 容器创建 HttpServletRequest 对象,并将该对象作为参数传递给 
         * servlet 的 service 方法(doGet、doPost,等等)。
         */
        HttpServletRequest hsr = (HttpServletRequest)req;
        /*
         * public String    getRequestURI()
         * 返回此请求的 URL 的一部分,从协议名称一直到 HTTP 请求的第一行中的查询字符串。
         * Web 容器不会解码此 String。例如:
         * HTTP请求的第一行                       返回的值
         * POST /some/path.html HTTP/1.1        /some/path.html
         * GET http://foo.bar/a.html HTTP/1.0   /a.html
         * HEAD /xyz?a=b HTTP/1.1               /xyz
         * 要使用某个方案和主机重新构造 URL,可使用 HttpUtils#getRequestURL。
         * return   包含 URL 从协议名称一直到查询字符串的那一部分的 String
         */
        //5.获取URI
        String uri = hsr.getRequestURI();
        System.out.println("URI: " + uri);
        System.out.println("URL: " + hsr.getRequestURL());
        //URI: /006_ServletRequest/LoginServlet
        //URL: http://localhost:8080/006_ServletRequest/LoginServlet
        System.out.println("------------------------------");
        
        /*
         * public String    getMethod()
         * 返回用于发出此请求的 HTTP 方法的名称,例如 GET、POST 或 PUT。
         * 返回的值与 CGI 变量 REQUEST_METHOD 的值相同。
         * return   指定用于发出此请求的方法名称的 String
         */
        //6.获取请求方式
        String method = hsr.getMethod();
        System.out.println("method: " + method);
        
        //7.获取查询字符串
        String queryString = hsr.getQueryString();
        System.out.println("QueryString: " + queryString);
        //QueryString: user=mac&password=123&interest=reading&interest=watchTV&interest=writeCode
    }

}

运行结果

微信公众号:JavaWeb架构师 微信公众号:JavaWeb架构师


欢迎加入交流群:451826376


更多信息:www.itcourse.top

完整教程PDF版本下载
上一篇 下一篇

猜你喜欢

热点阅读