JFinal 绝对路径的疑问

发布于 2021-12-02 06:08:48 字数 521 浏览 875 评论 13

@JFinal 你好,想跟你请教个问题:

jsp里面使用绝对路径一般这么写 

String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";

这样子的话每个文件都需要写 不知道使用了jfinal以后 有没有这样的配置呢 可以不用每个都写  然后从页面可以取出这个呢 比方说页面这样写 <link href="${basePath}Themes/Styles/Style.css" rel="stylesheet" />


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(13

梦里兽 2021-12-05 08:23:24

freemark:

FreeMarkerRender.getConfiguration().setSharedVariable("ctx", JFinal.me().getContextPath());

普通页面直接:

JFinal.me().getServletConxxxxx.setAttrxxxx("ctx","");自己点出来

夜司空 2021-12-05 08:23:23

然而上面根本不是最佳解决办法,每次请求都要读取值,在传递,为什么我们不把他存入上下文呢?这个服务启动又不会变的东西

清风夜微凉 2021-12-05 08:23:22

ContextPathHandler是一个办法,不过如果你用freemarker做view的话,可以在你的config类里覆盖一下afterJFinalStart方法,

@Override
public void afterJFinalStart(){
  try {
    FreeMarkerRender.getConfiguration().setSharedVariable("ctx", JFinal.me().getContextPath());
  } catch (TemplateModelException e) {
    throw new RuntimeException(e);
  }
}

把contextPath直接做为一个freemarker的全局变量,这样你的模板中不用写任何东西,直接就可以使用${ctx}变量了。

各自安好 2021-12-05 08:23:17
PathKit.getWebRootPath() 你还可以利用这个获取项目根路径 来组合绝对路径

瑾兮 2021-12-05 08:22:44
/**
 * Copyright (c) 2011-2013, James Zhan 詹波 (jfinal@126.com).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.jfinal.ext.handler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jfinal.handler.Handler;
import com.jfinal.kit.StringKit;

/**
 * Provide a context path to view if you need.
 * <br>
 * Example:<br>
 * In JFinalFilter: handlers.add(new ContextPathHandler("CONTEXT_PATH"));<br>
 * in freemarker: <img src="${BASE_PATH}/images/logo.png" />
 */
public class ContextPathHandler extends Handler {
	
	private String contextPathName;
	
	public ContextPathHandler() {
		contextPathName = "CONTEXT_PATH";
	}
	
	public ContextPathHandler(String contextPathName) {
		if (StringKit.isBlank(contextPathName))
			throw new IllegalArgumentException("contextPathName can not be blank.");
		this.contextPathName = contextPathName;
	}
	
	public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
		request.setAttribute(contextPathName, request.getContextPath());
		nextHandler.handle(target, request, response, isHandled);
	}
}

handler里加入
    @Override
    public void configHandler(Handlers me) {
        //该处理器将request.getContextPath()存储在BASE_PATH中,可以解决路径问题
        ContextPathHandler path = new ContextPathHandler("BASE_PATH");
        me.add(path);
      
    }

 

刘备忘录 2021-12-05 08:13:41

多个项目如果你需要同时启动,可以启动在不同的端口下,Context Path 全部都设置为 "/"

瑾兮 2021-12-05 08:13:06

没必要 这么搞 有个 ContextPathHandler 加入到全局就OK

混吃等死 2021-12-05 07:33:15

没必要 这么搞 有个 ContextPathHandler 加入到全局就OK

梦里兽 2021-12-05 06:59:40

用jetty热开发不就得了

清欢 2021-12-05 05:06:25

回复
开发是没问题啊 主要是考虑以后部署

刘备忘录 2021-12-04 05:41:25

没必要 这么搞 有个 ContextPathHandler 加入到全局就OK

好听的两个字的网名 2021-12-03 08:53:21

引用来自“孤独的3”的答案

没必要 这么搞 有个 ContextPathHandler 加入到全局就OK

冷清清 2021-12-02 07:28:43

没必要 这么搞 有个 ContextPathHandler 加入到全局就OK

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文