2012-01-17 25 views
0

我编写了自定义标记,可以很容易地本地化字符串;自定义标记从servlet中获取空值并捕获异常

在jsp中它看起来像这样:

<ct:word key="${message}"/> 

消息从Servlet进行传递。 该标签从ResourceBundle中获取所需的字符串。 一切正常,但存在问题。如果我没有从servlet传递消息,那么我的应用程序抛出异常(ResourceBundle找不到必要的字符串)。
如何确保自定义标签不响应空值并跳过?像它

<c:out /> 

代码即时通讯我的自定义标签:

private String key; 
private String value; 

public void setKey(String key) { 
    this.key = key; 
} 

public String getKey() { 
    return this.key; 
} 

public int doStartTag() { 
    try { 
     this.checkLocale();//check locale and init resourceBundle 
     value = resourceBundle.getString(key); 
     pageContext.getOut().write(value); 
    } catch (IOException e) { 
     logger.error(e); 
    } catch (MyException e1) { 
     logger.error(e1); 
    } 
    return SKIP_BODY; 
} 

我不想使用

<c:if test="${not empty message}"/> or <c:when/> 

它的杂波

修订在JSP代码: 我试试

} catch (MyException e1) { 
     logger.error(e1); 
     return SKIP_BODY; 
    } 

,但我有例外:

java.util.MissingResourceException: Can't find resource for bundle java.util.PropertyResourceBundle, key 
在我的方法

我赶上

catch (MissingResourceException e) { 
     throw new MyException(Constants.ERROR_TRANSLATE_TAG,e); 
    } 

我的应用程序问题,此异常只有当我没从servlet的将此消息传递。我想要显示页面,即使我没有这个消息,没有错误页面。

+0

您是否尝试捕获'MissingResourceException'? – Thomas 2012-01-17 21:06:11

+0

是的,为了避免拉出所有异常,我在try/catch块中抛出MyException。虽然我不知道如何处理这个异常,但我只是写下这个错误。 – Ifozest 2012-01-17 21:10:38

+0

既然你返回'SKIP_BODY'并且不应该进入'pageContext.getOut()。write(value);'当抛出一个'MissinResourceException'的行时,一切都应该没问题。或者当应该由servlet设置密钥时,你会得到一个异常吗?在这种情况下,你能告诉我们你的标签描述吗? – Thomas 2012-01-17 21:41:12

回答

0

为了记录在案:

resourceBundle.getString(key);将抛出MissingResourceException如果密钥无法找到,从而捕获了异常,以及在doStartTag()方法。