jfinal的絕對路徑和action請求路徑新增資料夾名稱而導致"404 not found"的問題
一、發現問題
在使用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為:
404問題;
那麼,問題出現在哪裡呢?
首先,由於正常jsp頁面請求的時候,action是能夠正常訪問到的,這就說明,jfinal的路由配置是沒有
問題的;
其次,jfinal的action攔截器是在捕獲正確的action之後才觸發的,所以與Interceptor攔截器無關;
那麼,問題就出現在jsp頁面上了,然後自己在仔細翻閱了一下jfinal的api使用手冊,搜尋一下網頁上關
於jfinal對jsp頁面的設計方面的問題,然後找到了問題:
問題所在:
原來,jfinal的jsp頁面請求的action路徑都預設以根路徑為訪問前提,如果在根目錄下有自創的資料夾,
則在訪問的時候action路徑會自動加上jsp所在資料夾的路徑名稱,所以檢視層一般都需要設定專案的根路徑
basePath作為訪問的前提,也就是說,必須在jsp
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<base href="<%=basePath%>" />
加入上面這個然後訪問的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的頁面引用如下:
<a href="${basePath}/Main/User/userIndex">使用者測試</a>
三、
PS:的名稱仔細閱讀jfinal的使用手冊api,解決問題事半功倍。
jfinal3.0的jar包、demo、api、資料庫基本語句操作等檔案打包下載:附件