【问题标题】:MVC view redirection with request parameter passed传递请求参数的 MVC 视图重定向
【发布时间】:2020-06-25 16:09:59
【问题描述】:

我有一个很奇怪的提议。我正在研究“旧版”应用程序。表单提交不是通过 ajax 处理的,而是发送到另一个视图。我需要处理后端发生的错误,但他们真的不希望将任何内容更改为 REST。

我走了这么远。想象一下,表单被发送到前端查看。这是后端 http 控制器。

 @RequestMapping(value = "/some/route", method = RequestMethod.POST)
    public ModelAndView editProfile(@ModelAttribute("model") @Validated Model model,
            BindingResult result,
            Principal principal) throws JsonProcessingException {
    ModelAndView mav = new ModalAndView();
    ...
    try{
       someFunctionCall()
       ...
    } catch(Exception e) {
       mav.setViewName("redirect:anotherView?error="+e.getMessage());
       return mav;
    }
    mav.setViewName("redirect:anotherView");
    return mav;
}

另一个视图是相同的,但只有我能想象的是检查 url 参数中的错误。由于他们希望将错误文本显示在该视图上,因此我需要传递它。

在 JSP 中我想分配它

var errorMsg = "${error}";

但看起来 JS 的字符串格式有问题

org.springframework.jdbc.UncategorizedSQLException: 
 Error updating database.  Cause: java.sql.SQLException: [Teradata Database] [TeraJDBC 16.20.00.12] [Error 6706] [SQLState HY000] The string contains an untranslatable character.
 SQL: {CALL P_someMapper_someFnc(...)}
 Cause: java.sql.SQLException: [Teradata Database] [TeraJDBC 16.20.00.12] [Error 6706] [SQLState HY000] The string contains an untranslatable character.
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [6706]; [Teradata Database] [TeraJDBC 16.20.00.12] [Error 6706] [SQLState HY000] The string contains an untranslatable character.; nested exception is java.sql.SQLException: [Teradata Database] [TeraJDBC 16.20.00.12] [Error 6706] [SQLState HY000] The string contains an untranslatable character.);

这是在开发者控制台中并抛出此错误:

Uncaught SyntaxError: Invalid or unexpected token

我知道这是非常糟糕的方法,但我需要处理它。而且我不是真正有经验的 Java 人。但是谁能告诉我什么是最好的解决方案而不使用 REST 并且仍然能够处理来自 $(form).submit 的错误?

提前致谢

更新

我忘记了“anotherView”中的代码以及我如何处理它。

@RequestMapping(value = "anotherView", method = {RequestMethod.GET, RequestMethod.POST})
public ModelAndView listProfiles..., HttpServletRequest req) {
        String error = req.getParameter("error");
        ModelAndView mav = new ModelAndView();
        
        if (error != null && !error.isEmpty()) {
            mav.addObject("error", error);
        }
        mav.setViewName("whatever");
        return mav;
}

查看jsp文件中的js是什么

【问题讨论】:

    标签: javascript java spring model-view-controller


    【解决方案1】:

    好的,您需要的是 flash 属性,因为您将响应重定向到另一个视图,

     @RequestMapping(value = "/some/route", method = RequestMethod.POST)
    public ModelAndView editProfile(@ModelAttribute("model") @Validated Model model,
            BindingResult result,
            Principal principal,RedirectAttributes redirectAttrs) throws JsonProcessingException {
    ModelAndView mav = new ModalAndView();
    ...
    try{
       someFunctionCall()
       ...
    } catch(Exception e) {
       mav.setViewName("redirect:anotherView");
       redirectAttrs.addFlashAttribute("error", e.getMessage());
       return mav;
    }
    mav.setViewName("redirect:anotherView");
    return mav;
    

    }

    *自从您更新问题后,我已经更新了代码。

    【讨论】:

    • 对不起,只是因为我写得很快并删除了特定的视图名称和功能。我编辑了代码。问题是错误代码在那里。但我无法以某种方式解析它。
    • put 不是 ModelAndView 类的有效方法
    • 是的,对不起。我在最后一分钟改变了它, addObject() 是你应该使用的。请再次检查我的答案。
    • 还是一样。但我在“另一个视图”中收到错误。字符串错误 = req.getParameter("error");这给了我价值
    • 请清楚地提出问题并添加所有必要的代码部分以便我们理解,现在检查我的答案。自从您更改问题后,我已对其进行了更新。
    【解决方案2】:

    好的。实际上,我通过将其添加到隐藏输入来解决它:

    <input type="hidden" id="error-msg" value="${error}" />
    

    当我尝试简单地将其分配给 JS 变量时,它看起来只是一些解析错误

    var error = '<c:out value="${error}"/>';
    

    var error = "${error}"
    

    但是隐藏的输入方法有效,然后从 document.getElementById('error-msg).value 中取值就可以了。

    【讨论】:

      猜你喜欢
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 2020-07-09
      • 2019-04-25
      • 2011-06-16
      • 1970-01-01
      相关资源
      最近更新 更多