如何在 Spring MVC 中管理错误消息
Posted
技术标签:
【中文标题】如何在 Spring MVC 中管理错误消息【英文标题】:How to manage error message in Spring MVC 【发布时间】:2014-02-05 03:04:18 【问题描述】:我是 Spring MVC 的新手。我的 abc 页面只有一个提交按钮。单击提交按钮时,将调用位于 xyzController 内的 abcHandler。 只是想知道如何实现这种情况。
-- 如果发生错误,它应该返回一些消息。 -- 它应该留在同一页,对我来说是它的 abc 页。
我已经尝试过了。我面临的问题是,我收到警报消息“你必须有东西......”, 但它正在导航到错误页面意味着一个空白页面。这不应该发生。我想显示消息并留在同一页面上。 如何使用 Spring MVC 轻松实现。 请提出一些想法。
public class xyzController extends MultiActionController implements InitializingBean
public ModelAndView abcHandler(HttpServletRequest request,HttpServletResponse response)throws Exception
// session
HttpSession session = request.getSession(true);
String abc = "";
if(abc != "")
else
String error = "You must have xyzzzzzz";
return new ModelAndView("2.0/error", "downloaderror", error);
return new ModelAndView();
我的error.jsp是这样的
<!DOCTYPE html>
<html>
<head>
<script src="abc/js/jquery-1.9.0.min.js"></script>
</head>
<body>
<c:if test="$not empty downloaderror">
<script>
alert("You must have something...");
</script>
</c:if>
</body>
</html>
【问题讨论】:
您的abc != ""
比较将始终解析为true
。将其更改为"".equals(abc)
或abc.isEmpty()
你知道它不能是null
。
你说你正在提交一些东西。如果您使用的是表单,则应使用BindingResult
进行验证并通过<form:errors path="property" />
显示错误
【参考方案1】:
验证失败时不要返回错误页面,而是返回同一页面,因此您在 else 块中的代码应该是
else String error = "You must have xyzzzzzz";
return new ModelAndView("2.0/error", "downloaderror", abc);
并且还将错误消息存储在模型映射中,针对“errormsg”之类的键,并在您的 abc 页面上检查该键,然后打印消息。
【讨论】:
【参考方案2】:像这样在控制器方法中添加错误标志
public ModelAndView abcHandler(HttpServletRequest request, HttpServletResponse response)throws Exception
ModelAndView model=new ModelAndView();
model.addObject("error", true);
return model;
在 JSP 中
<!DOCTYPE html>
<html>
<head>
<script src="abc/js/jquery-1.9.0.min.js"></script>
</head>
<body>
<c:if test="$error">
<script>
alert("You must have something...");
</script>
</c:if>
</body>
</html>
【讨论】:
ModelAndView 类型的方法 addAttribute(String, boolean) 未定义。为什么会这样?我使用的是旧版本的 Spring 框架还是什么? 使用addObject方法添加属性参数。 我试过了,我现在收到这个错误:ModelAndView [ModelAndView: materialized View is [null]; model is error=true] servlet 中既不包含视图名称也不包含名称为“XXXXX”的视图对象 您收到此错误是因为您没有设置视图。像这样 model.setView("home"); 为模型对象设置视图。现在这个控制器将搜索 home.jsp 如果存在,否则它会抛出一个异常。 是的,我已经尝试过了,它可以按您的预期工作,但是,我的按钮在表单内,并且表单正在执行调用此 abc 处理程序的操作,并且 url 不同,所以它将空白页。【参考方案3】:您可以自行实现HandlerExceptionResolver。参考本教程:http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
【讨论】:
我试过了,我现在收到这个错误:ModelAndView [ModelAndView: materialized View is [null]; model is error=true] servlet 中既不包含视图名称也不包含名称为“XXXXX”的视图对象【参考方案4】:您可以通过以下方式实现该场景:
import org.springframework.web.servlet.ModelAndView;
public ModelAndView abcHandler(HttpServletRequest request, HttpServletResponse response)throws Exception
ModelAndView model=new ModelAndView();
model.addObject("ERROR_CODE", "Error Occurred");
model.setViewName("page1");
return model;
你的jsp页面如下:
page1.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<body>
<c:if test="$!empty ERROR_CODE ">
<c:out value="$ERROR_CODE "></c:out>
</c:if>
</body>
</html>
【讨论】:
是的,我也尝试过,但它会转到 page1.jsp,这不应该发生。我的要求是,它应该保持在它所在的同一页面中。 我的按钮在表单内,并且表单正在执行调用此 abc 处理程序的操作,并且该 url 不同,因此它将转到空白页面 在视图名称中,您可以提供具有按钮的页面的名称...并且您可以将以上是关于如何在 Spring MVC 中管理错误消息的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC for Rest 服务如何在 Jackson 反序列化错误时自定义错误“消息”?
如何在spring mvc中使用带有freemarker的消息?
如何在没有 if else 的情况下处理 Spring-MVC 项目中的错误?
如何通过在 Spring MVC 中返回自定义错误页面来全局处理 404 异常?