jfinal enjoy 如何配置JSP共用??

如下配置  jsp 无法正常访问使用,导致好多老页面不能正常访问。

<bean id="viewResolver" class="com.jfinal.template.ext.spring.JFinalViewResolver">

<!-- 是否热加载模板文件 -->

<property name="devMode" value="true"/>

<!-- 配置shared function,多文件用逗号分隔 -->

<property name="sharedFunction"></property>


<!-- 是否支持以 #(session.value) 的方式访问 session -->

<property name="sessionInView" value="true"/>

<property name="prefix" value="/WEB-INF/views/jsp/"/>

<property name="suffix" value=".html"/>

<property name="order" value="1"/>

<property name="contentType" value="text/html; charset=utf-8"/>

</bean>


<!-- 定义视图文件解析 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/views/html/"/>

<property name="suffix" value=".jsp"/>

<!-- 加载顺序 -->

<property name="order" value="2"/>

</bean>


评论区

JFinal

2017-09-03 23:14

在 jfinal 中很容易, render(String) 就是用 enjoy,而 renderJsp(String) 就是在用 jsp

而在 spring 中,貌似是通过一个叫 order 的配置,好多年不用 spring,没法帮到你,建议找找相关资料

doocal

2017-09-03 23:29

@JFinal 汗,上面已经配置了order了,但是全进 JFinalViewResolver 视图了,然后又找不到页面就报错了。进不了JSP的视图

JFinal

2017-09-03 23:39

@doocal order 反着配置试试,先找 jsp

doocal

2017-09-04 08:06

@JFinal 试过了不行,我再研究研究。。。。

doocal

2017-09-04 14:42

@杜福忠 没有用 jfinal ,只用了 enjoy。

doocal

2017-09-04 22:21

@JFinal 好像就是enjoy配不出来,我试了velocity,没有问题。。。。头痛。。

doocal

2017-09-04 22:35

@JFinal 不是新项目,新项目全用enjoy了。

JFinal

2017-09-04 22:36

@doocal 注意看一下 JFinalViewResolver 源代码中的构造方法,里面已经设置 order 为 0 了:
setOrder(0);

可能是这个造成的你在 xml 中配置 order 无效,试一下将 JFinalViewResolver 拷贝出来,做成自己的 MyViewResolver,然后改一下构造方法,最后在 xml 配置中用这个 MyViewResolver 代替 JFinalViewResolver

记得搞定后回来分享一下

JFinal

2017-09-04 22:38

如果你确定是构造方法中 setOrder(0) 去掉就可以解决问题,jfinal 3.3 考虑注掉这行代码,一定要回来再反馈

JFinal

2017-09-04 22:40

本质上来说,你完全可以拿着 JFinalViewResolver 与 JFinalView 这两个类的源代码,任意去改成符合自己需求的在 spring 中的用法

JFinalViewResolver 与 JFinalView 这两个类就是为懒人而准备的,由于我多年不用 spring,所以 spring 的很多用法不记得了

doocal

2017-09-04 23:00

@JFinal 跟 setOrder(0) 关系不大,按照网上说的 InternalResourceViewResolver 必须放在最后,也就是先执行 enjoy>jsp。

JFinal

2017-09-04 23:09

@doocal 如果是这样,那么 setOrder(0) 的意义何在呢? 或者这个 setOrder(int) 方法需要与别的方法配合使用

或许需要与 JFinalView 继承的 AbstractTemplateView 之内的 checkResource(...) 配合,所以你可以改造一下 JFinalView,在里面添加一个 checkResource(...) 方法,判断模板的扩展名,如果是 ".jsp" , 直接 return false 就完事了

JFinal

2017-09-04 23:30

@doocal 看一下这篇博客:http://elim.iteye.com/blog/1770554

其中后面的一小节《视图解析器链》这一部分谈到了:
第一个进行解析的将是ViewResolver链中order值最小的那个。当一个ViewResolver在进行视图解析后返回的View对象是null的话就表示该ViewResolver不能解析该视图,这个时候如果还存在其他order值比它大的ViewResolver就会调用剩余的ViewResolver中的order值最小的那个来解析该视图,依此类推。

所以,在 JFinalViewResolver 之中再添加一个 buildView(String) 方法,内容大致如下:
if (getSuffix().equals(".jsp")) {
return null;
} else {
return super.buildView(...);
}

JFinal

2017-09-04 23:35

@doocal 不得不吐槽, spring 太过度设计,类的层次很深,一个 Resover 实现类的继承层次高达六七层,每层都添加了点方法用于继承类覆盖来添加功能

愿景很好,但根本不实用,得先搞懂这六七层的继承关系,以及这六七层类中各个方法之间的依赖/调用关系,并理解这种依赖机制下可以实现的功能,才知道如何去扩展

doocal

2017-09-05 07:52

@JFinal 嗯,感谢 JFinal 不厌其烦的解答。不过不管是JSP还是enjoyt和其它模板引擎混用(可能性)。JFinalViewResolver 在spring下应该按 spring的规则返回,不然问题就跟我现在遇到的一样了。

doocal

2017-09-05 10:59

@JFinal 你的这个(如下)逻辑看似没有问题,我调试的时候有些许问题,首先断点进来的时候虽然可以拿到扩展名,但是拿到的是enjoy 渲染的 .html 的扩展名,因为此时此视图渲染并未进入jsp的视图,所以这个 if 理论上是不是会返回return null 的。

if (getSuffix().equals(".jsp")) {
return null;
} else {
return super.buildView(...);
}

doocal

2017-09-07 09:50

@JFinal 在 JFinalViewResolver 添加一个 loadView ,check 一下文件是否存在。不存在返回null 才符合spring 视图链接逻辑,经测试没有问题。这个是否应该算是enjoy的一个小问题,enjoy 3.3 是否加入这样的逻辑,要不然在 spring 下 enjoy只要order值足够小,后面的视图都将无法使用。

@Override
protected View loadView(String viewName, Locale locale) throws Exception {
if (getSuffix().equals(".html")) {
File file = "拼接的路径.....";
if (!file.exists()) {
return null;
}
return super.loadView(viewName, locale);
} else {
return null;
}
}

JFinal

2017-09-07 15:23

@doocal 这也就是我前面所说的,由于 spring 的类层次太深,可扩展方法彼此之间的关联与规则繁杂,造成了扩展困难

所以,你花了很长时间才知道是通过 loadView 来实现这个 setOrder(...) 配合所实现的混合 view 功能

这个功能会考虑做到 jfinal 3.3 之中

热门反馈

扫码入社