Jfinal使用Velocity视图部署到tomcat上velocity.log (Permission denied)解决

原由:

本身在搭建一个关于 EVE Online 游戏 的网站,框架用的是Jfinal的,页面模板用的是velocity,在本身开发环境上一切正常,而后部署到线上环境后出现错误。线上的环境是Ubuntu14+Nginx+Mysql+Tomcat。html

错误:

Caused by: java.io.FileNotFoundException: velocity.log (Permission denied)java

定位:

网上也有相似许多的问题,也有分析,我就不细说。总结起来就是:web

  • 1.使用时没有设置velocity log的任何参数,由于系统中存在Log4j的包,因此会使用Log4jChute作为Log记录的对象返回。ajax

  • 2.在初始化Log4jChute时,没有设置logger.name,初始化Logger时,会使用默认的velocity.log作为文件输出路径sql

  • 3.File file = new File("velocity.log"),是基于当前jvm的current work,也就是user.dir属性。apache

而我又是将运行web跑在普通用户权限,可是安装tomcat是Root,因此权限出错。 因此第一次访问网站页面的时候当渲染页面时候,Velocity就会尝试创建日志,可是因为上面的问题没法建立。tomcat

解决方案

1.创建velocity的配置文件。(因为我也是第一次使用,根据Jfianl手册并无找到velocity的配置文件须要怎么放和修改代码就没有使用,回头有空去研究一下。)服务器

2.代码修改:

1.根据Jfinal的代码跳转:
	Controller.renderVelocity(view)==>renderFactory.getVelocityRender(view)==>new VelocityRender(view)
	发现最后是跳到了一个VelocityRende类中,阅读源代码后发现这个调用render()是Jfinal调用的,init也是。不过Jfinal 给留了一个setProperties()方法。因而就想到在能够在项目中动态的添加一个配置就能够了。

2.代码:
建立一个继承Controller的类,名为BaseController。
```
public class BaseController extends Controller {
	public Logger logger =  Logger.getLogger(this.getClass());
	@Override
	public void renderVelocity(String view) {
		logger.info("Now is Uing Custom VelocityRender Properties");
		if (Velocity.getProperty(VelocityEngine.RUNTIME_LOG_LOGSYSTEM_CLASS) == null ){
			Properties properties = new Properties();
			properties.setProperty(VelocityEngine.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.NullLogChute");
			VelocityRender.setProperties(properties);
		}
		super.renderVelocity(view);
	}

}
```
让本身的Controller继承BaseController。

```
public class indexController extends BaseController {
	public void index() {
 		setAttr("App", App.getInstance());
		setAttr("description", "Eve Dps 配装器");
		renderVelocity("index.html");
	}
}
```

3.关键:
这里对即将进行Velocity.init(properties);的properties添加参数。properties.setProperty(VelocityEngine.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.NullLogChute");我这里是直接关闭了输出。

##总结: 这样以前的线上服务器的错误就解决了。可是其实我并不以为处理这个问题的方法这样是最好的,我以为应该仍是能够设置配置文件进行设置的。框架

记录这个问题的解决方法我也是想给本身作个抛砖引玉的提示。jvm

##感谢: @jfinal Jfinal框架真的挺方便的,不少时候我本身在作小项目是否开发起来很是的快,真的很是感谢做者。固然上面的解决问题的看法也是我我的很是浅显的看法甚至有多是错误的,但愿你们不要见笑,我也在一边的开发,一遍阅读其代码,再次感谢。 ##最后: 也想分享下本身的这个网站,可是网站还没好,就不发了。

主要的框架就是Jfinal,整个网站都是经过Api来获取数据的。页面只是显示一点静态的资料,甚至能够直接用html来代替,全部数据都是经过ajax来获取请求的,验证时用签名验证,时间戳+token作过时和重放攻击的过滤。

有个问题想请教下你们,关于前段你们都是怎么写的,我都是一个个代码敲得感受很累,不知道怎么开发是简单快捷的。

相关文章
相关标签/搜索