【问题标题】:getParameterValues sometimes return null from hidden inputgetParameterValues 有时会从隐藏的输入返回 null
【发布时间】:2018-02-04 23:34:07
【问题描述】:

我有一个网站,当用户提交表单时,我在 .jsp 文件中使用了表单,该操作转到将数据插入数据库的 servlet。有时它可以正常工作而没有任何问题,有时甚至用户提交了没有插入数据库的表单并在第 154 行抛出 NullPointerException。

org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for 
servlet [NewServlet] in context with path [] threw exception
java.lang.NullPointerException
at org.example.test.NewServlet.processRequest(NewServlet.java:154)

index.jsp

<form action="NewServlet" method="post">
<table>
<tbody>
<tr>
<td><sql:query dataSource="${snapshot}" var="subjects1">
SELECT * FROM glf2 ORDER BY RAND()LIMIT 1
</sql:query>
<c:set var="comments_m1" value="${subjects1.rows[0]}"/>
${comments_m1.comment_message} 
</td>
</tr>
<tr>
<td><sql:query dataSource="${snapshot}" var="subjects2">
SELECT * FROM egy ORDER BY RAND()LIMIT 1
</sql:query>
<c:set var="comments_m2" value="${subjects2.rows[0]}"/>
${comments_m2.comment_message} 
</td>
</tr>
</tbody>
</table>
<input type="hidden" name="com" value="${comments_m1.comment_message}"/>
<input type="hidden" name="com" value="${comments_m2.comment_message}"/>
<input type="submit" value="submit">  
</form> 

从数据库中选择并显示在屏幕上的评论消息,用户需要选择一些选项,然后将评论消息和用户选项发送到servelt插入到数据库表中。

newservlet.java根据日志文件getParametersValues中的问题

try (PrintWriter out = resp.getWriter()) {
comment1= req.getParameterValues("com");
for(int z=0; z<comment1.length;z++)
comment[z] = new String(comment1[z].getBytes("ISO-8859-1"),"UTF-8"); 

任何人都可以建议我如何解决这个问题。

【问题讨论】:

  • NewServlet.java中的第154行是comment1= req.getParameterValues("com");吗?
  • 这是下一行 for(int z=0; z
  • @fgo 任何建议都可以帮助我。
  • @BalusC 请提供任何建议。
  • 将隐藏字段的名称命名为 com[] 然后以适当的方式获取值

标签: java mysql jsp servlets


【解决方案1】:

您的查询不一定返回comment_message 不为空的记录。

因此,例如,您可能必须添加一个空检查。

if (comment1 != null) {
    for (int z=0; z<comment1.length;z++)
    comment[z] = new String(comment1[z].getBytes("ISO-8859-1"),"UTF-8"); 
}

【讨论】:

  • 不,它必须返回记录,并且在用户在 JSP 中提交表单之前,该记录在屏幕上显示给用户。
  • 提交前有没有在页面上右键查看页面源的隐藏值?
  • 不,实际上我只是发现客户进入网站并提交表单,但没有插入数据库中,当我与主机检查时,他们向我显示有时会发生的错误。是否与范围有关,是否与同时提交表单的客户数量有关。!!
  • 我只是试图查看源代码,其中有一些值是 select 语句的结果,没有任何 null。
【解决方案2】:

在插入前从参数的值中检查Null,

boolean comBool = comment1.equals("") || comment1.length<0 ;
if(!comBool){
       //Do the insertion into database
}else{
//the value from entered field is null
}

这将解决您的 NullPointerException

【讨论】:

  • 不,它必须包含一个不为空的值。
  • 所以你想要一个不为空的值?
  • 该值实际上不为空,因为它在屏幕上显示为文本不为空。
  • 你试过req.getParameter("com");for(int z=0; z&lt;comment1.length;z++) 的错误只是因为comment1 为空。
  • 我不明白你想要做什么,但是为了临时存储值,你可以使用会话并使用属性名称调用会话来获取值。
【解决方案3】:

您实际上在表单中为两个输入标签使用了相同的名称,因为编译器可能会混淆要获取的值。

您应该检查两个输入标签的命名不同。它应该可以工作。

【讨论】:

  • 我使用相同的名称使用 getPramaterValues 将所有值作为字符串数组获取,我尝试用不同的名称重命名每个输入,然后使用 getParameter 获取每个输入,然后将其存储在数组中,但它仍然会抛出 NullPointerException此评论[z] = new String(comment1[z].getBytes("ISO-8859-1"),"UTF-8"); .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 2018-03-31
  • 2012-08-08
  • 1970-01-01
相关资源
最近更新 更多