HttpServletRequest说明

本文详细介绍了HTTP协议的基础概念,包括其如何构建在TCP/IP协议之上,以及在Web应用中如何进行HTTP请求与响应。重点讲解了HTTP请求的组成部分,如请求行、消息头等,并提供了实际案例说明。

Http协议是建立在tcp/ip协议之上的一种超文本传输协议

在web应用中可以分为http请求和http响应

①http请求
GET /test/hello.html HTTP/1.1  请求行
Accept:*/*
Referer:http://localhost:8080
Referer:告诉服务器,我来自哪里,该消息头
常用于防止盗链.
Accept-Encoding:gzip
可以接受gzip压缩后的数据
Accept-language:..
浏览器支持的语言
User-Agent:
告诉服务器,浏览器的内核
Cookie:
Host:http://www.sohu.com:80
我要找的主机是
Connection:Keep-Alive 保持连接,发完数据,我不关闭连接
Date:        浏览器发送该http请求的时间

内容
Http的请求部分:
基本结构:
请求行
消息头
空行
内容
特别说明:并不是每一次请求的消息头都一样
关于Referer的实际案例(防止盗链)
 String referer=request.getHeader("Referer");
 if(referer==null) {
     response.sendRedirect("url");
   }

Http的请求都封装在HttpServetRequest中,可以从request.getRequestXXX中获取请求的相关参数如下

           //HttpServletRequest的getRequestURL()方法获
            //完整的URL地址
            String url=request.getRequestURL().toString();
            out.print("url="+url);
            //URI
            String uri=request.getRequestURI();
            out.print("uri="+uri);
            //QueryString(获取请求的子串)
            String queryString=request.getQueryString();
            out.println("queryString="+queryString);
            //getRemoteAddr()请求方的ip地址
            String remoteAddr=request.getRemoteAddr();
            out.println("remoteAddr="+remoteAddr);
            //getRemoteHost()//请求方的主机名,如果该客户机没有
            //在DNS上注册,返回ip,如果注册了,返回机器名
            String remoteHost=request.getRemoteHost();
            //获取客户机的端口
            int port=request.getRemotePort();
            //获取服务器的端口
            int serverport=request.getLocalPort();
            //getHeader(通过消息头,来获取信息)
            //比如要获取http请求的Host
            String host=request.getHeader("Host");
            //getHeaderNames方法,需求(请把http请求的消息全部打印出来)
            //1.得到所有的头
            Enumeration<String> headers=request.getHeaderNames();
            while(headers.hasMoreElements()) {
                //取出消息头的名字
                String headername=headers.nextElement();
                System.out.println(headername+":"+request.getHeader(headername));
            }






<think>嗯,用户的问题是如何在Java的HttpServletRequest中检查某个参数是否存在。我需要仔细想一想怎么回答。 首先,根据我之前的知识,Servlet API中的HttpServletRequest对象有几个方法可以用来获取参数,比如getParameter()和getParameterValues()。记得用户提到过,当处理多值参数时应该使用getParameterValues(),而单值参数则用getParameter()。不过,这里的问题是要检查参数是否存在,不管它有没有值。 可能的方法之一是使用getParameter(),如果返回null,说明参数不存在。例如,如果调用request.getParameter("param"),如果返回null,那参数不存在;否则存在。不过这可能会有问题,因为参数可能存在但值为空字符串,这时候getParameter()会返回空字符串而不是null。所以需要区分参数不存在和参数存在但值为空的情况。 另外,还有一种方法是使用getParameterMap(),然后检查参数名是否存在于map的键集合中。例如,request.getParameterMap().containsKey("param"),如果返回true,说明参数存在。这种方法可能更准确,因为它直接检查参数名是否存在,而不关心具体的值是什么。不过需要确认getParameterMap()返回的是一个不可变的map,是否可能为null,或者是否总是返回非null的map。根据Servlet规范,getParameterMap()应该返回一个不可变的map,即使没有参数,也应该返回空的map,而不是null。所以检查containsKey应该是安全的。 然后,用户可能需要处理的情况是,参数存在但可能没有值,或者参数不存在。这时候要根据具体需求来判断。比如,如果只是想知道参数名是否存在,不管有没有值,那么用getParameterMap().containsKey()更合适。如果参数存在但值为空字符串,getParameter()会返回空字符串,而参数不存在时返回null,这样可以用这个来区分两种情况。 再举个例子,如果用户提交的表单中有一个名为"username"的参数,但用户没有填写,这时候getParameter("username")返回空字符串,而如果这个参数根本不存在于请求中,则返回null。因此,检查参数是否存在应该使用getParameterMap().containsKey(),而检查参数是否有值则需要用getParameter()是否为null或者空字符串。 另外,用户可能提到的引用中提到,处理多值参数应该用getParameterValues()。如果参数可能存在多个值,那么即使存在多个值,getParameterMap().containsKey()也会返回true。所以,无论是单值还是多值参数,这种方法都适用。 总结下来,正确的做法应该是使用request.getParameterMap().containsKey("paramName"),这样可以准确判断参数是否存在,而不管其值如何。而如果用户想同时检查参数是否存在并且是否有值,可能需要组合使用不同的方法,比如先检查是否存在,再检查值是否非空。 最后,需要确保回答的结构清晰,分步骤说明,并提供代码示例,这样用户更容易理解。同时,根据用户的要求生成相关问题,比如参数存在但值为空的情况如何处理,或者如何获取多值参数等。</think>### 检查 HttpServletRequest 中参数是否存在的方法 在 Java Servlet 中,若需检查 `HttpServletRequest` 是否包含某个参数,可通过以下步骤实现: #### 1. **使用 `getParameterMap()` 方法** - `HttpServletRequest` 的 `getParameterMap()` 方法返回包含所有参数的 `Map<String, String[]>` 对象。此方法会明确反映参数是否存在,即使参数值为空数组或空字符串。 - 示例代码: ```java boolean exists = request.getParameterMap().containsKey("paramName"); ``` 若 `exists` 为 `true`,则表示参数存在;否则参数未传入请求[^1]。 #### 2. **使用 `getParameter()` 方法(需谨慎)** - `getParameter("paramName")` 会返回参数值的字符串形式。若返回 `null`,表示参数不存在;若返回空字符串,则表示参数存在但值为空。 - 示例代码: ```java String value = request.getParameter("paramName"); if (value != null) { // 参数存在(可能为空字符串) } else { // 参数不存在 } ``` - **注意**:此方法无法区分“参数不存在”和“参数存在但值为空字符串”的情况,需根据业务需求选择。 #### 3. **处理多值参数** - 若参数可能包含多个值(如复选框数据),应使用 `getParameterValues("paramName")`。若返回 `null`,表示参数不存在;否则返回包含所有值的数组。 - 示例代码: ```java String[] values = request.getParameterValues("paramName"); if (values != null) { // 参数存在(可能包含空值) } ``` ### 完整示例 ```java protected void doGet(HttpServletRequest request, HttpServletResponse response) { String paramName = "targetParam"; // 方法1:通过 getParameterMap() 判断 if (request.getParameterMap().containsKey(paramName)) { System.out.println("参数存在"); String[] values = request.getParameterValues(paramName); // 进一步处理多值或单值 } else { System.out.println("参数不存在"); } // 方法2:通过 getParameter() 判断(不推荐用于存在性检查) if (request.getParameter(paramName) != null) { System.out.println("参数存在(但可能值为空字符串)"); } } ``` ### 关键区别 - **参数存在性**:优先使用 `getParameterMap().containsKey()`,因为它直接检查参数名是否存在于请求中,与值无关。 - **参数值处理**:若需区分“参数不存在”和“参数存在但值为空”,需结合 `getParameter()` 或 `getParameterValues()`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值