JSP引入JS/CSS路径到底怎么写才好

article/2025/3/15 1:23:30

缘起

在某些项目中可能会采用相对路径或者绝对路径方式来引入js或css文件,这在某些情况下会出现问题。下面我们就来说说问题出在哪里,我们先将以下所有的例子中的页面设定为a.jsp。

相对路径存在的问题

采用相对路径的写法如下两种

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

这在你直接访问某个页面的时候比如如下是没有问题,。

http://localhost:8081/a.jsp

但在实际项目中我们很少直接去请求一个jsp页面,一般都是通过后来跳转,或是servlet,或是springmvc,亦或是springboot+tymeleaf。比如你想跳转到某个添加页面,你通过请求

http://localhost:8081/home/saveIndex.do

假设你使用的spring mvc。并且你的@requestMapping(“home”)是写在类上的话,那么返回的页面中引入的静态文件的路径就会变成如下这种

http://localhost:8081/home/js/a.js

也就是说他会在路径前面多了一个@requestMapping的路径,而正确的请求路径应该是

http://localhost:8081/js/a.js

绝对路径存在的问题

绝对路径写法有两种

  1. 以/开头
  2. 以http开头

比如如下两种写法就是通过绝对路径引用js的方法

<script type="text/javascript" src="/js/a.js"></script>
<script type="text/javascript" src="http://abc.com/js/a.js"></script>

但是以/开头的存在问题
这种写法在你项目部署在tomcat的root下是没有任何问题的,但是当你项目部署在webapp下,也就是存在application context的时候这种方式是存在问题的。比如你的项目为UserDemo。
你期望得到的JS的路径为

http://localhost:8081/UserDemo/a.js

你实际得到的JS的路径为

http://localhost:8081/a.js

所以你也会得到一个404。那么绝对路径中以/开头的会存在某些问题,那么以http开头的引用方式该怎么写呢?

正确的姿势引入

我们首先要考虑如何得到项目的请求地址和端口
假设我们需要在a.js页面引入某些js,那么我们需要在a.jsp页面引入另一个jsp。这个新的jsp我们把它叫mytags.jsp吧。
a.jsp页面引入的地方如下

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@include file="/context/mytags.jsp" %>
<!DOCTYPE html>
<html>
<head>
......省略部分代码

mytags.jsp页面内容如下

<%@ taglib prefix="t" uri="/easyui-tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt"%>
<% 
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path;
%>
<c:set var="webRoot" value="<%=basePath%>" />

这里的webroot的最终结果就是

http://ip:port/项目名称 

比如你的项目名称是UserDemo,那么就是如下

http://localhost:8081/UserDemo/

而如果你是放到tomcat的root目录下 那么是不加项目名的 类似

http://localhost:8081/

这个webroot就是项目的请求路径了
这样的话,我们就可以在a.jsp通过以下写法来使用绝对路径来引入JS或者css.例如

<link href="${webRoot}/asset/css/base.css" rel="stylesheet">

上诉翻译过来的真是路径就类似于

http://localhost:8081/asset/css/base.css

这个路径是绝对没有问题的。
这种写法的另一个好处是我们可以把每个页面都需要的js获取类库放到mytags.jsp里面,而不需要每个页面都引入一次。例如这里有一个相对复杂的mytags.jsp
在这里插入图片描述

如何把webRoot去掉

对于如上的一个mytags.jsp写法,可以看到每个引入的JS前面都加了${webRoot}。那么有没有什么办法可以省略掉这个呢,答案是有的,JS中提供了一个全局的前缀的写法
在这里插入图片描述
你可以在mytags.jsp文件中加入

<base target="_self" href="<%=basePath%>">

