0

我在 jsp 中有一个 web 表单,它应该从 servlet 获取值,但它打印出空值。我在下面包含了 jsp 和 servlet 的代码。谁能告诉我如何修复下面的代码,以便它打印出请求对象中的值而不是打印空值?

这是 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;
    }
}  
4

1 回答 1

2

我最初误读了你的问题。问题在于正确输入参数时,而不是出现错误时。else这段代码的一部分

<% if (errors.containsKey("min")) {out.println("<span class=\"error\">" + errors.get("min") + "</span>");}  
else{out.println(request.getParameter("min"));}%>  

不能打印任何东西null,但因为在这个请求中,这些键没有参数。

AHttpServletResponse#sendRedirect(String)返回一个 302 HTTP 状态代码,这将使您的浏览器向 String 参数描述的位置发送一个新的 HTTP 请求。请求参数将不在新请求中(处理请求后,请求上下文/范围将被清除)。您需要将它们放在会话属性中。

/*
   for every parameter, put it in the session attributes
*/
req.getSession(true).setAttribute("myParam", req.getParameter("myParam"));
resp.sendRedirect("my");

这称为 flash 作用域和 flash 属性,可以按照此处的说明使用 servlet来实现Filter。您基本上存储要在 2 个请求之间重用的属性,然后删除它们。

至于编辑:

除非您在编辑中错误地复制粘贴了代码

<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示例中:

  1. 如果您没有输入必填字段,则doPost()调用该方法,errors填充地图并且您的代码jsp.forward(req, resp);使用相同的请求,并且在呈现 jsp 时参数可用。
  2. 如果您输入了所有必填字段,doPost()则会调用并resp.sendRedirect("my");执行 。这会导致您的浏览器发送带有新参数/属性的新 GET HTTP 请求。这会导致doGet()被调用来处理新请求,该请求转发到您的 jsp。原始请求参数不包含在此请求中,因此没有任何内容可显示,因此null何时else{out.println(request.getParameter("min"));呈现。

在您的myother示例中,由于 jsp 中的参数名称与您在 servlet 中查找的参数名称之间的差异<input>,您会得到完全不相关的结果,我在上面已经解释过。忽略此 servlet。它没有做你认为正确的事情。

于 2013-08-05T15:35:57.217 回答