【问题标题】:Getting ATG session scoped nucleus from Spring controller从 Spring 控制器获取 ATG 会话范围的核心
【发布时间】:2014-09-16 19:44:00
【问题描述】:

我一直在努力在 Spring 控制器中查看 ATG 配置文件。

一开始,我认为可以通过这样定义读取this document从spring控制器获取atg配置文件。

<bean name="/Profile" class="atg.nucleus.spring.NucleusResolverUtil"
    factory-method="resolveName" singleton="false">
  <constructor-arg value="/atg/userprofiling/Profile"/>
</bean>

但是,我查看了另一个 atg documentation,发现如果不通过 atg DAF 流水线,则无法使用像 /atg/userprofiling/Profile 这样的会话范围的 neclues。

注意:当您将自己的 servlet 添加到 servlet 管道时,请注意 请注意,您无法访问会话对象,直到 SessionServlet 定位或创建它。因此,如果您将 servlet 添加到 需要访问会话对象的管道,请确保您的 servlet 出现在 SessionServlet 之后的管道中。

因此,我尝试为 spring servlet 设置PageFilter,如下所示。

<!--  ATG Services -->
<!--  any request starting with /services must be through ATG DAF pipe lining  -->
<filter-mapping>
    <filter-name>PageFilter</filter-name>
    <url-pattern>/services/*</url-pattern>
</filter-mapping>

<!--  The following can be annotated, but we need to upgrade to servlet 3 -->
<servlet>
   <servlet-name>HelloService</servlet-name>
   <servlet-class>com.my.services.HelloService</servlet-class>
</servlet>

<servlet-mapping>
   <servlet-name>HelloService</servlet-name>
   <url-pattern>/services/hello</url-pattern>
</servlet-mapping>    

但是,它失败了。原因是springController不是Servlet,所以不能在ATG daf pipelining的末尾。

如果我使用简单的HttpServletDynamoServlet,我可以访问用户个人资料。

但是,我确实需要使用 Spring Framework,因为我的公司想要使用它。 另一个原因是我们在 servlet2.3,我真的很想使用 Spring 注释。

问题是;

  1. 有没有办法不通过 DAF 流水线从 Spring 控制器获取 atg 会话范围的 necleus?

  2. 和JSP页面一样,有没有办法在ATG daf流水线结束时设置一个spring控制器?

【问题讨论】:

  • 您是否考虑过通过开箱即用的网络服务访问或公开个人资料?我已经看到许多尝试在 ATG 中实现所谓的真正 MVC,所有这些都导致了一个痛苦的世界,并且几乎不可能升级 ATG。 DAF 管道是 ATG 的基础,因此绕过是有风险的,例如它有 XSS 过滤等。我真的建议你重新考虑你的策略。

标签: java oracle spring-mvc atg atg-dynamo


【解决方案1】:

我在这里发布我找到的解决方案

  1. 有没有办法在不通过 DAF 流水线的情况下从 Spring 控制器获取 atg 会话范围的 necleus?

    没有。我们需要通过 ATG DAF 流水线来获得会话范围的核心。

  2. 和JSP页面一样,有没有办法在ATG daf流水线结束时设置一个spring控制器?

    YES!!!,除了现有的 PageFilter Mapping 之外,我们可以让 Spring DispatcherServlet 在 ATG DAF 管道的末端代替直接的 servlet 映射。

以下是我的web.xml

.... 

<filter>
    <filter-name>PageFilter</filter-name>
    <filter-class>atg.filter.dspjsp.PageFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>PageFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>PageFilter</filter-name>
    <url-pattern>/spring/*</url-pattern>
</filter-mapping>

....

<!-- Use spring DispatcherServlet with annotations i.e @Controller, etc -->
<servlet>
   <servlet-name>spring</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
   <servlet-name>spring</servlet-name>
   <url-pattern>/spring/*</url-pattern>
</servlet-mapping>

这可能不是理想的答案,但至少它有效。

【讨论】:

    【解决方案2】:

    在应用程序范围的 ApplicationContext 中使用工厂方法并不总是按预期工作。

    您是否考虑过使用 Delivery Cube Common Component Resolver 类?

    https://github.com/deliverycube/deliverycube-common

    【讨论】:

    • 您的 Spring Web 应用程序应部署为 ATG 模块中的 WAR,并应在 Web 应用程序中定义页面过滤器和 Servlet。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多