用Java在各種框架下編譯Scala項(xiàng)目
【51CTO編譯】51CTO曾經(jīng)在“與Scala的***次親密接觸 Java如影相隨”為大家講過Java于Scala。下面是一個(gè)教程文件是我在如今***或者說***的Java框架——Spring、Hibernate/JPA、Wicket、Maven和Intellij IDEA上充分利用Java語言調(diào)用Scala的項(xiàng)目,希望能幫助其他的Java程序員使用一個(gè)企業(yè)級(jí)的Scala項(xiàng)目。
在IDE上的設(shè)置
首先,下載的IntelliJ IDEA的9.0.x(社區(qū)版),因?yàn)槟壳八?**的Scala的IDE。然后選擇File |設(shè)置|插件,選擇可用的選項(xiàng)卡來安裝Scala插件。
創(chuàng)建Maven項(xiàng)目
在IntelliJ IDEA中,選擇文件|新建項(xiàng)目,然后選擇Maven的模塊創(chuàng)建一個(gè)Maven項(xiàng)目。然后修改如下所示的pom.xml。添加所有你需要的設(shè)置,建立Scala的匯編語言:
- <project xmlnsxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.foo</groupId>
- <artifactId>myapp</artifactId>
- <packaging>war</packaging>
- <version>1.0-SNAPSHOT</version>
- <name>myapp Java EE 6 Webapp</name>
- <url>http://maven.apache.org</url>
- <properties>
- <spring.version>3.0.3.RELEASE</spring.version>
- </properties>
- <repositories>
- <repository>
- <id>java.net2</id>
- <name>Repository hosting the jee6 artifacts</name>
- <url>http://download.java.net/maven/2</url>
- </repository>
- <repository>
- <id>scala-tools.org</id>
- <name>Scala-tools Maven2 Repository</name>
- <url>http://scala-tools.org/repo-releases</url>
- </repository>
- <repository>
- <id>wpt-release</id>
- <url>http://wicketpagetest.sourceforge.net/m2-repo/releases</url>
- </repository>
- <repository>
- <id>wpt-snapshot</id>
- <url>http://wicketpagetest.sourceforge.net/m2-repo/snapshots</url>
- </repository>
- </repositories>
- <pluginRepositories>
- <pluginRepository>
- <id>scala-tools.org</id>
- <name>Scala-tools Maven2 Repository</name>
- <url>http://scala-tools.org/repo-releases</url>
- </pluginRepository>
- </pluginRepositories>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-web</artifactId>
- <version>${spring.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-orm</artifactId>
- <version>${spring.version}</version>
- </dependency>
- </dependencies>
- </dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- <version>1.2.120</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-entitymanager</artifactId>
- <version>3.4.0.GA</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-orm</artifactId>
- </dependency>
- <dependency>
- <groupId>com.ttdev</groupId>
- <artifactId>wpt-core</artifactId>
- <version>1.5.2-SNAPSHOT</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.ttdev</groupId>
- <artifactId>wpt-runtime-spring</artifactId>
- <version>1.5.2-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>javax</groupId>
- <artifactId>javaee-web-api</artifactId>
- <version>6.0</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.2</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.scala-lang</groupId>
- <artifactId>scala-library</artifactId>
- <version>2.8.0.RC3</version>
- </dependency>
- <dependency>
- <groupId>org.apache.wicket</groupId>
- <artifactId>wicket</artifactId>
- <version>1.4.9</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.4.2</version>
- </dependency>
- </dependencies>
- <build>
- <pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.0.2</version>
- </plugin>
- <plugin>
- <groupId>org.scala-tools</groupId>
- <artifactId>maven-scala-plugin</artifactId>
- <version>2.9.1</version>
- </plugin>
- </plugins>
- </pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <executions>
- <execution>
- <phase>compile</phase>
- <goals>
- <goal>compile</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <version>2.1-beta-1</version>
- <configuration>
- <failOnMissingWebXml>false</failOnMissingWebXml>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.scala-tools</groupId>
- <artifactId>maven-scala-plugin</artifactId>
- <executions>
- <execution>
- <id>scala-compile-first</id>
- <phase>process-resources</phase>
- <goals>
- <goal>add-source</goal>
- <goal>compile</goal>
- </goals>
- </execution>
- <execution>
- <id>scala-test-compile</id>
- <phase>process-test-resources</phase>
- <goals>
- <goal>testCompile</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- <finalName>myapp</finalName>
- </build>
- </project>
等待一段時(shí)間,IDEA將提示導(dǎo)入的項(xiàng)目是否需要更改?;卮鹗强隙?。
#p#
web.xml中設(shè)置
接下來,修改main/webapp/WEB-INF/web.xml。從而確立了Wicket的過濾器,打開Spring的JPA實(shí)體管理器和Spring監(jiān)聽器,進(jìn)行Spring的初始化。
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
- <filter>
- <filter-name>f2</filter-name>
- <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
- </filter>
- <filter>
- <filter-name>f1</filter-name>
- <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
- <init-param>
- <param-name>applicationClassName</param-name>
- <param-value>com.foo.myapp.MyApp</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>f1</filter-name>
- <url-pattern>/app/*</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>f2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:/beans.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- </web-app>
#p#
設(shè)置Spring bean訪問和調(diào)用的數(shù)據(jù)庫
要定義這些Spring bean,創(chuàng)建main/resources的beans.xml以及一下的內(nèi)容:
- <?xml version="1.0" encoding="UTF-8" ?>
- <beansxmlnsbeansxmlns="http://www.springframework.org/schema/beans"
- 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">
- <context:component-scan base-package="com.foo.myapp"/>
- <bean id="emf"class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
- <property name="persistenceXmlLocation"value="classpath:/META-INF/my-persistence.xml"/>
- </bean>
- <bean id="transactionManager"class="org.springframework.orm.jpa.JpaTransactionManager">
- <property name="entityManagerFactory" ref="emf"/>
- </bean>
- <tx:annotation-driven />
- </beans>
讀取數(shù)據(jù)庫配置中persistence.xml文件。在這里,您將獲得一個(gè)主目錄中名為MyApp的H2數(shù)據(jù)庫。因此,創(chuàng)建main/resources/META-INF文件的內(nèi)容如下。
- <persistencexmlnspersistencexmlns="http://java.sun.com/xml/ns/persistence"
- 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">
- <persistence-unit name="myapp" transaction-type="RESOURCE_LOCAL">
- <provider>org.hibernate.ejb.HibernatePersistence</provider>
- <properties>
- <propertynamepropertyname="hibernate.connection.driver_class"value="org.h2.Driver"/>
- <property name="hibernate.connection.url"value="jdbc:h2:tcp://localhost/~/myapp"/>
- <propertynamepropertyname="hibernate.connection.username" value="sa"/>
- <propertynamepropertyname="hibernate.connection.password" value=""/>
- <property name="hibernate.dialect"value="org.hibernate.dialect.H2Dialect"/>
- <property name="hibernate.hbm2ddl.auto"value="create"/>
- </properties>
- </persistence-unit>
- /persistence>
#p#
創(chuàng)建Wicket的頁面
在這里,您將創(chuàng)建一個(gè)Wicket頁面顯示從數(shù)據(jù)庫加載一些內(nèi)容。因此,創(chuàng)建主/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)
- }
請(qǐng)注意,在創(chuàng)建ProductService對(duì)象加載的文件之后使用。此外,請(qǐng)注意該字段被分配到一個(gè)下劃線(_),Scala編譯為不可初始化的,而是留在默認(rèn)狀態(tài)。在你將覆蓋作為編譯之前,執(zhí)行Spring bean的頁面構(gòu)造?,F(xiàn)在,創(chuàng)建在src/main/resources/com/foo/myapp的的mypage.html文件:
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <table border="1">
- <tr wicket:id="productListView">
- <td wicket:id="name"></td>
- <td wicket:id="price"></td>
- </tr>
- </table>
- </html>
#p#
創(chuàng)建ProductService:
右鍵單擊在in the src/main/scala文件夾中的com.foo.myapp包并選擇New | Scala的類,然后選擇創(chuàng)建ProductService:
- package com.foo.myapp
- import java.util.List
- trait ProductService {
- def getAll: List[Product]
- }
這是接口。對(duì)創(chuàng)造一個(gè)DefaultProductService的Scala在同一個(gè)包內(nèi)進(jìn)行執(zhí)行操作:
- 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
- }
請(qǐng)注意,把它使用類型文件命名為DAO。
創(chuàng)建文件的DAO
要?jiǎng)?chuàng)建的DAO,創(chuàng)建一個(gè)名為在同一文件夾:
- package com.foo.myapp
- import java.util.List
- trait Products {
- def getAll: List[Product]
- }
然后創(chuàng)建在同一文件夾中的執(zhí)行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]]
- }
- }
#p#
創(chuàng)建entity程序
創(chuàng)建entity程序并將其映射到數(shù)據(jù)庫:
- package com.foo.myapp
- import javax.persistence.{GeneratedValue, Id, Entity}
- @Entity
- class Product {
- @Id
- @GeneratedValue
- var id: Long = _
- var name: String = _
- var price: Double = _
- }
創(chuàng)建Wicket的應(yīng)用程序
***,創(chuàng)建在同一個(gè)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中。
運(yùn)行應(yīng)用程序
隨著IntelliJ IDEA的版本不斷改進(jìn),您將嵌入到應(yīng)用服務(wù)器運(yùn)行您的應(yīng)用程序。這非常容易,在剛剛創(chuàng)建的測(cè)試com.foo.myapp的ManualTest在剛剛創(chuàng)建的測(cè)試com.foo.myapp包一類ManualTest/scala文件(不是main/scala文件),以下內(nèi)容是:
- package com.foo.myapp
- importcom.ttdev.wicketpagetest.{WebAppJettyConfiguration, WicketAppJettyLauncher}
- object ManualTest {
- def main(args: Array[String]) {
- val l = new WicketAppJettyLauncher
- l.startAppInJetty(new WebAppJettyConfiguration)
- }
- }
要運(yùn)行的應(yīng)用程序,首先需要運(yùn)行數(shù)據(jù)庫服務(wù)器上的H2程序。所以,在http://www.h2database.com下載和解壓。然后變成h2/bin和運(yùn)行h2.bat(或在Linux上h2.sh)。ManualTest是在IDEA的編輯器上,在IDEA選擇運(yùn)行DEA。它將運(yùn)行ManualTest,Jetty的運(yùn)行您的應(yīng)用程序。
為了測(cè)試它,請(qǐng)嘗試通過在瀏覽器http://localhost:8888/app。
不知道各位感覺如何。感謝各位支持!謝謝!
原文地址:agileskills2.org/blog/2010/06/19/getting-started-with-scala-spring-hibernate-wicket/
原文名:Getting started with Scala, Spring, Hibernate & Wicket
【51CTO譯稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載,合作媒體轉(zhuǎn)載請(qǐng)注明原文出處及作者!】
【編輯推薦】