2011-06-24 8 views
1

私はspring mvcアプリケーションを開発しています。1ページからコントローラに値を渡す方法は?

ユーザーがリンクをクリックすると、そのページの一部の値をそのリンクのターゲットコントローラに渡したいだけです。

AbstractCommandControllerはこれに便利ですか?

セッション属性を使用する以外の方法はありますか?

答えて

0

これは、次のいずれかの方法で行うことができます。

1)送信フォーム。

2)URLのパラメータとして送信します。

3)アプリケーションのcusomフラッシュスコープを作成します。 あなたがここでそれについての詳細を読むことができます:http://goo.gl/nQaQh

春MVCでフラッシュなしビーンのスコープはありません、あなたがそれを行うことができますので、インターセプターとして:

ここでは、単純な方法

public class FlashScopeInterceptor implements HandlerInterceptor { 

    public static final String DEFAULT_ATTRIBUTE_NAME = "flashScope"; 
    public static final String DEFAULT_SESSION_ATTRIBUTE_NAME = FlashScopeInterceptor.class.getName(); 
    public static final int DEFAULT_RETENTION_COUNT = 2; 

    private String sessionAttributeName = DEFAULT_SESSION_ATTRIBUTE_NAME; 
    private String attributeName = DEFAULT_ATTRIBUTE_NAME; 
    private int retentionCount = DEFAULT_RETENTION_COUNT; 

    /** 
    * Unbinds current flashScope from session. Rolls request's flashScope to 
    * the next scope. Binds request's flashScope, if not empty, to the session. 
    * 
    */ 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 
      throws Exception { 
     if (request.getSession(false) != null) 
     { 
      request.getSession().removeAttribute(this.sessionAttributeName); 
     } 
     Object requestAttribute = request.getAttribute(this.attributeName); 
     if (requestAttribute instanceof MultiScopeModelMap) 
     { 
      MultiScopeModelMap attributes = (MultiScopeModelMap) requestAttribute; 
      if (!attributes.isEmpty()) 
      { 
       attributes.next(); 
       if (!attributes.isEmpty()) 
       { 
        request.getSession(true).setAttribute(this.sessionAttributeName, attributes); 
       } 
      } 
     } 
    } 

    /** 
    * merge modelAndView.model['flashScope'] to current flashScope 
    */ 
    @Override 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception { 
     if (modelAndView != null) 
     { 
      Map<String, Object> modelFlashScopeMap = null; 
      for (Iterator<Entry<String, Object>> iterator = ((Map<String, Object>) modelAndView.getModel()).entrySet() 
        .iterator(); iterator.hasNext();) 
      { 
       Entry<String, Object> entry = iterator.next(); 
       if (this.attributeName.equals(entry.getKey()) && entry.getValue() instanceof Map) 
       { 
        if (modelFlashScopeMap == null) 
        { 
         modelFlashScopeMap = (Map) entry.getValue(); 
        } 
        else 
        { 
         modelFlashScopeMap.putAll((Map) entry.getValue()); 
        } 
        iterator.remove(); 
       } 
       else if (entry.getKey().startsWith(this.attributeName + ".")) 
       { 
        String key = entry.getKey().substring(this.attributeName.length() + 1); 
        if (modelFlashScopeMap == null) 
        { 
         modelFlashScopeMap = new HashMap<String, Object>(); 
        } 
        modelFlashScopeMap.put(key, entry.getValue()); 
        iterator.remove(); 
       } 
      } 
      if (modelFlashScopeMap != null) 
      { 
       MultiScopeModelMap flashScopeMap; 
       if (request.getAttribute(this.attributeName) instanceof MultiScopeModelMap) 
       { 
        flashScopeMap = (MultiScopeModelMap) request.getAttribute(this.attributeName); 
       } 
       else 
       { 
        flashScopeMap = new MultiScopeModelMap(this.retentionCount); 
       } 
       flashScopeMap.putAll(modelFlashScopeMap); 
       request.setAttribute(this.attributeName, flashScopeMap); 
      } 
     } 
    } 

