request.getParameter("key")获取不到值得原因

客户端发送请求代码片段:

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;、
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;

public Map HttpPost(String url, Map parameter) {
	try {
		org.apache.http.client.HttpClient httpClient = null;
		if (StringUtils.isBlank(url)) {
			throw new RuntimeException("url为空!");
		}
		if (url.trim().startsWith("https")) {
			httpClient = getHttpsClient(new DefaultHttpClient());
		} else {
			httpClient = new DefaultHttpClient();
		}
		
		HttpResponse httpResponse = null;
		HttpPost httpPost = new HttpPost(url);

		
		//标准的表单提交
        List list = new ArrayList();
        list.add(new BasicNameValuePair("key1", parameter.get("key1")));
        list.add(new BasicNameValuePair("key2", parameter.get("key2")));
        list.add(new BasicNameValuePair("requestData", parameter.get("requestData")));
        httpPost.setEntity(new UrlEncodedFormEntity(list, "UTF-8"));

        //判断是否使用代理
		if ("YES".equals(isProxy)) {
			int mid = proxyHost.indexOf("|");
			String proxyHostStr1 = "";
			String proxyHostStr2 = "";
			if (mid == -1) {
				proxyHostStr1 = proxyHost;
			} else {
				proxyHostStr1 = proxyHost.substring(0, mid);
				proxyHostStr2 = proxyHost.substring(mid + 1);
			}
			try {
				HttpHost proxy = new HttpHost(proxyHostStr1, proxyPort);
				httpClient.getParams().setParameter(
						"http.route.default-proxy", proxy);
				httpResponse = httpClient.execute(httpPost);
			} catch (Exception e) {
				HttpHost proxy = new HttpHost(proxyHostStr2, proxyPort);
				httpClient.getParams().setParameter(
						"http.route.default-proxy", proxy);
				httpResponse = httpClient.execute(httpPost);
			}
		} else {
			httpResponse = httpClient.execute(httpPost);
		}

		HttpEntity returnEntity = httpResponse.getEntity();
		if (returnEntity != null) {
			String resStr = EntityUtils.toString(returnEntity, responseCharSet);
			return JacksonUtils.getMapFromJson(resStr);
		}
	} catch (Exception e) {
		Log.error("服务调用时出现异常", e);
	}
	return null;
}
private org.apache.http.client.HttpClient getHttpsClient(
		org.apache.http.client.HttpClient httpclient) throws Exception {
	SSLContext sslContext = SSLContext.getInstance("TLS");
	sslContext.init(null, new TrustManager[] { tm }, null);
	SSLSocketFactory sslSocketFactory = new SSLSocketFactory(sslContext,
			SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
	httpclient.getConnectionManager().getSchemeRegistry()
			.register(new Scheme("https", 443, sslSocketFactory));
	return httpclient;
}

服务端接受请求代码(采用原始servlet方式接受)

 protected void doPost(HttpServletRequest request,
		HttpServletResponse response) {

	String serviceName = (String) request.getParameter("key的名称");
	String responseJson = null;
	/**
	*  中间去做一些业务处理,把结果赋值给responseJson 
	*/
	response.setContentType("application/json");
	response.setCharacterEncoding("UTF-8");
	PrintWriter out = response.getWriter();
	out.print(responseJson);
	out.flush();
	out.close();
}

上面的客户端和服务端通过的是 标准的表单提交的方式。这种方式才可以使用request.getParameter(“key的名称”)获取到值。
之前犯得错误是发送表单数据使用的是
StringEntity stringEntity=new StringEntity(request,requestCharSet);
httpPost.setEntity(stringEntity);
设置的表单数据,这种方式在服务端通过request.getParameter(“key的名称”)是根本获取不到数据的。这种方式发送的是个消息体,而且消息体是个字符串,不是表单的key:value 格式的,所以获取不到数据。这种方式发送的数据应该使用@RequestBody或者让springmvc给你自动组装成参数 的方式去接受。

总结:request.getParameter(“key的名称”) 这种方式获取数据必须是标准的表单提交 方式才可以取到值。(注: application/x-www-form-urlencoded )

enctype=”application/x-www-form-urlencoded”是默认的编码方式,当以这种方式提交数据时Servlet的API提供了对这种编码方式解码的支持,只需要调用ServletRequest 类中的getParameter()方法就可以得到表单中提交的数据。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您在 Servlet 中使用 `request.setAttribute()` 方法设置了请求属性,但是在 JSP 页面中无法获取到这些属性,可能有以下几个原因: 1. 请求转发时属性名称不一致:如果您在 Servlet 中使用 `request.setAttribute(&quot;name&quot;, value)` 方法设置了请求属性,但是在 JSP 页面中使用 `${otherName}` 表达式来获取属性,则无法获取到正确的。请确保在请求转发时属性名称一致,例如: ``` // Servlet 中设置属性 request.setAttribute(&quot;name&quot;, value); // 请求转发到 JSP 页面 request.getRequestDispatcher(&quot;page.jsp&quot;).forward(request, response); ``` ``` <!-- JSP 页面中获取属性 --> ${name} ``` 2. 属性作用域不一致:如果您在 Servlet 中设置了请求属性,但是在 JSP 页面中使用了错误的作用域名称,则无法获取到正确的。默认情况下,`request.setAttribute()` 方法设置的属性作用域为请求作用域(request scope),这意味着属性只在当前请求中有效。如果您在 JSP 页面中使用了错误的作用域名称,例如 `${sessionScope.name}` 或 `${applicationScope.name}`,则无法获取到正确的。请确保在 JSP 页面中使用正确的作用域名称,例如 `${requestScope.name}` 或 `${name}`。 3. 请求转发前未设置属性:如果您在请求转发前设置了请求属性,但是在 JSP 页面中无法获取到这些属性,可能是因为在请求转发前未设置属性。请确保在请求转发前设置请求属性,例如: ``` // Servlet 中设置属性 request.setAttribute(&quot;name&quot;, value); // 请求转发到 JSP 页面 request.getRequestDispatcher(&quot;page.jsp&quot;).forward(request, response); ``` 需要注意的是,在实际应用中,您可能需要根据具体的需求和上下文环境来选择适当的方法来设置和获取请求属性。如果您遇到了其他问题或有其他疑问,请提供更多的上下文信息,以便我们更好地理解您的需求和代码环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值