当前位置: 首页 > 知识库问答 >
问题:

Spring3MVC:在MVC控制器方法参数中公开会话范围的bean

江英卓
2023-03-14

为了一致性和简单性,我想在我的控制器周围传递一个会话范围的域bean,但这似乎不可能。希望有人能提出建议。

问题:会话范围的bean可以作为MVC控制器参数公开吗

这里似乎有一个注释:@SessionAttributes(“myBean”),但是它只维护一个控制器级别的作用域。

我希望避免与HttpSession交互,而是通过控制器一致地传递域对象图。这似乎是一个相当标准的要求。

这有以下好处:

  • 可测试性-只需注入bean进行测试,而不必模拟Httpsession
  • 抽象-避免Servlet模型的问题和业务问题

以下是当前配置:

@Controller
@SessionAttributes("customer")
public class LoginController {

   @Inject Customer customer;

   @RequestMapping(value = "/login", method = RequestMethod.GET)
   public String welcome(Customer customer) {
         ...
         return "loginDetailsView";
   }

   public String processLogin(@Valid Customer customer, BindingResult bindingResult) {
         ...
         if (bindResult.hasErrors()) {
             return "loginDetailsView";
         else {
             return "homePageView";
         }
   }

“Customer”会话bean是一个常规的POJO,使用XML配置的aop代理(CGLIB),允许将会话范围的bean注入到单例(控制器和服务类)中:

<beans:bean id="customer" class="com.mypackage.domain.Customer" scope="session">
            <aop:scoped-proxy proxy-target-class="true"/>
</beans:bean>

下面的问题实际上是相同的,但是没有一个答案不涉及到Spring3核心框架的扩展。

Spring的设计师是否故意忽略了这一点?我的意图是使用域模型来支持表单,而不使用“表单bean”和一层映射器。

有人能建议一种方法/或指出这是否是糟糕的做法吗?

定制解决方案的先前问题:

如何使用SpringMVC将会话属性作为方法参数(参数)传递

请注意:尝试最小化对Spring框架的依赖性并使用注释支持esp JSR-303等将采用任何OOTB解决方案-请不要建议自定义扩展。

共有1个答案

汪典
2023-03-14

如果您希望这样做,SpringMVC可以将应用程序上下文的bean公开给视图层。

例如,可以指示InternalResourceViewResolver公开上下文中的每个bean,或者只公开指定的bean。看看ExposeContextBeanSatAttribute和ExposeContextBeanNames属性。

例如,假设您想将bean beanA和beanB公开给JSP。您可以在您的上下文中声明视图解析器,如下所示:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="exposedContextBeanNames">
      <list>
         <value>beanA</value>
         <value>beanB</value>
      </list>
   </property>
</bean>

或者,只公开每个bean:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="exposeContextBeansAsAttributes" value="true"/>
</bean>
 类似资料:
  • HttpSession 对象必须被限定在应用(或 servlet 上下文)级别。底层的机制,如使用 cookie 建立会话,不同的上下文可以是相同,但所引用的对象,包括该对象中的属性,决不能在容器上下文之间共享。 用一个例子来说明该要求: 如果 servlet 使用 RequestDispatcher 来调用另一个 Web 应用的 servlet,任何创建的会话和被调用 servlet 所见的必须

  • 问题内容: 我有 我以这种方式传递profileJson: 但是我的profileJson对象具有所有空字段。我应该怎么做才能使spring解析我的json? 问题答案: 这可以通过自定义编辑器完成,该编辑器将JSON转换为UserProfile对象: 这是为了在控制器类中注册编辑器: 这是使用编辑器解组JSONP参数的方法:

  • 我有一个带有范围注释的简单控制器。 和简单的jsp页面 但当我试图运行这段代码时,我一无所获。结果为空。我不想使用用户的单个bean,也不想将HttpSession的对象传递给controller中的方法或HttpServletRequest对象,以从中检索会话。使用一些注释(SessionAttributes除外)从我的控制器向jsp传递对象,有什么解决方案吗?

  • 问题内容: 我有一个User类: 和一个控制器类: 我使会话无效,以便下次我进入/ users时,我得到另一个用户。由于用户的会话范围,我期望使用其他用户,但是我得到的是同一用户。我在调试模式下进行了检查,它与内存中的对象ID是相同的。我的bean声明为: 我是春季新手,所以我显然做错了什么。我希望每个会话有一个User实例。怎么样? 问题答案: 这是预期的行为。当标记带有代理的bean时,将为其

  • 我编写了一个会话范围的托管bean,用于在domino xpages应用程序中缓存sesion用户特定的信息,如下代码所示: 然后,我在faces配置中声明了它,使其成为会话范围的bean: 在测试bean时,我通过#{NBUser.fullUserName}使用它,它并不总是返回当前domino http会话上下文的用户,例如,我首先由用户“user1”登录并注销,然后由user2登录,bean