【问题标题】:How to pass from one jsp to another jsp storing data in session with Spring如何从一个jsp传递到另一个jsp在与Spring的会话中存储数据
【发布时间】:2016-10-05 16:46:36
【问题描述】:

我想知道如何将sessionAttributesModelAttributes 用于我下面描述的具体场景:

我有两个带有表单域的 jsp 页面。当我在第一个 jsp 页面中输入表单字段值并单击下一步时,这些填充的表单字段值应该存储在会话属性中,而不是存储在数据库中。移动到第二个 jsp 页面后,再次填写表单字段并单击提交。这次第一个 jsp(来自控制器中的 session 属性)和第二个 jsp 页面表单字段值应该保存在 DB 中。

请指导我如何实现这一目标。如果有任何示例代码,那将是很大的帮助。

【问题讨论】:

    标签: java spring spring-mvc spring-data spring-form


    【解决方案1】:

    在您的控制器中,将值设置为会话属性。以下是示例代码。

    @RequestMapping("/testing")
    @Controller
    public class TestController {
    @RequestMapping(method = RequestMethod.GET)
    public String testMethod(HttpServletRequest request){
        request.getSession().setAttribute("name", "value");
        return "testJsp";
      }
    }
    

    要在 JSP 中访问相同的使用

    ${sessionScope.name}.

    【讨论】:

    • :- 我在我的 jsp 页面中使用
      并且字段在表单标签之后。 ".setAttribute("name", "value");" 的值是什么这里 ?我需要在我的 jsp 页面中在哪里添加“${sessionScope.name}”?
    • 我可以在这里使用@sessionAttribure 代替request.getSession().setAttribute("name", "value");用于保存完整的表单字段值?
    【解决方案2】:

    只需将您的数据存储在 HttpSession 上。您可以使用这样的函数来管理来自控制器的会话信息:

      private static HttpSession getSession() {
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
       return attr.getRequest().getSession();
      }
    
      public static void clear(String name) {
        getSession().removeAttribute(name);
      }
    
      public static void clear() {
        getSession().invalidate();
      }
    
      public static Object load(String name) {
        return getSession().getAttribute(name);
      }
    
      public static void store(String name, Object value) {
        getSession().setAttribute(name, value);
      }
    

    你可以从jsp访问会话:

    <%= session.getAttribute("attributeName") %>
    

    或与

    ${requestScope.attributeName}
    

    您不需要使用 Spring 来实现这一点。 HttpSession 是 J2EE 标准。在上面的代码中,Spring 用于通过 this 以静态方式进入会话

    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
    

    要获得会话,您只需要访问 HttpRequest。

    【讨论】:

      【解决方案3】:

      Spring MVC 文档对此进行了介绍:

      http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-sessionattrib

      @Controller
      @RequestMapping("/step1")
      @SessionAttributes("myModelObject")
      public class ControllerOne{
      
          @GetMapping
          publid String loadForm(ModelMap modelMap){
              //presence of class level @SessionAttributes puts this is session
              modelMap.addAttribute("myModelObject", new MyModelObject());
              return "form1";
          }
      
          @PostMapping
          //model attribute retrieved from session
          public String handleSubmit(@ModelAttribute("myModelObject") MyModelObject myModelObject){
              return "/step2";
          }
      }
      
      @Controller
      @RequestMapping("/step2")
      public class ControllerTwo{
      
          @GetMapping
          publid String loadForm(){
              return "form2";
          }
      
          @PostMapping
          //model attribute retrieved from session
          public String handleSubmit(@ModelAttribute("myModelObject") MyModelObject myModelObject, SessionStatus sessionStatus){
              //process
      
              //clear down session 
              //http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/support/SessionStatus.html
              sessionStatus.setComplete();
      
              return "nextView"
          }
      }
      

      另外,Spring Web Flow 对多步骤表单有更高级的支持:

      http://projects.spring.io/spring-webflow/

      【讨论】:

        猜你喜欢
        • 2014-03-02
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 2012-09-02
        • 2012-05-16
        • 1970-01-01
        相关资源
        最近更新 更多