둘 이상의 서블릿 사이에 변수 또는 객체를 공유하려면 어떻게해야합니까?
-
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 간의 객체/데이터를 공유하는 데 사용될 수 있습니다. 그렇지 않으면 동시성을 염두에 두어야합니다.