Java 将属性从会话复制到请求范围

Java 将属性从会话复制到请求范围,java,jsp,servlets,Java,Jsp,Servlets,我想将名为idNumbers的int[]从会话范围复制到请求范围。 下面的代码不起作用,因为每当试图从请求范围检索属性时,我的控制器中都会出现空指针异常。我觉得我既不理解范围,也不以错误的方式设置属性 jsp代码 <c:if test="${sessionScope.idNumbers!=null}"> // this line is OK and session scope contains the idNumbers(checked) <% request.setAtt

我想将名为idNumbers的int[]从会话范围复制到请求范围。 下面的代码不起作用,因为每当试图从请求范围检索属性时,我的控制器中都会出现空指针异常。我觉得我既不理解范围,也不以错误的方式设置属性

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>

您正在当前请求中设置request属性,而不是表单提交时的新请求


使用一个填充了会话值的隐藏表单字段,或者直接从会话中提取它——如果您已经有了它,我看不出有什么令人信服的理由将它复制到其他地方。

为什么要将更大范围内的可用内容复制到更窄的范围内?我忘了将@RequestParam(“activityId”)int[]ActivitiesNumber包括在内,对于控制器。我希望重用这个方法(因为它提供了多个页面),而不向方法本身添加额外的代码。如果我有@RequestParam注释,则该参数应作为必需参数提供。如果我不提供它,那么我将得到错误的Http请求。你说得对,我刚刚意识到这一点。我这样做是因为我想重用控制器方法(因为它被几个页面使用)。最初它有@RequestParam(“activityId”)int[]activitiesNumbers,您可以看到,如果我不从请求中提供activityId,我将返回错误的请求400或500 http错误。
@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";
 }