无法从Servlet到JSP获取错误消息(验证)

时间:2013-12-18 14:19:30

标签: java jsp servlets

我遇到了Servlets / JSP的问题。我试图在Java Servlet类中验证JSP的HTML字段,并从Servlet中将该(可能的)错误消息带回JSP。即使我正在学习教程,我也无法解决这个问题。

的index.jsp:

   <form action="addWine" method="post">
        <p>
            <input type="text" name="name"/>          
            <input type="submit" value="submit">
            <span class="error">${messages.error}</span>
        </p>
    </form>


AddingWines.java

public class AddingWines extends HttpServlet {

...

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


   Map<String, String> messages = new HashMap<String, String>();
   request.setAttribute("messages", messages);

    String name = request.getParameter("name");
    if(name.trim().isEmpty()){
        messages.put("name", "give a name");
    }

    //No errors in HTML field

    if (messages.isEmpty()) {
        messages.put("noErrors", String.format("Welcome blabla"));
    }

    request.getRequestDispatcher("greatSucceess.jsp").forward(request, response);


的web.xml

    <servlet>
    <servlet-name>AddingWines</servlet-name>
    <servlet-class>Servlets.AddingWines</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>AddingWines</servlet-name>
    <url-pattern>/addWine</url-pattern>
</servlet-mapping>

NetBeans没有抛出任何错误。即使HTML字段为空,它也会指向greatSucceess.jsp。该怎么办? (顺便问一下,有足够的信息吗?)

4 个答案:

答案 0 :(得分:1)

在您的servlet中,您将每个请求重定向到greatSuccess.jsp,请参阅最后一行:

request.getRequestDispatcher("greatSucceess.jsp").forward(request, response);

您应该按如下方式更改代码:

if (messages.isEmpty()) {
    request.getRequestDispatcher("greatSucceess.jsp").forward(request, response);
} else {
    // show page with form
}

答案 1 :(得分:0)

如果您检查messages中的greatSucceess.jsp参数,那么

request.setAttribute("messages", messages);
设置邮件之后应该添加

,而不是之前因为你总是传递一个空的Hashmap。

如果您希望将请求转发给另一个jsp,如果存在错误,那么您应该添加验证条件,而不是总是将响应重定向到同一页面。

我会做这样的事情,例如:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Map<String, String> messages = new HashMap<String, String>();
    String name = request.getParameter("name");
    if (name.trim().isEmpty()) {
        messages.put("name", "give a name");
    }

    //handle messages in each jsp separately
    if (messages.isEmpty()) {
        messages.put("noErrors", String.format("Welcome blabla"));
        request.setAttribute("messages", messages);
        request.getRequestDispatcher("greatSucceess.jsp").forward(request, response);
    }else{
        request.setAttribute("messages", messages);
        request.getRequestDispatcher("form.jsp").forward(request, response); 
    } 
}

答案 2 :(得分:0)

我怀疑这是问题所在: 你有这条线: $ {} messages.error 但是,消息是Map对象。 Map对象没有名为getError()的函数,因此message.error不正确。您需要以另一种方式访问​​消息中的数据。

答案 3 :(得分:0)

上一张海报提到:
request.setAttribute(“messages”,messages); 应该在设置邮件后添加,而不是之前因为您总是传递空的Hashmap。
我相信可能不正确。即使在将数据添加到消息之前通过setAttribute添加消息,但仅在调用dispatch时才会对消息的引用不可用。即使在调用setAtribute之后,对程序中要添加数据的消息的引用仍然有效。无论如何,我同意上一张海报,即应首先将数据添加到消息中,然后调用setAttribute以使代码更易于阅读。