一、发现问题
在使用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 + "/";
%>
<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、数据库基本语句操作等文件打包下载:附件