小编典典

为什么我的EL语句仅在不通过src引用导入js.file的脚本标记中起作用?

jsp

我有一个javascript文件,其中收集了登录名和其他用户配置文件ajax调用,这些调用需要在Web应用程序的所有页面上可用。

对于我所有的ajax调用,我都需要webapp的上下文路径来获取正确的URL。baseUrl变量可以由定义var baseUrl = "${pageContext.request.contextPath}";

我遇到了一个令人费解的错误。如果我尝试在我的login.js-file中初始化baseUrl变量,它将无法正常工作。它只是设置为字符串值。"${pageContext.request.contextPath}"此.js文件包含我实际需要该变量的所有脚本。但是,如果我在.jsp文件本身的无源脚本标记中定义它,则它的工作原理就像一个魅力。(底部的代码)

我猜想这与何时,在哪个范围内编译和/或执行表达式以及动态和静态代码导入之间的差异有关。我只是无法准确地了解正在发生的事情,以及为什么我想要的方法login.js无法在-
file中定义变量,因此无法正常工作。

工作进口声明:

<script>var baseUrl = "${pageContext.request.contextPath}";</script>
<script src="<c:url value="/js/login.js"/>" type="text/javascript"></script>

阅读 299

收藏
2020-06-08

共1个答案

小编典典

EL表达式仅由具有此功能的servlet评估。此类servlet的示例是JSP
JspServletJSF
FacesServlet。在一个能够评估的${...}模板文本和其他能够评估两者${...}#{...}在模板文本。负责*.js文件等静态资源的容器的默认servlet
则不是。

鉴于您正在使用JSP,只需告诉您的Web应用程序即可使用它JspServlet来处理任何*.js请求。容器的内置函数JspServlet通常具有默认的servlet名称jsp(至少,对于Tomcat和克隆来说是正确的),因此web.xml应在webapp的以下条目中进行操作,以便在*.js文件中评估EL

<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

这有一个小警告。一些容器强行将内容类型标头更改为text/html无论js文件扩展名如何,然后浏览器在下载JS文件时感到困惑。一种防止这种情况的方法是,以JSP方式在JS文件顶部显式设置所需的内容类型标头:

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

完全不同的选择是将上下文路径打印为<html>标记的HTML5数据属性。

<!DOCTYPE html>
<html lang="en" data-baseuri="${pageContext.request.contextPath}/">
    ...
</html>

然后就可以在JS中的任何位置使用它,如下所示:

var baseuri = document.documentElement.dataset.baseuri;

或者,如果您是jQuery粉丝:

var baseuri = $("html").data("baseuri");
2020-06-08