轉載自:http://blog.csdn.net/alan_liuyue/article/details/70224648
一、發現問題
在使用jfinal框架的時候,有的jsp頁面的action請求是正常的,但有的jsp頁面有時候會出現一個問題,
就是請求的action或者url會和上一個path的action添加jsp所在的文件夾名稱而導致在新的action無法獲得相
應請求出現404的問題,例如:
正常jsp的請求:Main/User/userIndex,url為:http://localhost:88/test/Main/User/userIndex;
出現問題的jsp頁面的請求:Main/Company/companyIndex,訪問的url為:
http://localhost:88/test/Main/User/Main/Company/companyIndex;疊加了文件夾的名稱從而導致action的
404問題;
那么,問題出現在哪里呢?
首先,由於正常jsp頁面請求的時候,action是能夠正常訪問到的,這就說明,jfinal的路由配置是沒有
問題的;
其次,jfinal的action攔截器是在捕獲正確的action之后才觸發的,所以與Interceptor攔截器無關;
那么,問題就出現在jsp頁面上了,然后自己在仔細翻閱了一下jfinal的api使用手冊,搜索一下網頁上關
於jfinal對jsp頁面的設計方面的問題,然后找到了問題:
問題所在:
原來,jfinal的jsp頁面請求的action路徑都默認以根路徑為訪問前提,如果在根目錄下有自創的文件夾,
則在訪問的時候action路徑會自動加上jsp所在文件夾的路徑名稱,所以視圖層一般都需要設置項目的根路徑
basePath作為訪問的前提,也就是說,必須在jsp頁面添加絕對路徑的設置,在head添加:
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
加入上面這個然后訪問的action就正常了。
二、解決問題
然后,另外一個問題又來了,是不是我的每個jsp頁面都要添加這幾行代碼,是不是太麻煩了?
有沒有什么解決的方法?
這里提供幾個解決jfinal絕對路徑basePath的方法:
1.將basePath的這幾行代碼分離出來,單獨作為一個jsp頁面,然后在每個jsp頁面的頭部都插入進去,
使用方法:
basePath的jsp路徑為:/jspUtil/basePathUtil.jsp 則在請求action的jsp頁面頭部可以使用:
<%@ include file="/jspUtil/basePathUtil.jsp"%>引用該jsp頁面;
2.在jfinal的處理器上配置basePath,然后在頁面上直接引用就可以了,
使用方法:jfinal的處理器配置如下:
/** 配置處理器 */
public void configHandler(Handlers me) {
me.add(new ContextPathHandler("basePath"));
然后在jsp的頁面引用如下:
<span style="font-size:18px;"> <a href="${basePath}/Main/User/userIndex">用戶測試</a></span>