2016-09-19 6 views
0

모두.Spring MVC 애플리케이션에서 공유 HashMap

스프링 MVC로 웹 사이트를 구축하고 컨트롤러를 싱글 톤으로 구성했습니다. 전체 응용 프로그램에서 공유 HashMap을 만들고 싶습니다.

즉, 새 사용자가 사용자 계정을 등록하면 확인 코드를 보내고이를 HashMap에 넣습니다. 사용자는 확인 코드를 다른 페이지로 전송할 수 있습니다. 다른 브라우저 세션에서 HaspMap에 다른 세션에서 액세스 할 수 있어야합니다.

데이터베이스 테이블에 저장하여이 기능을 구현했지만 데이터베이스를 사용하지 않고 이런 식으로 수행하는 방법을 알고 싶습니다. 당신이 모든 클래스에서 선언 할 때

답변

0

봄 컨텍스트에서 HashMap을 빈으로 작성하십시오.

http://host:port/context/sharedMap/put.service?key=keyOne&value=keytwo 
Result: {"keyOne":"keytwo"} 

http://host:port/context/sharedMap/put.service?key=keyTwo&value=valuetwo 
Result: {"keyOne":"keytwo","keyTwo":"valuetwo"} 
:이처럼 액세서,

@Controller 
@RequestMapping("/sharedMap") 
public class MapConsumerController { 

    @Resource(name="theMap") 
    private Map theMap; 

    @RequestMapping("/put.service") 
    public @ResponseBody Map<?,?> put(String key, String value){ 
     this.theMap.put(key, value); 
     return this.theMap; 
    } 

} 

테스트 :

<util:map id="theMap" /> 

는 그런 다음 @Autowired 또는 @Resource(name="theMap")를 사용하여 참조 할 수 있습니다 : 당신이 XML 기반 구성을 사용하는 경우 당신은 이런 식으로 할 수

새로운보기를 만들고지도의 내용을 쉽게 확인하지 않으려면 @ResponseBody을 방금 사용했습니다.

+0

감사합니다. 매우 명확한 해결책입니다. –

0

많은 아무것도 할 HashMap 정적 로 초기화.

public class AnyClass{ 
public static Map<?> sessionMap = new HashMap<?>; //use anywhere in the project 
} 
다른 클래스를 사용 AnyClass.sessionMap.put(key,value)에서

또는이지도 의지가 그 정보를 당신이 명시 적으로 remove 키 또는 stop/restart 서버까지를 포함 .Till AnyClass.sessionMap.get(key).

Synchronize 블록을 사용하여 키를 가져오고 가져옵니다.

하지만 응용 프로그램 서버를 다시 시작한 후에는 해당 정보를 얻을 수 없습니다.

+0

답변을 주셔서 감사합니다. 저는 Spring MVC를 사용하고 있으므로 다른 답변을 선택합니다. 좋은 하루 되세요. –

0

지도를 직접 공유하는 것을 권하지 않습니다. 그것은 거의 존재할 이유가 없습니다. 대신 사용자 계정 논리를 추상화하는 것이 좋습니다.

그런 식으로 인터페이스를 프로그래밍하고 나중에 구현을 변경해야하는 경우 (예 :지도 대신 데이터베이스로 이동) 구현 클래스를 바꿀뿐 다른 것은 변경할 필요가 없습니다. 아래 예제의 핵심은 MapUserRepository가 싱글 톤이므로 내부의 Map이 기술적으로 싱글 톤이라는 것입니다. 사용 사례에 따라 ConcurrentHashMap을 사용하려고 할 수도 있습니다.

@Controller 
    @RequestMapping("/users") 
    public class UserController { 

     @Autowired 
     private UserRepository userRepository; 

     @RequestMapping(path = "/username", method = RequestMethod.POST) 
     public ResponseEntity<String> registerUser(@PathParam("username") String username) { 

      String confirmCode = userRepository.addUser(username); 
      return new ResponseEntity<String>(confirmCode, HttpStatus.OK); 
     } 

    } 

    @Controller 
    @RequestMapping("/another") 
    public class AnotherController { 

     @Autowired 
     private UserRepository userRepository; 

     public ResponseEntity<String> registerUser(@RequestParam("confimCode") String confirmCode) { 

      User user = userRepository.getUserByConfirmationCode(confirmCode); 
      // do something with the user or handle not found error. 
      return new ResponseEntity<String>("another operation", HttpStatus.OK); 
     } 

    } 

    public interface UserRepository { 

     public String addUser(String username); 

     public User getUserByConfirmationCode(String confirmationCode); 
    } 

    public class User { 

     public User(String username) { 
      this.username = username; 
     } 

     private final String username; 
    } 

    @Component 
    public class MapUserRepository implements UserRepository { 

     @Override 
     public String addUser(String username) { 

      // maybe check if the user name already exists. 

      String confirmation = "generate some code"; 
      this.mapUsers.put(confirmation, new User(username)); 

      // handle possible errors. 
      return confirmation; 
     } 

     @Override 
     public User getUserByConfirmationCode(String confirmationCode) { 

      // possibly handle errors if confirmation code is not valid. 
      return this.mapUsers.get(confirmationCode); 
     } 

     private final Map<String, User> mapUsers = new HashMap<>(); 
    } 
+0

감사합니다 @ aman, 그것은 훌륭한 솔루션입니다. 그러나 나는 다른 대답을 선택할 수 있도록 간단하고 가벼운 프로젝트를 만들고 있다고 생각합니다. 좋은 하루 되세요. –

관련 문제