它代表每个引入JS的地方都需要加上这个前缀。这样的话下面引入JS的地方就可以省略掉${webRoot}了。比如我上诉的页面就可以看到引入js的时候都不需要再前面加 webroot
但是相比你也注意到了,为什么上诉在引入最后一个js的时候,也就是WdatePicker.js的时候前面加了ctx呢。
这其实是由于WdatePicker.js的特殊性导致的,由于其在内部还引用了其他的JS和CSS,并且其引用方式采用的是相对路径方式,.
在这里插入图片描述
在查找这些文件的时候路径就变成了下面这样
在这里插入图片描述
所以,对于这样的js我们需要特殊处理一下,即在前面加对应的项目名,也就是request.getContextPath()。由于上诉已经使用ctx定义了request.getContextPath()。所以可以写成如下这样

<script src="${ctx}/assets/plugins/My97DatePicker/WdatePicker.js" type="text/javascript"></script>

http://chatgpt.dhexx.cn/article/s3TpXH5N.shtml

相关文章

jsp和js区别 一

最近很多同学在纠结于名词缩写之间的相似性&#xff0c;因此本人也来写一篇&#xff0c;讲讲JS和JSP的区别。 SUN首先发展出SERVLET&#xff0c;其功能比较强劲&#xff0c;体系设计也很先进&#xff0c;只是&#xff0c;它输出HTML语句还是采用了老的CGI方式&#xff0c;是一句…

JAVASCRIPT、JSP、JS有什么区别和联系

感谢大佬&#xff1a;https://www.cnblogs.com/xiaojizhualaoying/p/10662410.html js是javascript的缩写。以下是JSP与JS的区别和联系&#xff1a; 名字&#xff1a;JS&#xff1a;JavaScriptJSP&#xff1a;Java Server Pages 执行过程&#xff1a;JSP先翻译&#xff0c;翻译…

【Java】Java、JavaScript、JSP、JScript,傻傻分不清楚

不怕大家笑话&#xff0c;曾经在大学期间就做过**一次**web相关的工作&#xff0c;也就是自己《软件工程》的项目作业&#xff0c;初步接触了一些CSSDIV的工作。但是依然不是很深入&#xff0c;都称不上前端工作&#xff0c;因为js是小组内其他成员负责调的&#xff0c;自己最多…

scc4查看系统安装了多少个client

give two screen shot to get more sense. 转载于:https://www.cnblogs.com/LearnSap/archive/2008/07/10/1239873.html

Client copy

我在IDES的800Client作练习,如果改来改去改滥了怎么办?我参考了南的这篇文章的第二部分。 http://blog.chinaunix.net/u2/65985/showart_1003707.html 方法是将800作个备份就可以了,也就是作Client Copy。那怎么做Client Copy呢? 我们需要先用SCC4创建一个新Client号。 在…

SAP R3 Create Client: T-code:SCC4

group number from 002-999(066 for system use). below picture is client,company codes,plants ,storage location, puchasing releationship. 也可以从以下的路径进入&#xff1a; 配置路径&#xff1a;SPRO-企业结构-定义-后勤常规-定义&#xff0c;复制&#xff0c;删除&…

SAP ABAP ZBA_R005获得事务代码分段,完成关键用户参数权限

ERP项目有这样一个场景&#xff1a; 我们需要在SAP_ALL全部的授权中&#xff0c;只拿掉BASIS相关和SPRO后台配置入口的权限&#xff0c;剩下99%的权限给关键用户使用。 我们需要在10万个事务代码中&#xff0c;把BASIS的几个TC和SPRO按分段剔除出来。 下面程序就帮助得到剔除…

SAP ABAP 生产机设置标准配置表为可直接维护 例子为:V_T499S

本人诚心接ABAP远程开发任务&#xff0c;价格公道&#xff0c;有需要的联系我&#xff0c;欢迎个人&#xff0c;甲方爸爸&#xff0c;乙方私信联系。 因公司业务需求&#xff0c;V_T499S 需经常手动新增&#xff0c;故将sm30权限放开给用户自增&#xff0c;节省每次用户传输的…

传输请求K汇总

1、SCC1传输请求(同系统跨Client) abap开发中会涉及到一些配置的,也会生成定制请求,比如说BTE中的配置,webservice中的端口配置。 这些配置并不是跨client的,通常一个SAP系统内会有多个client,比如,开发机系统内存在两个client,100和200,100下是纯开发client,200下…

