2012-05-08 16 views
0

現在、私のアプリケーションはすべてのコントローラマッピングにSpringMVCを使用しています。私はtinyMCEのスペルチェックを実装しようとしています。サーブレットが含まれています。このファイル自体を修正することなく、適切に正しく統合する方法がわかりません。私は変更を避けたいので、後で新しいバージョンを入手すると大丈夫です。GoogleSpellCheckerとSpringMVCをServletWrappingControllerと統合する方法

サーブレットは、それが内部的に管理し、サーブレットのインスタンスをラップ...

public abstract class TinyMCESpellCheckerServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    private static Logger logger = Logger.getLogger(TinyMCESpellCheckerServlet.class.getName()); 

    private static final String MAX_SUGGESTIONS_COUNT_PARAM = "maxSuggestionsCount"; 
    private static final String PRELOADED_LANGUAGES_PARAM = "preloadedLanguages"; 

    private static final String DEFAULT_LANGUAGE = "en"; 
    private static final String GET_METHOD_RESPONSE_ERROR = "This servlet expects a JSON encoded body, POSTed to this URL"; 

    private static String DEFAULT_PRELOADED_LANGUAGES = "en-us"; 

    private enum methods { 
     checkWords, getSuggestions 
    } 

    private int maxSuggestionsCount = 25; 


    @Override 
    public void init() throws ServletException { 
     super.init(); 
     preloadSpellcheckers(); 
     readMaxSuggestionsCount(); 
    } 

    private void preloadSpellcheckers() throws ServletException { 
     String preloaded = getServletConfig().getInitParameter(PRELOADED_LANGUAGES_PARAM); 
     if (preloaded == null || preloaded.trim().length() == 0) { 
      preloaded = DEFAULT_PRELOADED_LANGUAGES; 
     } 

     String[] preloadedLanguages = preloaded.split(";"); 
     for (String preloadedLanguage : preloadedLanguages) { 
      try { 
       preloadLanguageChecker(preloadedLanguage); 
      } catch (SpellCheckException e) { 
       //wrong servlet configuration 
       throw new ServletException(e); 
      } 
     } 
    } 

    protected abstract void preloadLanguageChecker(String preloadedLanguage) throws SpellCheckException; 

    /** 
    * This method look for the already created SpellChecker object in the cache, if it is not present in the cache then 
    * it try to load it and put newly created object in the cache. SpellChecker loading is quite expensive operation 
    * to do it for every spell-checking request, so in-memory-caching here is almost a "MUST to have" 
    * 
    * @param lang the language code like "en" or "en-us" 
    * @return instance of SpellChecker for particular implementation 
    * @throws SpellCheckException if method failed to load the SpellChecker for lang (it happens if there is no 
    *        dictionaries for that language was found in the classpath 
    */ 
    protected abstract Object getChecker(String lang) throws SpellCheckException; 


    private void readMaxSuggestionsCount() throws ServletException { 
     String suggestionsCountParam = getServletConfig().getInitParameter(MAX_SUGGESTIONS_COUNT_PARAM); 
     if (suggestionsCountParam != null && suggestionsCountParam.trim().length() > 0) { 
      try { 
       maxSuggestionsCount = Integer.parseInt(suggestionsCountParam.trim()); 
      } catch (NumberFormatException ex) { 
       //wrong servlet configuration, possibly a typo 
       throw new ServletException(ex); 
      } 
     } 
    } 


    /** 
    * @see javax.servlet.Servlet#destroy() 
    */ 
    public void destroy() { 
     super.destroy(); 
     //remove unused objects from memory 
     clearSpellcheckerCache(); 
    } 

    protected abstract void clearSpellcheckerCache(); 


    /** 
    * GET method is not supported 
    * @see HttpServlet#doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse 
    *  response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     setResponeHeaders(response); 
     PrintWriter pw = response.getWriter(); 
     pw.println(GET_METHOD_RESPONSE_ERROR); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse 
    *  response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     setResponeHeaders(response); 
     try { 
      JSONObject jsonInput = readRequest(request); 

      String methodName = jsonInput.optString("method"); 
      if (methodName == null || methodName.trim().equals("")) { 
       throw new SpellCheckException("Wrong spellchecker-method-name:" + methodName); 
      } 

      JSONObject jsonOutput = new JSONObject("{'id':null,'result':[],'error':null}"); 
      switch (methods.valueOf(methodName.trim())) { 
       case checkWords: 
        jsonOutput.put("result", checkWords(jsonInput.optJSONArray("params"))); 
        break; 
       case getSuggestions: 
        jsonOutput.put("result", getSuggestions(jsonInput.optJSONArray("params"))); 
        break; 
       default: 
        throw new SpellCheckException("Unimplemented spellchecker method {" + methodName + "}"); 
      } 

      PrintWriter pw = response.getWriter(); 
      pw.println(jsonOutput.toString()); 

     } catch (SpellCheckException se) { 
      logger.log(Level.WARNING, se.getMessage(), se); 
      returnError(response, se.getMessage()); 
     } catch (Exception e) { 
      logger.log(Level.WARNING, e.getMessage(), e); 
      returnError(response, e.getMessage()); 
     } 

     response.getWriter().flush(); 
    } 
..... 

答えて

0

javadoc

ServletWrappingControllerを見て春Controller実装のように見えます。このようなラップされたサーブレットは、このコントローラの外部には知られていません。ここではライフサイクル全体がカバーされています(ServletForwardingControllerと対照的に)。

Springのディスパッチインフラストラクチャ経由で既存のサーブレットを呼び出す、たとえばSpring HandlerInterceptorsを要求に適用する場合などに便利です。

設定あなたの春のコンテキストでこれらのいずれかの、あなたのTinyMCEのサーブレットクラス名とそれを構成して、SimpleUrlHandlerMappingを使用してそれをマッピングします。

ServletForwardingControllerでも有用ですが、わずかに異なります。

+0

例を参考にできますか?私はこれが機能しているように見えることを正確に理解するのには苦労しています。 – Webnet

+0

@Webnet:javadocリンクには例があります。 – skaffman

+0

私はドキュメンテーションを取って、その構成を構築しようとしました。エラーが発生していますが、原因が何であるかを判断するのに問題があります。更新された投稿を見て、あなたが指導を提供できるかどうか確認できますか? – Webnet

関連する問題