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


39

두 개 이상의 서블릿간에 변수 또는 객체를 공유하는 방법이 있는지 알고 싶습니다. "표준"방식을 의미합니다. 나는 이것이 좋은 습관이 아니라 프로토 타입을 만드는 더 쉬운 방법이라고 생각한다. 그것이 사용되는 기술에 의존하는 경우

는 나도 몰라,하지만 난 간단한 클래스의 객체 (단지 공공 속성, 문자열의 벡터를 공유 할 톰캣 5.5


사용합니다, ints 등). 제 의도는 DB와 같은 정적 데이터를 가지는 것입니다. 분명히 Tomcat이 중지되면 손실 될 것입니다. (그냥 테스트 용입니다)

  0

개체/변수의 종류에 따라 크게 다릅니다. 변수가 하나의 클래스에 속해 있으며 액세스 만 하시겠습니까? 그것은 상수입니까? 좋은 예가 될 것입니다. 23 sep. 082008-09-23 20:34:14

  0

이 도움이 되길 바래요 :) 23 sep. 082008-09-23 20:43:24

74

내가 원하는 것은 요청, 세션 또는 응용 프로그램 데이터라고 생각합니다. 당신이 요청 객체, 세션 객체 또는 서블릿 컨텍스트 객체에 속성으로 객체를 추가 할 수 있습니다 서블릿에서

: 당신이 요청 객체에 넣어 경우

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().removeAttribute("sharedId"); 

그것을 사용할 수 있습니다 :

request.getSession().invalidate(); 

또는 하나의 서블릿이 범위에서 제거

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

제거 할 때까지 :

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

ServletContext에 대한 답변을 연장 해주시겠습니까? 23 sep. 082008-09-23 20:57:28

+1

또는'this.getServletConfig(). getServletContext() '대신'getServletContext()'... 10 nov. 152015-11-10 08:55:26

  0

@ 윌리엄 (String)보다 다른 어떤 것을 전달할 수 있나요? 나 자신을 만든 수업의 물건? 26 nov. 152015-11-26 08:35:12

  0

@ Dongong 솔직히 말해서 나는 서블릿으로 작업 한 이후로 오랜 시간이 걸렸지 만, 예를 들어 String을 사용하는 동안 올바르게 기억하면 어떤 객체도 될 수 있습니다. 27 nov. 152015-11-27 17:56:51


1

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

예컨대 : 다음 다른 서블릿

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

... :

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

doesnt 객체가 작동하려면이 객체를 직렬화해야합니까? 06 sep. 132013-09-06 16:56:04


7

데이터의 의도 된 용도의 범위에 의존한다.

데이터가 사용자 로그인 정보, 페이지 방문 횟수 등과 같이 사용자 단위로만 사용되는 경우 (httpServletRequest.getSession(). get/setAttribute (String [, Object]) 세션 객체를 사용하십시오.)

여러 사용자 (전체 웹 페이지 조회수, 작업자 스레드 등)에서 동일한 데이터 인 경우 ServletContext 특성을 사용하십시오. getServletContext(). get/setAttribute (String [, Object])). 이것은 같은 war 파일/웹 응용 프로그램 내에서만 작동합니다. 이 데이터는 재시작시에도 지속되지 않습니다.

  0

ServletContext를 사용하면주의하지 않으면 쉽게 문제를 일으킬 수 있습니다. 예를 들어 순진한 방법으로 페이지 방문 횟수를 구현하는 데 사용할 수 없습니다 : 컨텍스트에서 현재 페이지 적중 횟수를 가져 와서 증분하고 컨텍스트에 값을 설정합니다. 멀티 스레딩은 그 해결책을 죽입니다. 23 sep. 082008-09-23 21:06:49

  0

메타 비판 - 어쨌든 백킹 데이터 저장소가 트랜잭션을 통해 처리해야하는 기능을 묻는 질문입니다. ACID에 관한 불만은 ACID 데이터 서비스를 사용해야합니다. ServletContext와 Session은 어떤 식 으로든 ACID를 모두 위반합니다. 24 sep. 082008-09-24 19:46:05


8

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

요청 - 지속 요청의 수명은

세션 - 사용자 세션의 수명을 지속

응용 프로그램 - 당신은 HttpServletRequest의 변수를 통해이 모든 범위에 액세스 할 수 있습니다 applciation가

를 종료 할 때까지 지속됩니다 HttpServlet class


2

다른 옵션은 컨텍스트간에 데이터를 공유합니다 ...

myApp1에 10

share-data-between-servlets-on-tomcat

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

:

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

myApp2에 :

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

0

는 여기에 내가 부두와 함께이 작업을 수행하는 방법이다.

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

은 싱글이 서버의 삶에 대한 모든 웹 어플리케이션들 사이에서 임베디드 부두 서버의 시작시에 기록하고 공유하는 서버 컨텍스트를 사용합니다. 컨텍스트에 작가가 하나 뿐인 것으로 가정하면 웹 응용 프로그램간에 개체/데이터를 공유하는 데 사용할 수도 있습니다. 그렇지 않으면 동시성을 염두에 두어야합니다.