Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-15.log failed

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
study:jsf:logging [2008/04/13 15:12] bananastudy:jsf:logging [2008/04/13 15:52] (現在) banana
行 46: 行 46:
     return text;     return text;
 } }
 +...
 </code> </code>
  
行 63: 行 64:
  
 이제 실제 코드에서 이 Utils 메소드를 사용하는 예를 보인다. 이제 실제 코드에서 이 Utils 메소드를 사용하는 예를 보인다.
 +{{keywords> FacesMessage i18n Internalization Locale ClassLoader getMessage reportError}}
  
  
行 81: 行 83:
 String requestPath = httpRequest.getPathInfo(); String requestPath = httpRequest.getPathInfo();
 ... ...
- 
 String text = Utils.getDisplayString(Constants.BUNDLE_BASENAME, String text = Utils.getDisplayString(Constants.BUNDLE_BASENAME,
                                              "PathNotFound",                                              "PathNotFound",
                                              new Object[] { requestPath },                                              new Object[] { requestPath },
                                              request.getLocale());                                              request.getLocale());
-        httpResponse.sendError(HttpServletResponse.SC_NOT_FOUND, +        httpResponse.sendError(HttpServletResponse.SC_NOT_FOUND, text);
-                               text);+
 ... ...
 </code> </code>
行 118: 行 118:
 앞의 예제와 같이 문자열 상수를 사용하여 번들을 로드해야 한다.\\ 앞의 예제와 같이 문자열 상수를 사용하여 번들을 로드해야 한다.\\
 이 문자열은 파라미터를 갖지 않으므로 getDisplayString 메소드의 파라미터 배열에 null을 전달했다. 이 문자열은 파라미터를 갖지 않으므로 getDisplayString 메소드의 파라미터 배열에 null을 전달했다.
 +
 +
 +
  
 ====== Internalization of Messages ====== ====== Internalization of Messages ======
