如何确定参数是否已从Java“发布”或“发布”?

时间:2009-06-17 22:33:02

标签: java http post get

在ASP中,有request.formrequest.queryString属性,但在Java中。我们似乎只有一个集合,可以通过request.getParamaterMapgetParametersNamesgetParameterValues等进行访问。

是否有某种方法可以判断哪些值已过帐以及哪些值已在网址中指定?


PS:

我想要实现的是制作一个可以处理以下情况的页面

  • 读取来自querystring(get)
  • 的变量
  • 阅读具有特定名称的单个帖子(例如“xml”)。
  • 如果该帖子丢失,请阅读全身(使用 request.getReader())。

我正在使用tomcat 6.

根据我到目前为止所看到的情况,如果我发出request.getReader(),则getParamater集合中不再显示已发布的值,但仍然存在查询字符串参数。

另一方面,如果我发出任何getParameters方法,getReader将返回空字符串。

好像我不能吃蛋糕也吃。

所以,我想解决方案是:

  • 使用getReader阅读正文。
  • 查看xml帖子是否存在(缺点,我必须手动解析正文。
  • 如果是,请获取http消息正文并删除“xml =”部分。
  • 如果不是,那么,只是得到身体。
  • 通过request.getParameter
  • 读取查询字符串参数

有更好的主意吗?

  • PS:有人知道如何使用相同的方法解析身体 由HttpServlet使用?
  • PS:Here是解码ASP函数。我要把它重写一下 爪哇?
  • PS:还found(现在没有机器进行测试)

只是为了澄清事情。问题似乎是使用getParameter获取发布的值以及通过URL传递的值,请考虑以下示例:

<%@page import="java.util.*"%>
<%
  Integer i;
  String name;
  String [] values;

  for (Enumeration e = request.getParameterNames(); e.hasMoreElements();) {

    name = (String) e.nextElement();
    values = request.getParameterValues( name );

    for ( i=0; i < values.length; i ++ ) {
      out.println( name + ":" + values[i] + "<br/>" );
    }
  }
%>

<html>
<head><title>param test</title>
</head>
<body>
  <form method="post" action="http://localhost:8080/jsp_debug/param_test.jsp?data=from_get">
    <input type="text" name="data" value="from_post">
    <input type="submit" value="ok">
  </form>
</body>
</html>

此代码的输出是

data:from_get
data:from_post

...

似乎为了找到哪个参数来自哪里,我必须检查request.getQueryString

7 个答案:

答案 0 :(得分:25)

HttpServletRequest.getMethod()

  

返回发出此请求的HTTP方法的名称,例如GET,POST或PUT。与CGI变量REQUEST_METHOD的值相同。

您需要做的就是:

boolean isPost = "POST".equals(request.getMethod());

另外,我真的很困惑为什么你不会简单地使用request.getParameter("somename")来检索作为请求参数发送的值。这种方法returns the parameter regardless of whether the request was sent via a GET or a POST

  

请求参数是随请求一起发送的额外信息。对于HTTP servlet,参数包含在查询字符串或发布的表单数据中。

比尝试自己解析getQueryString()要简单得多。

答案 1 :(得分:5)

没有直接的方法。 非直接 - 检查.getQueryString()

答案 2 :(得分:2)

如果您正在编写servlet,则可以通过调用 doGet doPost 方法来区分。

public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException{

 //Set a variable or invoke the GET specific logic
   handleRequest(request, response);

}

public void doPost(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException{

 //Set a variable or invoke the POST specific logic
 handleRequest(request, response);

}


public void handleRequest(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException{

 //Do stuff with the request

}

答案 3 :(得分:1)

为什么不首先检查查询字符串参数,如果你看不到,请点击帖子,然后挖出表单变量?

答案 4 :(得分:0)

我知道它不能解决您的问题,但如果我没记错,在使用Struts时,如果您的变量是在查询字符串或帖子正文中发送的,则会填充ActionForm。

我找到了RequestUtils类的源代码,也许方法“populate”就是你需要的:

http://svn.apache.org/repos/asf/struts/struts1/trunk/core/src/main/java/org/apache/struts/util/RequestUtils.java

答案 5 :(得分:0)

我是在“过滤器”中完成此操作的,因此也许某天某人可以使用它。

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest sreq = (HttpServletRequest)servletRequest;
    System.out.println(sreq.getMethod());
}

答案 6 :(得分:0)

您可以使用request.getMethod()获取任何方法。我正在为此使用HandlerInterceptor。

检查此代码:

public class LoggingMethodInterceptor implements HandlerInterceptor {

Logger log = LoggerFactory.getLogger(LoggingMethodInterceptor.class);

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
    log.info("[START]  [" + request.getMethod() + "] [" + request.getRequestURL() + "] StartTime: {} milliseconds",
            System.currentTimeMillis());
    return true;
}