    /** 
    * binds session flashScope to current session, if not empty. Otherwise cleans up empty 
    * flashScope 
    */ 
    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 

     HttpSession session = request.getSession(false); 
     if (session != null) 
     { 
      Object sessionAttribute = session.getAttribute(this.sessionAttributeName); 
      if (sessionAttribute instanceof MultiScopeModelMap) 
      { 
       MultiScopeModelMap flashScope = (MultiScopeModelMap) sessionAttribute; 
       if (flashScope.isEmpty()) 
       { 
        session.removeAttribute(this.sessionAttributeName); 
       } 
       else 
       { 
        request.setAttribute(this.attributeName, flashScope); 
       } 
      } 
     } 
     return true; 
    } 
} 

を使用するコードとMultiScopeModelMap

public class MultiScopeModelMap extends CompositeMap implements Serializable, MapMutator 
{ 
    public MultiScopeModelMap(int num) 
    { 
     super(); 
     setMutator(this); 
     for(int i = 0; i < num; ++i) 
     { 
      addComposited(new HashMap()); 
     } 
    } 

    /** Shadows composite map. */ 
    private final LinkedList<Map> maps = new LinkedList<Map>(); 

    @Override 
    public synchronized void addComposited(Map map) throws IllegalArgumentException 
    { 
     super.addComposited(map); 
     this.maps.addLast(map); 
    } 

    @Override 
    public synchronized Map removeComposited(Map map) 
    { 
     Map removed = super.removeComposited(map); 
     this.maps.remove(map); 
     return removed; 
    } 
    /** 
    * Starts a new scope. 
    * All items added in the session before the previous session are removed. 
    * All items added in the previous scope are still retrievable and removable. 
    */ 
    public void next() 
    { 
     removeComposited(this.maps.getFirst()); 
     addComposited(new HashMap()); 
    } 

    public Object put(CompositeMap map, Map[] composited, Object key, Object value) 
    { 
     if(composited.length < 1) 
     { 
      throw new UnsupportedOperationException("No composites to add elements to"); 
     } 
     Object result = map.get(key); 
     if(result != null) 
     { 
      map.remove(key); 
     } 
     composited[composited.length-1].put(key, value); 
     return result; 
    } 

    public void putAll(CompositeMap map, Map[] composited, Map mapToAdd) 
    { 
     for(Entry entry: (Set<Entry>)mapToAdd.entrySet()) 
     { 
      put(map, composited, entry.getKey(), entry.getValue()); 
     } 
    } 

    public void resolveCollision(CompositeMap composite, Map existing, Map added, Collection intersect) 
    { 
     existing.keySet().removeAll(intersect);  
    } 

    @Override 
    public String toString() 
    { 
     return new HashMap(this).toString(); 
    } 
} 
です

は今、XMLでそれを設定:

<bean id="flashScopeInterceptor" class="com.vanilla.scopes.FlashScopeInterceptor" /> 
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
    <list><ref bean="flashScopeInterceptor"/></list> 
    </property> 
</bean> 

使用方法:JSPで使用方法は非常に簡単です

@RequestMapping(value="/login.do", method=RequestMethod.POST) 
    public ModelAndView login(@Valid User user){ 
     ModelAndView mv = new ModelAndView("redirect:result.html"); 
     if (authService.authenticate(user.getUserName(), user.getPassword())) 
      mv.addObject("flashScope.message", "Success"); 
     //else 
      mv.addObject("flashScope.message", "Login Failed"); 
     return mv; 
    } 

@RequestMapping(value ="/result.html", method=RequestMethod.GET) 
    public ModelAndView result(){ 
     ModelAndView mv = new ModelAndView("login/loginAction"); 
     return mv; 
    } 

${flashScope.message} 
関連する問題