spring 重定向后如何保存请求参数?

ovfsdjhp  于 12个月前  发布在  Spring
关注(0)|答案(3)|浏览(91)

我试图解决一个错误,当我发送一个空输入的表单。
这是我的方法:

@RequestMapping(value = "/modifier.html", method = RequestMethod.POST)
public String modifier(ModelMap map, @ModelAttribute("FormObject") FormObject formObject, BindingResult result, HttpServletRequest req) {

    formObject.setModif(true);
    String idParam = req.getParameter("idTypeOuverture");

    if (result.hasErrors()) {
        return "redirect:/gestion.html?section=Configuration&panel=4&ouvrir=modifier";
    } else {
        //Instructions
}

字符串
当有错误(空输入)时,控制器重定向到此链接以告诉用户纠正错误。问题是当我检查这里的参数时,它们看起来是正确的(id,name ...),但在下面的方法中id变为null:

@Override
public ModelAndView dispatcher(HttpServletRequest request, HttpServletResponse response) throws RorException {

    Map<String, Object> myModel = (Map<String, Object>) request.getAttribute(EnumParam.R_MY_MODEL.getKey());

    Enumeration<?> keys = request.getParameterNames();
    while (keys.hasMoreElements()) {
        String paramName = (String) keys.nextElement();
        String value = request.getParameter(paramName);
        myModel.put(paramName, value);
    }

    GlobalSession globalSession = (GlobalSession) getApplicationContext().getBean(Utilities.GLOBALSESSION_BEAN_REF);
    myModel.put("module", globalSession.getModule().getKeyMessage());
    String section = request.getParameter("section");

    // This instruction returns null
    String idForm = request.getParameter("id");
    id = Integer.parseInt(idForm);
    // This instruction returns NumberFormatException
    ObjectForm of = getForm(id);
    // ...
}


好吧,我不知道为什么参数id在重定义后改变了?你有什么想法吗?我试着在第一个方法中重定义参数,但仍然得到相同的NFE。
先谢谢你了。
谢谢你

mwngjboj

mwngjboj1#

虽然前面的答案是可以接受的,我只是为了你的信息而添加这个答案。
你也可以使用RedirectAttributes,也可以不使用FlashAttributes。在发出重定向之前,post方法应该将RedirectAttributes作为参数。这些属性将作为请求参数传递。看看我的代码示例,看看它是否有帮助。
方式一:

@RequestMapping(value={"/requestInfo.html"}, method=RequestMethod.POST)
public String requestInfoPost1(
    @ModelAttribute("requestInfoData") RequestInfoData requestInfoData,
    BindingResult result,
    RedirectAttributes redirectAttributes, 
    SessionStatus status
) { 
       // some logic
       redirectAttributes.addAttribute("name", requestInfoData.getName());
       redirectAttributes.addAttribute("age", requestInfoData.getAge());
       // some logic
       return "redirect:requestInfoSuccessRedirect";
}

@RequestMapping("requestInfoSuccessRedirect")
public String requestInfoSuccessRedirect()
{
    return "requestInfoSuccess";
}

字符串
方式二:在flash属性中添加的任何数据都将被添加到会话中它将仅在会话中直到重定向成功重定向时,从会话中检索数据并添加到模型中以进行新请求。只有在重定向成功后,才删除数据

@RequestMapping(value={"/requestInfo.htm"}, method=RequestMethod.POST)
public String requestInfoPost(
    @ModelAttribute("requestInfoData") RequestInfoData requestInfoData,
    BindingResult result, 
    RedirectAttributes redirectAttributes,
    SessionStatus status
) { 
    // some logic
    redirectAttributes.addFlashAttribute("requestInfoData",  
    requestInfoData);
    // some logic
    return "redirect:requestInfoSuccessRedirect";
}

@RequestMapping("requestInfoSuccessRedirect")
public String requestInfoSuccessRedirect()
{
    return "requestInfoSuccess";
}

2nbm6dog

2nbm6dog2#

request参数只用于一个请求。你做了一个重定向,这意味着你做了另一个新的“请求”。
您应该将其添加到重定向:
第一个月

rur96b6h

rur96b6h3#

使用RedirectAttributes是正确的方法,正如@Rucki Saini发布的那样。
如果你想传递所有的属性,而不必单独列出每个属性,这里有一个优雅的方法:

@GetMapping("/upload/**")
public String redirectSubUrlsToMain(RedirectAttributes redirectAttributes, HttpServletRequest req) {
    redirectAttributes.addAllAttributes(req.getParameterMap());
    return "redirect:/upload";
}

字符串

相关问题