项目场景:
公司基本用jfinal框架,可以快速开发;但是市场还是SpringBoot框架流行,并且生态完善;想将已有项目直接改造成SpringBoot工程浩大,并且还得让没使用过SpringBoot的人学习了解它,很是影响效率。所以想将SpringBoot集成,在不影响太多语法的情况下尽量能使用SpringBoot生态相关的权限认证等相关技术。
网上找到了一个叫 SoJpt Boot的项目能够基本解决这项问题。
问题描述
问题一:按照作者给的官方文档解决了renderJson返回数据的问题,Controller中使用的注解和action使用的注解都必须使用SpringBoot规则;但是在使用render渲染html网页的过程中出现一直找不到页面的情况(一直在找C盘的某目录)。
问题二:配置好目录找到文件之后,还是报错 “getOutputStream() has already been called for this response”
原因分析:
问题一: 仔细研究跟踪原代码发现应该配置一项模板的路径,需要配置Jfinal的模板引擎的路径,当前使用的是默认的,找不到。
问题二:应该是SpringBoot的引擎加载方式和Jfinal模板引擎都都文件造成的冲突(使用的是@Controller注解,没有@ResponseBody)
解决方案:
问题一:
/**
*
* 配置模板引擎
*/
@Override
public void configEngine(Engine me) {
String path="";
try {
path=ResourceUtils.getURL("classpath:").getPath()+"/view";
} catch (FileNotFoundException e) {
e.printStackTrace();
}
/*
子模块资源路径
path=this.getClass().getResource("").getPath();
path=path.substring(0,path.indexOf("classes")+7)+"/templates";
*/
me.setBaseTemplatePath(path);
// 这里只有选择JFinal TPL的时候才用
me.addSharedObject("RESOURCE_HOST", JFinal.me().getContextPath());
me.addSharedObject("WEB_HOST", JFinal.me().getContextPath());
// 配置共享函数模板
// me.addSharedFunction("/view/common/layout.html")
}
me.setBaseTemplatePath(ResourceUtils.getURL("classpath:").getPath()+"/view"); 这部分是我配置的一项,使用SpringBoot的ResourceUtils找到当前Resources下的目录。
问题二:将Jfinal使用的Controller都使用@RestController;或者使用@Controller+@ResponseBody的方式。
import com.jfinal.core.Controller;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class jfinalWebController extends Controller {
@RequestMapping("/jfinalWeb")
public void index()
{
set("title","标题内容111222");
String sql="select * from sys_user";
List<Record> list= Db.find(sql);
set("list",list);
render("/jfinalWeb.html");
}
@RequestMapping("/jfinalWeb/json")
public void json()
{
String sql="select * from sys_user";
List<Record> list= Db.find(sql);
renderJson(list);
}
}
作者的项目完美解决我的问题,只是在jfianl渲染模板时候没有交代清楚。