学习Java和Web开发我正在编写一个个人应用程序,其中包含用于输入配料,说明和各种其他领域的配方。主要工具集是:
完成表单可能需要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();
}
....
但如果我正确理解这些注释(?),这只会在会话期间有效。如果输入的数据可以在以后的会话中检索,例如,一旦数据库备份,那就更好了。