我有一个javascript文件,其中收集了登录名和其他用户配置文件ajax调用,这些调用需要在Web应用程序的所有页面上可用。
对于我所有的ajax调用,我都需要webapp的上下文路径来获取正确的URL。baseUrl变量可以由定义var baseUrl = "${pageContext.request.contextPath}";。
var baseUrl = "${pageContext.request.contextPath}";
我遇到了一个令人费解的错误。如果我尝试在我的login.js-file中初始化baseUrl变量,它将无法正常工作。它只是设置为字符串值。"${pageContext.request.contextPath}"此.js文件包含我实际需要该变量的所有脚本。但是,如果我在.jsp文件本身的无源脚本标记中定义它,则它的工作原理就像一个魅力。(底部的代码)
login.js
"${pageContext.request.contextPath}"
我猜想这与何时,在哪个范围内编译和/或执行表达式以及动态和静态代码导入之间的差异有关。我只是无法准确地了解正在发生的事情,以及为什么我想要的方法login.js无法在- file中定义变量,因此无法正常工作。
工作进口声明:
<script>var baseUrl = "${pageContext.request.contextPath}";</script> <script src="<c:url value="/js/login.js"/>" type="text/javascript"></script>
EL表达式仅由具有此功能的servlet评估。此类servlet的示例是JSP JspServlet和JSF FacesServlet。在一个能够评估的${...}模板文本和其他能够评估两者${...}并#{...}在模板文本。负责*.js文件等静态资源的容器的默认servlet 则不是。
JspServlet
FacesServlet
${...}
#{...}
*.js
鉴于您正在使用JSP,只需告诉您的Web应用程序即可使用它JspServlet来处理任何*.js请求。容器的内置函数JspServlet通常具有默认的servlet名称jsp(至少,对于Tomcat和克隆来说是正确的),因此web.xml应在webapp的以下条目中进行操作,以便在*.js文件中评估EL 。
jsp
web.xml
<servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping>
这有一个小警告。一些容器强行将内容类型标头更改为text/html无论js文件扩展名如何,然后浏览器在下载JS文件时感到困惑。一种防止这种情况的方法是,以JSP方式在JS文件顶部显式设置所需的内容类型标头:
text/html
js
<%@page contentType="application/javascript" %>
完全不同的选择是将上下文路径打印为<html>标记的HTML5数据属性。
<html>
<!DOCTYPE html> <html lang="en" data-baseuri="${pageContext.request.contextPath}/"> ... </html>
然后就可以在JS中的任何位置使用它,如下所示:
var baseuri = document.documentElement.dataset.baseuri;
或者,如果您是jQuery粉丝:
var baseuri = $("html").data("baseuri");