둘 이상의 서블릿 사이에 변수 또는 객체를 공유하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/123657

  •  02-07-2019
  •  | 
  •  

문제

둘 이상의 서블릿 사이에 변수 또는 객체를 공유 할 수있는 방법이 있는지 알고 싶습니다. "표준"방법을 의미합니다. 나는 이것이 좋은 관행이 아니지만 프로토 타입을 구축하는 더 쉬운 방법이라고 생각합니다.

사용 된 기술에 의존하는지 모르겠지만 Tomcat 5.5를 사용하겠습니다.


간단한 클래스 (공개 속성, 문자열, int 등)의 객체의 벡터를 공유하고 싶습니다. 나의 의도는 DB와 같은 정적 데이터를 갖는 것입니다. 분명히 Tomcat이 중지 될 때 손실 될 것입니다. (단지 테스트를위한 것입니다)

도움이 되었습니까?

해결책

여기서 찾고있는 것은 요청, 세션 또는 응용 프로그램 데이터라고 생각합니다.

서블릿에서는 객체를 요청 객체, 세션 개체 또는 서블릿 컨텍스트 객체에 속성으로 추가 할 수 있습니다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    String shared = "shared";
    request.setAttribute("sharedId", shared); // add to request
    request.getSession().setAttribute("sharedId", shared); // add to session
    this.getServletConfig().getServletContext().setAttribute("sharedId", shared); // add to application context
    request.getRequestDispatcher("/URLofOtherServlet").forward(request, response);
}

요청 객체에 넣으면 요청이 완료 될 때까지 전달되는 서블릿에서 사용할 수 있습니다.

request.getAttribute("sharedId");

세션에 넣으면 앞으로 모든 서블릿이 사용할 수 있지만 값은 사용자에게 연결됩니다.

request.getSession().getAttribute("sharedId");

세션이 사용자의 비 활동에 따라 만료 될 때까지.

당신에 의해 재설정됩니다 :

request.getSession().invalidate();

또는 하나의 서블릿이 범위에서 제거합니다.

request.getSession().removeAttribute("sharedId");

서블릿 컨텍스트에 넣으면 응용 프로그램이 실행중인 동안 사용할 수 있습니다.

this.getServletConfig().getServletContext().getAttribute("sharedId");

제거 할 때까지 :

this.getServletConfig().getServletContext().removeAttribute("sharedId");

다른 팁

3 가지 다른 범위 중 하나에 넣으십시오.

요청 - 요청의 수명이 지속됩니다

세션 - 사용자 세션의 수명이 지속됩니다

응용 프로그램 - ApplCiation이 종료 될 때까지 지속됩니다

당신은 httpservletrequest 변수를 통해 이러한 모든 스코프에 액세스 할 수 있습니다. httpservlet 클래스

의도 된 데이터 사용 범위에 따라 다릅니다.

데이터가 사용자 로그인 정보, 페이지 적중률 등과 같은 사용자 당 사용자별로 만 사용되는 경우 세션 객체를 사용하십시오 (httpservletRequest.getSession (). get/setAttribute (String [, Object])).

여러 사용자 (총 웹 페이지 히트, 작업자 스레드 등)에서 동일한 데이터 인 경우 ServletContext 속성을 사용하십시오. servlet.getServletCongFig (). getServletCongFig (). get/setAttribute (String [, Object])). 이것은 동일한 전쟁 파일/웹 응용 프로그램 내에서만 작동합니다. 이 데이터는 재시작에 따라 지속되지 않습니다.

또 다른 옵션은 상황에 맞는 데이터를 공유합니다 ...

공유-데이터-톰 사이드-콤 캣

  <Context path="/myApp1" docBase="myApp1" crossContext="true"/>
  <Context path="/myApp2" docBase="myApp2" crossContext="true"/>

MyApp1에서 :

  ServletContext sc = getServletContext();
  sc.setAttribute("attribute", "value");

MyApp2에서 :

  ServletContext sc = getServletContext("/myApp1");
  String anwser = (String)sc.getAttribute("attribute");

객체를 httpsession에 넣은 다음 각 서블릿에서 속성 이름으로 참조 할 수 없습니까?

예 :

getSession().setAttribute("thing", object);

... 그런 다음 다른 서블릿에서 :

Object obj = getSession.getAttribute("thing");

부두 로이 작업을 수행하는 방법은 다음과 같습니다.

https://stackoverflow.com/a/46968645/1287091

싱글 톤이 임베디트 부두 서버를 시작하는 동안 싱글 톤이 작성되고 서버 수명에 대한 모든 웹 앱 중에서 공유하는 서버 컨텍스트를 사용합니다. 또한 문맥에 한 명의 작가 만 있다고 가정하면 웹 apps 간의 객체/데이터를 공유하는 데 사용될 수 있습니다. 그렇지 않으면 동시성을 염두에 두어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top