在JavaScript中使用JSP代码

12 javascript jsp web.xml jstl

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

bob*_*nce 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>
Run Code Online (Sandbox Code Playgroud)

但是,这样做没有实际的优势,因为JavaScript文件不必具有以".js"结尾的URL.确定文件是否是JavaScript文件的原因是它所服务的MIME媒体类型.您可以使用以下命令从JSP设置:

<%@ page contentType="text/javascript" %>
Run Code Online (Sandbox Code Playgroud)

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

<script type="text/javascript" src="/script.jsp"></script>
Run Code Online (Sandbox Code Playgroud)

(旁白:在当前的浏览器中,与<script>标签链接的脚本即使没有正确设置Content-Type也能正常工作,但这可能不是可以依赖的.)

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

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

此外,从JSP提供常用脚本可能会导致性能低下和缓存.

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

<script type="text/javascript" src="/script/lang/en.js"></script>
Run Code Online (Sandbox Code Playgroud)

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

var msg= {
    messageName: 'Message in English',
    ...
};
Run Code Online (Sandbox Code Playgroud)

然后msg.messageName在脚本中查找每个localisable字符串.


bel*_*bob 5

如果您的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}"/>"
Run Code Online (Sandbox Code Playgroud)

像这样包括它......

        <script src="yourScript.jsp" language="JavaScript" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

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

请注意,使用contentType属性 - "text/javascript"可以防止JSP解析器抱怨输出格式不正确的XML - 并且tage引用了JSP文件.

这种技术与@Magner建议的技术相结合,可以为您提供合理的解决方案.

编辑:更改示例使用'text/javascript'插入'text/plain' - 感谢@bobince让我意识到这个错误(即使'text/plain'有效,使用'text/javascript'更正确).此外,如果需要国际化的字符串数量很少,和/或您可以证明在多个地方拥有"资源" - 一个用于服务器端,另一个用于客户端 - @ bobince的技术使用动态包含是一个很好的.


BeW*_*ned 5

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

创建一个servlet,将其映射到路径,让它从请求参数中读取区域设置,然后生成Javascript代码.

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

  • 这是一个很好的解决方案,应该排名更高. (2认同)

Kee*_*ter 3

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

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

<script type="text/javascript">
alert("${theAlert}");
</script>
Run Code Online (Sandbox Code Playgroud)