我在 jsp 中有一个 Web 表单,应该从 servlet 获取值,但它打印出空值。我在下面包含了 jsp 和 servlet 的代码。谁能告诉我如何修复下面的代码,以便它打印出请求对象中的值而不是打印 null?
这是 my.jsp 的代码:
<jsp:useBean id="errors" scope="request" type="java.util.Map" class="java.util.HashMap" />
<form method="post">
<table>
<tr>
<td width=302>
</td>
<td width=250>
<table>
<tr>
<td width=150 align="right">tha: </td>
<td><input type="text" name="tha" value="c3t" size="15" />
<%if (errors.containsKey("tha")) {out.println("<span class=\"error\">" + errors.get("tha") + "</span>");}
else{out.println(request.getParameter("tha"));}%>
</td>
</tr>
<tr>
<td width=150 align="right">min: </td>
<td><input type="text" name="min" value="0" size="15" />
<% if (errors.containsKey("min")) {out.println("<span class=\"error\">" + errors.get("min") + "</span>");}
else{out.println(request.getParameter("min"));}%>
</td>
</tr>
<tr>
<td width=150 align="right">max: </td>
<td><input type="text" name="max" value="2*pi" size="15" />
<% if (errors.containsKey("max")) {out.println("<span class=\"error\">" + errors.get("max") + "</span>");}
else{out.println(request.getParameter("max"));}%>
</td>
</tr>
<tr>
<td></td>
<td align="right">
<input type="submit" name="submit-button" value="Click To Plot" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
这是 servlet 的代码:
public class PlotPolarServlet extends HttpServlet{
private RequestDispatcher jsp;
public void init(ServletConfig config) throws ServletException {
ServletContext context = config.getServletContext();
jsp = context.getRequestDispatcher("/WEB-INF/jsp/my.jsp");
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
jsp.forward(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException{
Map<String, String> errors = validate(req);
if (!errors.isEmpty()){
jsp.forward(req, resp);
return;
}
resp.sendRedirect("my");
}
public static Map<String, String> validate(HttpServletRequest req){
HashMap<String, String> errors = new HashMap<String, String>();
req.setAttribute("errors", errors);
String tha = req.getParameter("tha");
if (tha == null || tha.trim().length() == 0){
errors.put("tha", "tha required.");
}
String min = req.getParameter("min");
if (min == null || min.trim().length() == 0){
errors.put("min", "min required.");
}
String max = req.getParameter("max");
if (max == null || max.trim().length() == 0){
errors.put("max", "max required.");
}
return errors;
}
}
最佳答案
我最初误读了你的问题。问题是当参数输入正确时,而不是当出现错误时。 else
此代码的一部分
<% if (errors.containsKey("min")) {out.println("<span class=\"error\">" + errors.get("min") + "</span>");}
else{out.println(request.getParameter("min"));}%>
除了 null
之外无法打印任何内容因为,在此请求中,没有带有这些键的参数。
一个 HttpServletResponse#sendRedirect(String)
返回 302 HTTP 状态代码,这将使您的浏览器向 String 参数描述的位置发送新的 HTTP 请求。请求参数不会出现在新请求中(处理请求后,请求上下文/范围将被清除)。您需要将它们放入 session 属性中。
/*
for every parameter, put it in the session attributes
*/
req.getSession(true).setAttribute("myParam", req.getParameter("myParam"));
resp.sendRedirect("my");
这称为闪存作用域和闪存属性,可以按照说明来实现 here使用 servlet Filter
。您基本上可以存储要在两个请求之间重用的属性,然后删除它们。
至于编辑:
除非您在编辑时错误地复制粘贴了代码
<td><input type="text" name="yX" value="cx" size="15" />
<%if (errors.containsKey("yX")) { // errors doesn't contain yX as a Key, it contains imageParam1
out.println("<span class=\"error\">" + errors.get("yX") + "</span>");
}else{out.println(request.getParameter("yX"));}%> // will print the value of the request parameter with key yX
</td>
你是POST
调用一个名为 yX
的参数,但正在寻找imageParam
。您的doPost()
方法将创建一个 errors
请求属性,然后 forward
(而不是 sendRedirect
)。
errors.put("imageParam1", "imageParam1 required.");
...
if (!errors.isEmpty()){
jsp.forward(req, resp);
return;
}
不是 yX
。因此,else
被评估并且参数存在,因为它是相同的请求。
更多说明
在您的 my
中示例:
- 如果您没有输入必填字段,则
doPost()
方法被调用,errors
map 已填充,您的代码执行jsp.forward(req, resp);
它使用相同的请求,并且参数在jsp渲染时可用。 - 如果您输入了所有必填字段,
doPost()
称为resp.sendRedirect("my");
被执行。这会导致您的浏览器发送带有新参数/属性的新 GET HTTP 请求。这会导致doGet()
被调用来处理新请求,该请求转发到您的 jsp。原始请求参数不包含在此请求中,因此没有任何内容可显示,因此null
当else{out.println(request.getParameter("min"));
被渲染。
在您的 myother
中例如,由于 <input>
之间的差异jsp 中的参数名称和您在 servlet 中查找的参数名称,您将得到完全不相关的结果,正如我上面所解释的。忽略这个servlet。它没有做你认为正确的事情。
关于java - servlet 将空值打印到 jsp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18062008/