在异常后使用用户输入的数据重新显示表单的建议方法是什么?

时间:2015-08-16 02:26:27

标签: spring-mvc exception-handling user-input

学习Java和Web开发我正在编写一个个人应用程序,其中包含用于输入配料,说明和各种其他领域的配方。主要工具集是:

  • 带有JSP表单的Spring 3.6.4
  • Hibernate 4.3.10

完成表单可能需要5-10分钟,因此如果存在任何类型的DataAccessException,我希望能够使用之前的条目重新显示表单。

SO和其他地方的大多数帖子建议只显示SQL错误的错误页面,但他们没有提到用户不得不再次在表单上重新输入数据(由于使用的数据结构的特殊性)在表单上,​​从错误页面点击后退按钮将不会显示所有输入的数据。)

一个可行的简单方法是在控制器POST方法中捕获错误,如下所示:

    try {
        recipeService.addRecipe(recipe);
    }
    catch (DataAccessException ex)
    {
        model.addAttribute("dataError", "DataAccessException caught");
        model.addAttribute("ingredientList", recipeService.getIngredients(recipe));         
        return "recipe/addRecipe";
    }

dataError消息仅用于开发,稍后将替换为更有意义的消息。

我用这种方法看到的问题是该方法必须最终深入挖掘实际错误,并确定重新显示表单是否有意义,例如,约束违规=“修复导致错误的这一部分数据”数据库连接丢失=“抱歉,无法与数据库通信 - 稍后再试”。无论我多么彻底地确定“重新显示”的例外,我怀疑我会抓住它们(双关语)。

如果我改为删除try / catch并显示错误页面,那么我不知道如何使用错误页面中输入的数据返回到表单,因为“recipe”modelattribute不可用于这个方法:

    @ExceptionHandler(DataAccessException.class)
    public ModelAndView handleDataAccessException(DataAccessException ex) {
    ModelAndView view = new ModelAndView("/common/error");

    logger.info("Recipe: DataAccessException exception!");

    String errorMsg = ExceptionUtils.getRootCauseMessage(ex);

    view.addObject("errorMessage", errorMsg);
    return view;
}

我还没有尝试过这个,但是将表单数据序列化到服务器上的文件是一种可接受的方法吗?在错误页面上,我可以添加一条消息:“点击此处重新显示您的食谱,然后重试”。必须有一种方法可以让redisplay方法知道要检索哪些序列化数据并将其发送到表单,这可能是不可能的(对序列化还不够熟悉)。

我发现这篇关于在客户端保存表单数据的帖子:What is the best way to locally store user-entered data on a web page?。这是与我正在尝试的不同的上下文,但它提到localStorage和IndexedDB这可能是一个更好的解决方案?

我提前为这篇文章的篇幅道歉,如果这已在其他地方得到解答 - 我找不到任何解决这个具体问题(或任何博客)的问题。任何帮助将不胜感激。

修改

我相信我可以将ModelAttribute和SessionAttribute添加到控制器中,如下所示:

@SessionAttribute("recipe")
public class RecipeController {

    @ModelAttribute
    public Recipe initializeRecipe () {
        return new Recipe();
    }

....

但如果我正确理解这些注释(?),这只会在会话期间有效。如果输入的数据可以在以后的会话中检索,例如,一旦数据库备份,那就更好了。

0 个答案:

没有答案