jfinal的绝对路径和action请求路径添加文件夹名称而导致"404 not found"的问题

版权声明:本文为博主原创文章,如需转载,请标明出处。 https://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 + "/";
       %>
	<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、数据库基本语句操作等文件打包下载:附件

   





上一篇:bootstrap 和 easyui在使用table分页的时候使用参数的异同


下一篇:pickle,json序列化