如何判断servlet中某个参数是否已被“posted”或“geted”?

问题描述 投票:0回答:7

在 ASP 中,有

request.form
request.queryString
属性,但在 Java 中。看起来我们只有一个集合,可以通过
request.getParamaterMap
getParametersNames
getParameterValues
等访问。

是否有某种方法可以判断哪些值已发布以及哪些值已在 URL 中指定?


PS:

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

  • 读取来自查询字符串的变量(获取)
  • 阅读具有特定名称(例如“xml”)的单个帖子。
  • 如果该帖子丢失,请阅读全文(使用
    request.getReader()
    )。

我使用的是tomcat 6。

根据我到目前为止所看到的,如果我发出

request.getReader()
,发布的值将不再出现在
getParamater
集合中,但查询字符串参数仍然存在。

另一方面,如果我发出任何

getParameters
方法,
getReader
返回空字符串。

看来鱼与熊掌不可兼得啊

所以,我想解决方案如下:

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

还有更好的主意吗?

  • PS:有谁知道如何使用相同的方法解析正文 由
    HttpServlet
    使用?
  • PS:这里是解码ASP函数。我可以重写它吗 Java?
  • PS:也找到了(现在没有机器可以测试)

只是为了澄清事情。问题似乎是,使用

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

servlets http-request-parameters
7个回答
34
投票

HttpServletRequest.getMethod():

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

您需要做的就是:

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

我也很困惑为什么你不简单地使用

request.getParameter("somename")
来检索作为请求参数发送的值。无论请求是通过 GET 还是 POST 发送,此方法都会返回参数

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

这比尝试自己解析

getQueryString()

 要简单得多。


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


2
投票
如果您正在编写 servlet,则可以通过是否调用

doGetdoPost 方法来进行区分。

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 }
    

1
投票
为什么不从检查查询字符串参数开始,如果没有看到,假设一个帖子,然后挖掘表单变量?


1
投票
我在过滤器中做了这个,所以也许有一天有人可以使用它。

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

0
投票
我知道它不能解决你的问题,但如果我没记错的话,当使用Struts时,如果你的变量在查询字符串或帖子正文中发送,ActionForm将会被填充。

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

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


0
投票
您可以使用 request.getMethod() 来获取任何 Method。我为此使用 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; }
    
© www.soinside.com 2019 - 2024. All rights reserved.