12

我想在 JavaScript 中使用 JSTL 的 fmt 标记来本地化我的警报消息。我的 JavaScript 文件是一个独立文件,当我在 js 中包含 fmt 标记时,文件浏览器会给出 JavaScript 错误。是否可以使用 web.xml 配置将.js文件视为文件?.jsp谁能建议我该怎么做?

4

7 回答 7

20

是否可以使用 web.xml 配置将 .js 文件视为 .jsp 文件?

是的:

<servlet>
    <servlet-name>scriptjsp</servlet-name>
    <jsp-file>/script.jsp</jsp-file> 
</servlet>
<servlet-mapping>
    <servlet-name>scriptjsp</servlet-name>
    <url-pattern>/script.js</url-pattern>
</servlet-mapping>

但是,这样做并没有实际的优势,因为 JavaScript 文件的 URL 不必以“.js”结尾。决定一个文件是否为 JavaScript 文件的是它所提供的 MIME 媒体类型。您可以使用以下方式从 JSP 进行设置:

<%@ page contentType="text/javascript" %>

在顶部。然后你可以直接链接到:

<script type="text/javascript" src="/script.jsp"></script>

(除此之外:在当前的浏览器中,即使没有正确设置 Content-Type,与 <script> 标签链接的脚本也可以工作,但这可能不是值得依赖的东西。)

我想在 javascript 中使用 JSTL 的 fmt 标签

这可能不是一个好主意。fmt 标记处理字符的 HTML 转义,但您想要的是 JavaScript 字符串文字转义,例如反斜杠转义引号字符。JSTL 不提供此功能。你会意外逃脱'&amp;' JavaScript 字符串中出现的字符,以及在消息中使用撇号或双引号会破坏整个脚本。

此外,从 JSP 提供常用包含的脚本可能会导致性能和缓存不佳。

我建议在 JavaScript 中使用独立的语言查找系统。例如,包括每个语言的外部脚本:

<script type="text/javascript" src="/script/lang/en.js"></script>

(更改“en”以匹配您想要的任何语言),并在该文件中定义如下查找:

var msg= {
    messageName: 'Message in English',
    ...
};

然后在脚本中查找msg.messageName每个可本地化的字符串。

于 2009-03-11T16:25:04.990 回答
6

如果您的 javascript 与您的 JSP 页面的其余部分“内联”,那么只需使用 Kees de Kooter 建议的技术。

如果您的 javascript 需要位于外部文件中(例如,用于跨页面共享),那么只需将其放入自己的 JSP 文件中。

<%@page contentType="text/javascript" %>
<fmt:message key="some.message" var="someMessage"/>"
<fmt:message key="another.message" var="anotherMessage"/>"
var someMessage = "${someMessage}"
var anotherMessage = "${anotherMessage}"/>"

并像这样包含它...

        <script src="yourScript.jsp" language="JavaScript" type="text/javascript"></script>

然后,您可以从包含 JSP 的文件中或从包含在“yourScript.jsp”之后的任何 javascript 文件中引用“someMessage”和“anotherMessage”。

注意 contentType 属性的使用——'text/javascript' 可以防止 JSP 解析器抱怨输出不是格式良好的 XML——并且标签引用了 JSP 文件。

将这种技术与@Magner 建议的技术相结合,应该会为您带来一个明智的解决方案。

编辑:将示例更改为使用 'text/plain' 的 'text/javascript' insetad - 感谢@bobince 让我意识到这个错误(即使 'text/plain' 有效,使用 'text/javascript' 更正确)。此外,如果需要国际化的字符串数量很少,并且/或者您可以证明将“资源”放在多个地方是合理的——一个用于服务器端的东西,另一个用于客户端的东西——@bobince 的技术使用动态包含是一个不错的选择。

于 2009-03-11T09:03:58.187 回答
5

我建议您编写一个 servlet,它生成一个数组或 javascript 对象,其中包含您想要的所有本地化信息。您可以使用客户端和服务器端都可以共享的 Java 资源包,然后您不必混合 JSP 代码和 Javascript 代码,并且 servlet 响应将被浏览器缓存。

创建一个 servlet,将其映射到一个路径,让它从请求参数中读取语言环境,然后生成 Javascript 代码。

使用一行<script src="/mydict?lang=en"></script> 然后加载你的脚本<script src="/myscript.js"></script>

于 2009-05-05T00:43:48.787 回答
4

您应该努力将您的 javascript 代码保存在与 jsp 代码不同的文件中。这是为了获得浏览器缓存、更容易维护、跨页面重用以及允许压缩。

我建议您在 jsp 中为文本创建一个全局对象,供您的 javascript 文件使用。像这样:

<script>
    var text = text || {}; // play well with other jsps on the page
    text.this_page_name = {
        required_field_error: "<fmt:message key="required.field.error"/>",
        system_error: "<fmt:message key="system.error"/>"
    };
</script>

稍后您在 javascript 中使用它:

alert(text.this_page_name.required_field_error);
于 2009-03-11T08:21:28.740 回答
3

您可以执行以下操作。您将翻译后的消息存储在一个变量中,以后可以在 JSP 中解析该变量。

<fmt:message key="your.alert" var="theAlert"/>

<script type="text/javascript">
alert("${theAlert}");
</script>
于 2009-03-11T08:11:50.620 回答
1

您不能在 JavaScript 中使用标签,但有一种解决方法:将标签放入隐藏的DIV(<div style="display: none;" id="msg"><fmt:...>

DIV现在您可以使用 JS通过其 ID查找并获取innerHTML.

也就是说,fmt 只是 Java 的 i18n 函数的包装器,您可以直接在<% %>.

于 2009-03-11T08:12:33.880 回答
0

如果您只需要警报消息,只需在您的 javascript 中使用此标记

假设您的 Javascript 中有以下内容:

alert("Confirm Deletion"); 

这可以通过bean:message在您的 javascript 中添加标签来实现国际化

alert('<bean:message key="msg.confirm"/>');

key并在属性文件中添加值

msg.delete=Confirm Deletion
于 2014-03-14T05:05:56.003 回答