2011-04-09 9 views
1

줄무늬 응용 프로그램 컨텍스트 내에서 인스턴스 변수를 만드는 방법을 찾으려고합니다. 손으로 코드화 된 서블릿을 사용하면서 Servlet의 init() 메소드에서 수행 할 일. 문제는 응용 프로그램에 액세스 할 때마다 ActionBean의 인스턴스가 생성되므로 actionBean의 변수가 여러 번 생성된다는 것입니다. 스트라이프가 ServletContext을 통해 ActionBeanContext.getServletContext()으로 전화를 걸려 고 합리적인 장소를 얻으려고했지만 거기에서 init() 메서드에 액세스하여 코드를 작성하는 방법이 없습니다.줄무늬의 인스턴스 변수

의견이 있으십니까?

+0

그냥 응용 프로그램 다양한 변수를 만드는 방법을 묻지 않니? (서블릿의'init()'메소드에서 보통 그렇게한다). 인스턴스 변수와는 꽤 다릅니다. – BalusC

+0

안녕하세요 Balus, 실제로, 당신은 줄무늬에 응용 프로그램 넓은 변수를 배치합니까, 난 아직도 찾고있다 – JBoy

답변

1

ActionBeanContext도 줄무늬 응용 프로그램 컨텍스트입니다. 이 컨텍스트는 사용자 정의 할 수 있으며 원하는 내용을 포함 할 수 있습니다. 일부 예제 코드 :

<init-param> 
     <param-name>ActionBeanContext.Class</param-name> 
     <param-value>my.app.CustomActionBeanContext</param-value> 
    </init-param> 

당신은 할 수 있습니다 :

package my.app; 

public class CustomActionBeanContext extends ActionBeanContext { 
    public CustomActionBeanContext() { 
    super(); 
    } 

    public MyObject getMyObject() { 
     return (MyObject) getServletContext().getAttribute(“myObject”); 
    } 

    // Alternative solution without ServletContextListner 
    private static MyObject2 myObject2; 
    static { 
    myObject2 = new MyObject2(); 
    } 

    public MyObject2 getMyObject2() { 
     return myObject2; 
    } 
} 

Stripes context factory은 당신이 web.xml의 줄무늬 필터는 init-PARAM를 추가 할 필요가 ActionBeanContext 사용자 지정을 사용하려면 알려

Public class MyServletContextListener implements ServletContextListener { 
@Override 
    public void contextInitialized(ServletContextEvent event) { 
    event.getServletContext().setAttribute("myObject", new MyObject()); 
} 

예하는 ActionBean :

SerlvetContextListener을 추가하여 서버 시작시 개체를 초기화
public class MyAction implements ActionBean { 
    private CustomActionBeanContext context; 

    @Override 
    public CustomActionBeanContext getContext() { 
    return context; 
    } 

    @Override 
    public void setContext(ActionBeanContext context) { 
    this.context = (CustomActionBeanContext) context; 
    } 

    @DefaultHandler 
    public Resolution view() { 
    MyObject myObject = getContext().getMyObject(); 
    // doing something usefull with it.. 
    } 
} 

대체 솔루션, 내 의견 superiour 솔루션에서 (singleton가) 당신의 actionbeans에 객체를 주입하기위한 dependency injection 프레임 워크를 사용하는 것입니다. 줄무늬 구성 여기 예를 참조하십시오 : Injecting Stripes ActionBeans with Guice DI

+0

안녕하세요, KDeveloper 및 thx 조언, 전날 사건을 닫는 것을 잊어 버렸습니다. 사실 getContext(). getServletContext(). setAttribute (key, value);와 같은 서블릿 컨텍스트에서 필요한 객체를 삽입하는 것으로 실제로 해결되었습니다. – JBoy

+0

그런 경우에는 setAttribute가 쓰레드에 안전하지 않다는 것을 잊지 마라. 동기화 된 코드에서 속성을 설정/가져와야한다. 그래서 ServletContextListener를 요청 전에 실행하는 것이 더 안전하다. – Kdeveloper

0

줄무늬별로는 아니지만 표준 서블릿 API를 사용하면 ServletContextListener을 구현하고 contextInitialized() 방법으로 작업을 수행합니다. <listener>web.xml에 등록하면 (또는 이미 Java EE 6을 사용 중일 때 @WebListener을 사용하여 주석을 추가하면) webapp가 시작될 때 실행됩니다.

@Override 
public void contextInitialized(ServletContextEvent event) { 
    event.getServletContext().setAttribute("somename", new SomeObject()); 
} 

${somename}에 의해 ServletContext#getAttribute() 모든 행동 콩에 EL에서 사용할 수 이쪽으로.

+0

Thx, 그 잠재적으로 솔루션처럼 보입니다, 문제는 "어디서"구현 cintextInitialized(), 나는 줄무늬 응용 프로그램에 들어갈 위치를 알 수없는 ActionBeans 만 포함되어 있기 때문에 이것이 서블릿에서 수행되어야한다고 가정합니다. Stripes는 시작할 때 하나의 서블릿 인 DispatcherServlet을로드하지만, 접근 할 수없는 – JBoy

+0

은 'ServletContextListener' 구현에 있습니다. – BalusC

+0

내가 지금하려고하는 것은 getServletContext(). setAttribute ("", o)를 ActionBeanContext에서 호출하는 것이지만, null, thats so something, 컨테이너가 자동으로 ServletContext를 초기화한다. – JBoy

0

@JBoy을, 당신은 그의 조언을

<listner> 
    <listner-class> 
     www.test.com.MyListner 
    </listner-class> 
</listner> 

아래에 감사 KDeveloper처럼 web.xml 파일에 ServletContextListner의 구현을 지정해야합니다. 나는 또한 해결책을 찾고 있었다. 그의 블로그에서 정보를 찾았습니다

내가 발견 한 방법이 하나 더 있습니다. 이를 위해 당신이 위의 구성을 지정은 web.xml에 그 후 "RuntimeConfiguration"클래스를

public class MyConfiguration extends RuntimeConfiguration { 
    @Override 
    public void init() { 
     getServletContext.setAttribute("myObject",new MyObject); 
     super.init(); 
    } 
} 

를 서브 클래스해야합니다.

<init-param> 
    <param-name>Configuration.Class</param-name> 
    <param-value>www.test.com.MyConfiguration</param-value> 
</init-param> 

또한 KDeveloper에서 설명한대로 ActionBeanContext의 하위 클래스를 만들어야합니다. ActionBeans에서 객체를 가져 오는 것

이것은 나의 발견이다. 나는 그것이 작동하고있는 것을 알았다. 그러나 부작용이 있는지 여부는 알 수 없습니다. 그것이 있으면; 제발 ..