如何在重定向后保留请求参数?

时间:2016-12-22 09:59:21

标签: spring spring-mvc http-request-parameters

当我发送一个空输入的表单时,我试图解决一个错误。

这是我的方法:

@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。

提前谢谢。

谢谢

2 个答案:

答案 0 :(得分:3)

请求参数仅适用于一个请求。 您进行重定向,这意味着您再次发出新请求&#34;。

您应该将其添加到重定向:

return "redirect:/gestion.html?section=Configuration&panel=4&ouvrir=modifier&idTypeOuverture="+idParam;

答案 1 :(得分:3)

虽然之前的答案已被接受,但我只是为了您的信息而添加此答案。

您也可以使用带有和不带FlashAttributes的RedirectAttributes

在发布重定向之前,post方法应该将RedirectAttributes作为参数

这些属性将作为请求参数传递

查看我的代码示例,看看它是否有用

方式1:

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

    .....
    return "redirect:requestInfoSuccessRedirect";
     }

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

方式2: 无论在flash属性中添加什么数据都将添加到会话

只有在重定向成功之前它才会在会话中

在重定向上,从会话中检索数据并将其添加到Model for new Request。

仅在重定向成功后,才会删除数据

    @RequestMapping(value={"/requestInfo.htm",method=RequestMethod.POST)
    public String requestInfoPost(@ModelAttribute("requestInfoData")   
    RequestInfoData requestInfoData,BindingResult result, 
    RedirectAttributes redirectAttributes,SessionStatus status)
    {   

    .......

    redirectAttributes.addFlashAttribute("requestInfoData",  
    requestInfoData);


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