JFinal 绝对路径的疑问

jianglu188 发布于 2013/12/11 17:24
阅读 6K+
收藏 3

@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" />


加载中
0
如梦技术
如梦技术

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

0
jianglu188
jianglu188

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

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

* 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" />



 根据你的提示找到了 谢谢
0
jianglu188
jianglu188

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

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

我开始那种写法每个jsp页面只需要在顶部写一次 这种的话是每个资源前面都要写 ${CONTEXT_PATH}  实际开发一般如何取舍呢 请指点 
jianglu188
jianglu188
回复 @孤独的3 : 开发是没问题啊 主要是考虑以后部署
如梦技术
如梦技术
用jetty热开发不就得了
0
JFinal
JFinal

引用来自“jianglu188”的答案

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

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

我开始那种写法每个jsp页面只需要在顶部写一次 这种的话是每个资源前面都要写 ${CONTEXT_PATH}  实际开发一般如何取舍呢 请指点 
看一下 jfinal_demo_for_jsp 项目,让 context path 为 "/" 最省事,记得 tomcat 下配置 context path 得配置为 "", jetty 下配置为 "/"
0
jianglu188
jianglu188

引用来自“JFinal”的答案

引用来自“jianglu188”的答案

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

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

我开始那种写法每个jsp页面只需要在顶部写一次 这种的话是每个资源前面都要写 ${CONTEXT_PATH}  实际开发一般如何取舍呢 请指点 
看一下 jfinal_demo_for_jsp 项目,让 context path 为 "/" 最省事,记得 tomcat 下配置 context path 得配置为 "", jetty 下配置为 "/"
这样子的话 如果我有多个项目使用jfinal开发的话 不是每一个项目需要一个tomcat啊 根项目只能有一个啊 请指点实际项目中一般的做法是怎么样 
JFinal
JFinal
多个项目如果你需要同时启动,可以启动在不同的端口下,Context Path 全部都设置为 "/"
0
孤单时会想你
孤单时会想你
/**
 * 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);
      
    }



 



0
孤单时会想你
孤单时会想你
PathKit.getWebRootPath() 你还可以利用这个获取项目根路径 来组合绝对路径



0
一路找北

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}变量了。

0
5
502829204

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

0
5
502829204

freemark:

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

普通页面直接:

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

返回顶部
顶部