1. 程式人生 > >jfinal的絕對路徑和action請求路徑新增資料夾名稱而導致"404 not found"的問題

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

頁面新增絕對路徑的設定,在head新增:

       <%
	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、資料庫基本語句操作等檔案打包下載:附件