我遇到了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。该怎么办? (顺便问一下,有足够的信息吗?)
答案 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以使代码更易于阅读。