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字符串.
如果您的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的技术使用动态包含是一个很好的.
我建议你编写一个servlet来生成一个包含所需本地化信息的数组或javascript对象.您可以使用可由客户端和服务器端共享的Java资源包,然后您不必混合使用JSP代码和Javascript代码,并且浏览器将缓存servlet响应.
创建一个servlet,将其映射到路径,让它从请求参数中读取区域设置,然后生成Javascript代码.
使用一行,<script src="/mydict?lang=en"></script>
然后加载脚本<script src="/myscript.js"></script>
您可以执行以下操作。您将翻译后的消息存储在稍后可以在 JSP 中解析的变量中。
<fmt:message key="your.alert" var="theAlert"/>
<script type="text/javascript">
alert("${theAlert}");
</script>
Run Code Online (Sandbox Code Playgroud)