有关Jfinal在jetty(开发),tomcat(发布)存在的问题解决心得。

摘要: 之前在jetty环境下开发,发现很是方便。也尝试在tomcat下发布过一次,出现小问题,也没留意。今天正式发布到tomcat实在头疼,痛定思痛,折腾了2个小时,发现很多人都有疑惑,本着分享的精神,特此分享。


首先熟悉一下tomcat的发布配置相关:

具体的发布配置步骤:

当然,还有jar包的问题,由于使用到了web容器的环境变量,所以jetty的时候需要引用 jetty-server-8.1.8.jar 包;如果tomcat的时候需要引用 servlet-api.jar包,必须二选一的引用。

题外话,如果牵扯到jfinal上传文件的话,必须要有cos.jar 的包。


我的项目部署:

配置文件:tomcat../conf/server.xml

<Host  ..

<Context path="" reloadable="false" docBase="E:\www\gmb"/>

</Host>

原本是没有问题的,不过詹总推荐把tomcat配置的path留空 " ",那么问题来了。很多时候我们前端的action请求是以项目名称为前缀的,这样就等于少了一层(me.add(new ContextPathHandler("ctx")) 取到的是 " ")。

有人就会说了,path那就不留空 ,根据项目名称来,如 "/gmb",可是问题又来了,前端访问的时候,就变成了:http://localhost:8080/gmb/gmb 才能访问了,不要忘了tomcat下面配置的 docBase 的物理地址。


没错,就是这里的问题,折腾的我大半夜的现在才发这个心得。解决办法呢,就是 在 afterJFinalStart 中进行配置 这个项目前缀到 上下文环境中,JFinal.me().getServletContext().setAttribute("ctx", "/gmb");


Tomcat绑定多个域名:

<Host name="www.web1.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">      	
     <Context path="" reloadable="false" docBase="d:\www\web1"/>      
</Host>      
<Host name="www.web2.com"  appBase="webapps"  unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">      	
     <Context path="" reloadable="false" docBase="d:\www\web2"/>      
 </Host>

最后:

JFinal.me().getServletContext().setAttribute("ctx", "/gmb");

这样的方便之处就在于,本地环境使用Jetty(引用jetty的jar包),项目名称配置为: "/gmb";

访问:localhost:8080/gmb


服务器端使用tomcat(引用tomcat的jar包),项目名称配置为:“/”,然后就不需要输入项目名称访问,尤其是绑定域名,tomcat端口改为80,最方便不过了。

访问:www.gmb.com


比如我的基于jfinal的个人股票分析网站 www.matols.com

评论区

matol

2016-06-15 16:55

好处就在于兼容发布环境和本地测试环境,稍微麻烦的就是需要切换jar,

yjyhj16898

2016-07-06 16:47

@matol 其实没这么麻烦,Tomcat+JRebel开发体验比jetty还要好

renzy

2016-07-12 10:07

jetty启动: JFinal.start("WebRoot", 80, "/gmb", 5);

123123111

2016-07-12 11:16

咔嚓

2017-10-10 14:30

@matol 那大牛的意思发布还是想普通发布到tomcat了?步骤是一样的对吧