-이번에는 코드내에서 정보를 알리기 위한 목적과 에러를 보고하기 위한 목적등으로 쓰이는 메세지를 생성하는 Utils 메소드를 소개한다.\\ 이 메소드는 ResourceBundle로부터 새로운 FacesMessage 인스턴스를 생성시키는 Factory methode이다.+이번에는 코드내에서 정보를 알리기 위한 목적과 에러를 보고하기 위한 목적등으로 쓰이는 메세지를 생성하는 Utils 메소드를 소개한다.\\ 이 메소드는 %%ResourceBundle%%로부터 새로운 %%FacesMessage%% 인스턴스를 생성시키는 Factory method다. 
 +((우리는 몇 개의 파라미터를 받는 하나의 팩토리 메소드를 작성했다. 기본적으로 사용할 수 있는 편리한 메소드를 작성해 놓는것이 
 +좋을 것이기 때문에, 이 메소드에서는 locale이나 severity같은 파라미터를 지정하지 않았다. 만약 이런 메소드를 직접 작성하기를 
 +원하지 않는다면, JSF RI의 %%CarDemo%% Application에 포함되어있는 **%%MessageFactory%%** 클래스를 사용해도 좋을 것이다.)) 
 +<code java> 
 +... 
 +public static FacesMessage getMessage(String messageId, Object params[], 
 +                                        FacesMessage.Severity severity) 
 +  { 
 +    FacesContext facesContext = FacesContext.getCurrentInstance(); 
 +    String bundleName = facesContext.getApplication().getMessageBundle(); 
 +    if (bundleName != null) 
 +    { 
 +      String summary = null; 
 +      String detail = null; 
 +      Locale locale = facesContext.getViewRoot().getLocale(); 
 +      ResourceBundle bundle = 
 +          ResourceBundle.getBundle(bundleName, locale, 
 +                                   getCurrentClassLoader(params)); 
 +      try 
 +      { 
 +        summary = bundle.getString(messageId); 
 +        detail = bundle.getString(messageId + ".detail"); 
 +      } 
 +      catch (MissingResourceException e) 
 +      {} 
 +      if (summary != null) 
 +      { 
 +        MessageFormat mf = null; 
 +        if (params != null) 
 +        { 
 +          mf = new MessageFormat(summary, locale); 
 +          summary = mf.format(params, new StringBuffer(), null).toString(); 
 +        } 
 +        if (detail != null && params != null) 
 +        { 
 +          mf.applyPattern(detail); 
 +          detail = mf.format(params, new StringBuffer(), null).toString(); 
 +        } 
 +        return (new FacesMessage(severity, summary, detail)); 
 +      } 
 +    } 
 +    return new FacesMessage(severity, "!! key " + messageId + " not found !!", 
 +                            null); 
 +  } 
 +
 +... 
 +public static void reportError(FacesContext facesContext, String messageId, 
 +                                   Exception exception) 
 +  { 
 +    FacesMessage message = getMessage(messageId, null, 
 +                             FacesMessage.SEVERITY_ERROR); 
 +    facesContext.addMessage(null, message); 
 +    if (exception != null) 
 +    { 
 +      facesContext.getExternalContext().log(message.getSummary(), exception); 
 +    } 
 +  } 
 +... 
 +</code> 
 +새로운 **getMessage** 메소드는 **getDisplayString**과 비슷하다. 다만 요약문과 상세문에 따른 새로운 **%%FaceMessage%%** 
 +인스턴스를 생성시킨다는 점이 다르다. \\ 
 +두 식별자의 유일한 차이는 상세문의 경우 "_detail"로 끝난다는 점이다. 이는 JSF가 내부적으로 표준 메세지와 커스텀 메세지를 
 +다루는 방식이다.\\ 
 +**reportError**는 식별자에 근거하여 메세지를 로드하는 getMessage를 사용한다.
  
 +새로운 팩토리 메소드를 정의했으므로, 코드에서 하드코딩된 메세지를 이 메소드를 이용하여 변경하는 방법을 예를 들어 알아보자.
  
  
  
 +
 +===== Example of using Utils.getMessage and Utils.reportError =====
 +<code java>
 +public String login()
 +  {
 +    FacesContext facesContext = getFacesContext();
 +    Utils.log(facesContext, "Executing AuthenticationBean.getUser()");
 +
 +    User newUser = null;
 +    try
 +    {
 +      newUser = getUserCoordinator().getUser(loginName, password);
 +    }
 +    catch (ObjectNotFoundException e)
 +    {
 +      facesContext.addMessage(null,
 +                              Utils.getMessage("BadLogin", null,
 +                                               FacesMessage.SEVERITY_INFO));
 +
 +  /*      facesContext.addMessage(null,
 +                              new FacesMessage(FacesMessage.SEVERITY_WARN,
 +                              "Incorrect name or password.", "")); */
 +      return Constants.FAILURE_OUTCOME;
 +    }
 +    catch (DataStoreException d)
 +    {
 +       Utils.reportError(facesContext, "ErrorLoadingUser", d);
 +
 +  /*      Utils.reportError(facesContext, "A database error has occurred.",
 +                                       "Error loading User object", d);*/
 +      return Constants.ERROR_OUTCOME;
 +    }
 +...
 +</code>
 +
 +변경된 부분의 getUser를 호출한 뒤 예외를 처리하는 곳이다. **%%ObjectNotFoundException%%**은 중요한 에러가 아니므로,
 +이 경우 %%BadLogin%%이라는 식별자와 함께 **getMessage** 메소드를 사용하여 INFO 수준의 심각도를 갖는 메세지를 추가했다.\\
 +**%%DataStoreException%%**은 심각한 에러이기 때문에, %%ErrorLoginUser%% 식별자와 함께 **reportError**를 호출했다.
 +((코드 내에서 메세지를 생성시키는 것은 많은 양의 작업을 필요로 한다. %%FacesMessage%%를 위한 팩토리 메소드는 우리가 직접 작성할 것이 아니라 표준 API의 일부여야 한다고 생각한다. JSF의 차기 버전에서는 이것이 반영되기를 희망한다.))

QR Code
QR Code study:jsf:logging (generated for current page)