2012-01-12 31 views
0

我想从会话范围中复制int []命名idNumbers以请求范围。 下面的代码不工作,因为我试图从请求范围中检索属性时,在我的控制器中收到空指针异常。我觉得我既不是在理解范围,也不是以错误的方式设置财产。从会话复制属性到请求范围

JSP代码

<c:if test="${sessionScope.idNumbers!=null}"> // this line is OK and session scope contains the idNumbers(checked) 
    <% request.setAttribute("activityId", session.getAttribute("idNumbers")); %> 
    <c:set var="activityId" scope="request" value="${sessionScope.idNumbers}"/> 
    <form class="spanFormat" method="post" action="/blablabla"> 
    <p> 
     <input value="Attach" type="submit" style="color: green;" /> 
     <input name="programId" style="display: none;" value="${blabla.programId}" /> 
    </p> 
    </form> 
</c:if> 

控制器代码,在这里,我尝试了不同的方法,但本质上是结果指出这样的参数并没有在要求范围时,它应该存在。

前两个给空值(空),然后空指针异常:

@RequestMapping(value = "/program/set", method = RequestMethod.POST) 
public String setActivitiesForProgram(@RequestParam("activityId") int[] activitiesNumbers, 
     Model model, HttpSession hs, HttpServletRequest hr) 
     throws ServletRequestBindingException { 
    String activityNumber1 = (String) hr.getParameter("activityId"); 
    logger.info(activityNumber1); 

    String activityNumber = (String) hr.getAttribute("activityId"); 
    logger.info(activityNumber); 

    String[] activitiesNumbersss = (String[]) hr.getAttribute("activityId"); 
    logger.info(activitiesNumbersss[0]); 

    String[] activitiesNumberss = hr.getParameterValues("activityId"); 
    logger.info(activitiesNumberss[0]); 

    return "someView"; 
} 
+0

为什么要将更广泛的范围内的某些内容复制到更窄的范围? – 2012-01-12 15:06:07

+0

我忘了为控制器添加@RequestParam(“activityId”)int [] activitiesNumbers。我想重复使用这种方法(因为有多个页面由此提供),而无需向方法本身添加额外的代码。如果我有@RequestParam注释,则参数应该作为强制参数提供。如果我不提供它,那么我会得到不良的Http请求。 – Aubergine 2012-01-12 15:12:49

回答

1

你设置请求属性在当前要求 - 不是一个表单提交发。

使用充满会话值一个隐藏的表单字段,或者只是把它直接对话 - 我看不出一个令人信服的理由某处复制其他如果你已经拥有了它。

+0

你是正确的一千倍,我只是意识到这一点。我已经这样做了,因为我想重新使用控制器方法(就像它使用了几个页面一样)。原来它有@RequestParam(“activityId”)int [] activitiesNumbers,你可以看到如果我不提供activityId从请求我会得到返回BAD REQUEST 400或500 HTTP错误。 – Aubergine 2012-01-12 15:07:50