摘要:Play2.5 中已经大量使用Guice注入,连2.3中的GlobalSetting都舍弃了。有了比较大的变化,其中最大的一个变化就是路由生成的变化,在2.3中只有staticRouteGenerator 一种静态路由生成方法,在2.4中已经加入了InjectedRouteGenerator 注入路由生成方式,但默认的方式还是staticRouteGenerator ,在2.5中默认的路由方式已经是注入方式了。
一、 建立具有子工程的项目
1. 首先新建一个play-java类型的项目,使用最新的activator的话默认的play版本是2.5.3 . 在项目根目录下建立一个modules 文件夹,在该文件夹下 建立一个名为common的工程、
2. 先把common工程中build.sbt中的 lazy val root = (project in file(".")).enablePlugins(PlayJava) 删掉。在sbt.version =0.13.5 下可以不用删除 但是如果sbt的版本高于此版本的话,要删掉 子工程的此处定义,不然会报错 No project found in root.
3.修改common工程conf目录下的routes 改名为 common.routes。此外为了防止类名冲突,最好将子工程app、views下的文件重新放入到另外的pacakge下。
4、修改父工程下的route文件 添加 -> /common common.routes 使其指向子工程路由
5、修改父工程的工程定义文件 build.sbt ,定义子工程
lazy val common =(project in file("modules/common")).enablePlugins(PlayJava)
lazy val root = (project in file(".")).enablePlugins(PlayJava)
.aggregate(common).dependsOn(common)
最后使用 localhost:9000/common 测试一下
二、 子工程中使用静态文件
1、如前所述play2.5 的路由生成已经变化,在play.2.5中已经不存在 contollers.Assets类的静态at方法了。使用Assets需要注入其实现类(play已经实现)。就像controller 路由一样,子工程使用静态文件需要使静态文件的路由指向一个返回路由的类方法。 在2.5中如下
package controllers.common;
import com.google.inject.Inject;
import controllers.Assets.Asset;
import play.api.mvc.Action;
import play.api.mvc.AnyContent;
import play.mvc.Controller;
public class Assets extends Controller {
@Inject
controllers.Assets asset; //注入实现类
public Action<AnyContent> versioned(String path,Asset file){
return asset.versioned(path,file); //也可以使用at方法
}
}
common的路由如下 :
GET /assets/*file controllers.common.Assets.versioned(path="<span style="color:#FF0000;">/public/lib/common</span>", file: Asset)
注意子工程的 path 这里跟2.3不一样,需要”publi/lib/“+子工程名,file要为Asset类型
2、反向路由使用
在模版文件中可以这样使用
<script src="@controllers.common.routes.Assets.versioned("javascript/bootstrap.min.js")"></script>
备注:如果在views包下新建一个common文件夹,在其中有一个 home.scala.html文件的,那么在controller中这样
调用 views.html.common.home.render("common")