SCC1传输请求(同系统跨Client)

SCC1 是用于在同一系统下不同clients之间传输内容&#xff0c;内容通过传输请求打包&#xff1b;SCC4 是关于同一系统下不同clients的管理&#xff0c;里面有各个client的设定。 先在SE10释放&#xff0c;再到SCC1传输。

数据字典、透明表

SE16N缓存 比如SE11改了字段长度&#xff0c;SE16N没有变化&#xff0c;需要清缓存 /$SYNC 查看表对应的文本表 直接se16n输入表名&#xff0c;就能看到文本表了&#xff0c;比如ska1 数据元素 描述&#xff1a;在表dd04t中 修改记录 在数据元素勾更改文档&#xff0c;表修…

如何在SAP生产系统里面快速地紧急修复BUG

这是一个SAP标准程序 在软件工程中&#xff0c;《日月神话》提到这个世界是没有银弹可以解决所有的bug&#xff0c;所以在生产系统又不可避免的会出现各种bug。由于引起bug的和成本来比&#xff0c;传输请求或许一种方式&#xff0c;然后令人烦恼是不停地进行流程审批和等待&a…

【SAP消息号KT300】

SAP消息号KT300 PS:相同的消息号可能会出现在不同的业务场景&#xff0c;条条大道通罗马&#xff0c;仅供学习交流参考&#xff01;SAP消息号KT300 1、业务场景&#xff1a; 维护成本控制范围OKKP的时候报错&#xff1a;货币CNY域货币类型30不匹配&#xff1b; 2、解决办法&…

SAP MB51选择界面配置

一&#xff0e;说明 查看单个物料凭证的T-CODE是MB03&#xff0c;列表查询则是MB51。前台执行MB51&#xff0c;进入后搜索条件界面如图 1所示&#xff0c;上部是项目字段&#xff0c;下部是抬头字段&#xff0c;如果需要更多的字段选择&#xff0c;则后台有专项配置进行支持。此…

sap scc4 客户端设置

事务代码&#xff1a;SCC4&#xff0c;选择一个客户端&#xff0c;点击进入&#xff0c;如图&#xff1a; 一、客户端角色 客户控制&#xff1a;客户的角色&#xff08;生产性&#xff0c;测试&#xff0c;...&#xff09; 此属性表示 R/3 系统中的客户端角色。其中可能包…

SAP日常运维(Basis)

Basis基本命令介绍 Basis介绍一、用户权限管理&#xff1a;1. SU01—创建&#xff0c;修改&#xff0c;显示用户信息2. SU10—批量修改用户3. PFCG—创建&#xff0c;修改&#xff0c;显示角色信息4. SU53—权限检查5. SU21—创建&#xff0c;修改&#xff0c;显示权限类&#…

SAP SCC5删除client

1. 检查 SCC4查看SAP系统Client清单 2.删除 SQL Server SAP* DDIC 账户被锁 忘记密码如何解决用SAP* DDIC等高权限账户登入要删除的client 运行Tcode:SCC5 执行删除

sap scc4 客户端设置(设置生产机不可更改代码)

事务代码&#xff1a;SCC4&#xff0c;选择一个客户端&#xff0c;点击进入&#xff0c;如图&#xff1a;一、客户端角色 客户控制&#xff1a;客户的角色&#xff08;生产性&#xff0c;测试&#xff0c;...&#xff09; 此属性表示 R/3 系统中的客户端角色。其中可能包括以下…

SAP SCC4 客户端设置的用法

更多内容关注公众号&#xff1a;SAP Technical 各位可以关注我的公众号&#xff1a;SAP Technical 事务代码&#xff1a;SCC4&#xff0c;选择一个客户端&#xff0c;点击进入&#xff0c;如图&#xff1a; 一、客户端角色 客户控制&#xff1a;客户的角色&#xff08;生…