【51CTO编译】51CTO曾经在“与Scala的***次亲密接触 Java如影相随”为大家讲过Java于Scala。下面是一个教程文件是我在如今***或者说***的Java框架——Spring、Hibernate/JPA、Wicket、Maven和Intellij IDEA上充分利用Java语言调用Scala的项目,希望能帮助其他的Java程序员使用一个企业级的Scala项目。
在IDE上的设置
首先,下载的IntelliJ IDEA的9.0.x(社区版),因为目前它是***的Scala的IDE。然后选择File |设置|插件,选择可用的选项卡来安装Scala插件。
创建Maven项目
在IntelliJ IDEA中,选择文件|新建项目,然后选择Maven的模块创建一个Maven项目。然后修改如下所示的pom.xml。添加所有你需要的设置,建立Scala的汇编语言:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">
4.0.0
com.foo
myapp
war
1.0-SNAPSHOT
myapp Java EE 6 Webapp
http://maven.apache.org
3.0.3.RELEASE
java.net2
Repository hosting the jee6 artifacts
http://download.java.net/maven/2
scala-tools.org
Scala-tools Maven2 Repository
http://scala-tools.org/repo-releases
wpt-release
http://wicketpagetest.sourceforge.net/m2-repo/releases
wpt-snapshot
http://wicketpagetest.sourceforge.net/m2-repo/snapshots
scala-tools.org
Scala-tools Maven2 Repository
http://scala-tools.org/repo-releases
org.springframework
spring-context
${spring.version}
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-orm
${spring.version}
com.h2database
h2
1.2.120
org.hibernate
hibernate-entitymanager
3.4.0.GA
org.springframework
spring-orm
com.ttdev
wpt-core
1.5.2-SNAPSHOT
test
com.ttdev
wpt-runtime-spring
1.5.2-SNAPSHOT
javax
javaee-web-api
6.0
provided
junit
junit
3.8.2
test
org.scala-lang
scala-library
2.8.0.RC3
org.apache.wicket
wicket
1.4.9
org.slf4j
slf4j-log4j12
1.4.2
org.apache.maven.plugins
maven-compiler-plugin
2.0.2
org.scala-tools
maven-scala-plugin
2.9.1
org.apache.maven.plugins
maven-compiler-plugin
compile
compile
1.6
1.6
org.apache.maven.plugins
maven-war-plugin
2.1-beta-1
false
org.scala-tools
maven-scala-plugin
scala-compile-first
process-resources
add-source
compile
scala-test-compile
process-test-resources
testCompile
myapp
等待一段时间,IDEA将提示导入的项目是否需要更改。回答是肯定。
web.xml中设置
接下来,修改main/webapp/WEB-INF/web.xml。从而确立了Wicket的过滤器,打开Spring的JPA实体管理器和Spring监听器,进行Spring的初始化。
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
f2
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
f1
org.apache.wicket.protocol.http.WicketFilter
applicationClassName
com.foo.myapp.MyApp
f1
/app/*
f2
/*
contextConfigLocation
classpath:/beans.xml
org.springframework.web.context.ContextLoaderListener
设置Spring bean访问和调用的数据库
要定义这些Spring bean,创建main/resources的beans.xml以及一下的内容:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
读取数据库配置中persistence.xml文件。在这里,您将获得一个主目录中名为MyApp的H2数据库。因此,创建main/resources/META-INF文件的内容如下。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
org.hibernate.ejb.HibernatePersistence
/persistence>
创建Wicket的页面
在这里,您将创建一个Wicket页面显示从数据库加载一些内容。因此,创建主/Scala文件夹,右键单击它并选择新建|Scala类。命名为我的页面类和投入com.foo.myapp包中。如下所示:
package com.foo.myapp
import org.apache.wicket.markup.html._
import basic.Label
import list.{ListItem, ListView}
importorg.apache.wicket.spring.injection.annot.SpringBean
import org.apache.wicket.model.CompoundPropertyModel
class MyPage extends WebPage {
@SpringBean
var ps: ProductService = _
val productListView = newListView[Product]("productListView", ps.getAll) {
def populateItem(item: ListItem[Product]) = {
item.setModel(newCompoundPropertyModel[Product](item.getDefaultModelObject))
item.add(new Label("name"))
item.add(new Label("price"))
}
}
add(productListView)
}
请注意,在创建ProductService对象加载的文件之后使用。此外,请注意该字段被分配到一个下划线(_),Scala编译为不可初始化的,而是留在默认状态。在你将覆盖作为编译之前,执行Spring bean的页面构造。现在,创建在src/main/resources/com/foo/myapp的的mypage.html文件:
HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
创建ProductService:
右键单击在in the src/main/scala文件夹中的com.foo.myapp包并选择New | Scala的类,然后选择创建ProductService:
package com.foo.myapp
import java.util.List
trait ProductService {
def getAll: List[Product]
}
这是接口。对创造一个DefaultProductService的Scala在同一个包内进行执行操作:
package com.foo.myapp
import javax.persistence.{PersistenceContext, EntityManager}
import org.springframework.stereotype.{Service}
importorg.springframework.transaction.annotation.Transactional
importorg.springframework.beans.factory.annotation.Autowired
@Service
@Transactional
class DefaultProductService extends ProductService {
@Autowired
var products: Products = _
def getAll = products.getAll
}
请注意,把它使用类型文件命名为DAO。
创建文件的DAO
要创建的DAO,创建一个名为在同一文件夹:
package com.foo.myapp
import java.util.List
trait Products {
def getAll: List[Product]
}
然后创建在同一文件夹中的执行Scala的DefaultProducts文件:
package com.foo.myapp
import javax.persistence.{PersistenceContext, EntityManager}
import org.springframework.stereotype.Repository
import java.util.List
@Repository
class DefaultProducts extends Products {
@PersistenceContext
var em: EntityManager = _
def getAll = {
em.createQuery("select p from Product p").getResultList.asInstanceOf[List[Product]]
}
}
创建entity程序
创建entity程序并将其映射到数据库:
package com.foo.myapp
import javax.persistence.{GeneratedValue, Id, Entity}
@Entity
class Product {
@Id
@GeneratedValue
var id: Long = _
var name: String = _
var price: Double = _
}
创建Wicket的应用程序
***,创建在同一个MyApp的Scala程序:
package com.foo.myapp
import org.apache.wicket.protocol.http.WebApplication
importcom.ttdev.wicketpagetest.MockableSpringBeanInjector
class MyApp extends WebApplication {
def getHomePage = classOf[MyPage]
override def init = {
MockableSpringBeanInjector.installInjector(this)
}
}
在这里,您指定为首页我的目录,植入Spring Bean中。
运行应用程序
随着IntelliJ IDEA的版本不断改进,您将嵌入到应用服务器运行您的应用程序。这非常容易,在刚刚创建的测试com.foo.myapp的ManualTest在刚刚创建的测试com.foo.myapp包一类ManualTest/scala文件(不是main/scala文件),以下内容是:
package com.foo.myapp
importcom.ttdev.wicketpagetest.{WebAppJettyConfiguration, WicketAppJettyLauncher}
object ManualTest {
def main(args: Array[String]) {
val l = new WicketAppJettyLauncher
l.startAppInJetty(new WebAppJettyConfiguration)
}
}
要运行的应用程序,首先需要运行数据库服务器上的H2程序。所以,在http://www.h2database.com下载和解压。然后变成h2/bin和运行h2.bat(或在Linux上h2.sh)。ManualTest是在IDEA的编辑器上,在IDEA选择运行DEA。它将运行ManualTest,Jetty的运行您的应用程序。
为了测试它,请尝试通过在浏览器http://localhost:8888/app。
不知道各位感觉如何。感谢各位支持!谢谢!