#57 受PlayFramework刺激,简化合并mini-web与mini-service项目成为quickstart项目
This commit is contained in:
@@ -1,2 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<OrmDiagram null.className="org.jboss.tools.hibernate.ui.diagram.editors.model.MessageShape" null.connectionsVisibilityAssociation="true" null.connectionsVisibilityClassMapping="true" null.connectionsVisibilityForeignKeyConstraint="true" null.connectionsVisibilityPropertyMapping="true" null.consoleConfig_name="mini-web" null.deepIntoSort="false" null.entityNames_size="0" null.expanded="true" null.flagManhattanConnectionRouter="true" null.gridEnabled="false" null.indent="0" null.rulersVisibility="false" null.selected="false" null.snapToGeometry="false" null.visibileChildren="true" null.visible="true" null.x="24" null.y="17" null.zoom="1.0"/>
|
||||
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE hibernate-configuration PUBLIC
|
||||
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
|
||||
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
|
||||
<hibernate-configuration>
|
||||
<session-factory>
|
||||
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
|
||||
<property name="hibernate.connection.url">jdbc:h2:file:~/.h2/mini-web4;AUTO_SERVER=TRUE</property>
|
||||
<property name="hibernate.connection.username">sa</property>
|
||||
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
|
||||
</session-factory>
|
||||
</hibernate-configuration>
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >
|
||||
|
||||
<hibernate-reverse-engineering>
|
||||
<table-filter match-name="ACCT_.*"/>
|
||||
<table-filter match-name=".*" exclude="true"/>
|
||||
</hibernate-reverse-engineering>
|
||||
+2
-2
@@ -14,8 +14,8 @@
|
||||
<packaging>pom</packaging>
|
||||
|
||||
<modules>
|
||||
<module>mini-service</module>
|
||||
<module>mini-web</module>
|
||||
<module>quickstart</module>
|
||||
<module>showcase</module>
|
||||
<module>oldstuff</module>
|
||||
</modules>
|
||||
</project>
|
||||
@@ -0,0 +1,2 @@
|
||||
eclipse.preferences.version=1
|
||||
encoding/<project>=UTF-8
|
||||
@@ -0,0 +1,9 @@
|
||||
@echo off
|
||||
echo [INFO] Use maven eclipse-plugin download jars and generate eclipse project files.
|
||||
echo [Info] Please add "-Declipse.workspace=<path-to-eclipse-workspace>" at end of mvn command.
|
||||
|
||||
cd %~dp0
|
||||
cd ..
|
||||
call mvn eclipse:clean eclipse:eclipse
|
||||
cd bin
|
||||
pause
|
||||
@@ -0,0 +1,11 @@
|
||||
@echo off
|
||||
echo [INFO] Use maven jetty-plugin run the project.
|
||||
|
||||
cd %~dp0
|
||||
cd ..
|
||||
|
||||
set MAVEN_OPTS=%MAVEN_OPTS% -XX:MaxPermSize=128m
|
||||
call mvn jetty:run -Djetty.port=8080
|
||||
|
||||
cd bin
|
||||
pause
|
||||
@@ -0,0 +1,10 @@
|
||||
@echo off
|
||||
echo [INFO] Re-create the schema and provision the sample data.
|
||||
|
||||
cd %~dp0
|
||||
cd ..
|
||||
|
||||
call mvn antrun:run -Prefresh-db
|
||||
|
||||
cd bin
|
||||
pause
|
||||
@@ -0,0 +1,11 @@
|
||||
@echo off
|
||||
echo [INFO] run smoking functional test.
|
||||
|
||||
cd %~dp0
|
||||
cd ..
|
||||
|
||||
set MAVEN_OPTS=%MAVEN_OPTS% -XX:MaxPermSize=128m
|
||||
call mvn clean test -Psmoke-test
|
||||
|
||||
cd bin
|
||||
pause
|
||||
@@ -0,0 +1,520 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>org.springside.examples</groupId>
|
||||
<artifactId>quickstart</artifactId>
|
||||
<version>4.0.0.RC4-SNAPSHOT</version>
|
||||
<packaging>war</packaging>
|
||||
<name>Springside :: Example :: QuickStart</name>
|
||||
|
||||
<properties>
|
||||
<!-- 主要依赖库的版本定义 -->
|
||||
<springside.version>4.0.0.RC4-SNAPSHOT</springside.version>
|
||||
<spring.version>3.1.2.RELEASE</spring.version>
|
||||
<hibernate.version>4.1.4.Final</hibernate.version>
|
||||
<spring-data-jpa.version>1.1.0.RELEASE</spring-data-jpa.version>
|
||||
<commons-dbcp.version>1.4</commons-dbcp.version>
|
||||
<sitemesh.version>2.4.2</sitemesh.version>
|
||||
<guava.version>12.0</guava.version>
|
||||
<commons-lang3.version>3.1</commons-lang3.version>
|
||||
<jackson.version>2.0.4</jackson.version>
|
||||
<slf4j.version>1.6.6</slf4j.version>
|
||||
<log4j.version>1.2.17</log4j.version>
|
||||
<jetty.version>7.6.4.v20120524</jetty.version>
|
||||
<h2.version>1.3.167</h2.version>
|
||||
<junit.version>4.10</junit.version>
|
||||
<mockito.version>1.9.0</mockito.version>
|
||||
<selenium.version>2.24.1</selenium.version>
|
||||
|
||||
<!-- Plugin的属性定义 -->
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<jdk.version>1.6</jdk.version>
|
||||
|
||||
<!-- 项目属性 -->
|
||||
<jdbc.driver.groupId>com.h2database</jdbc.driver.groupId>
|
||||
<jdbc.driver.artifactId>h2</jdbc.driver.artifactId>
|
||||
<jdbc.driver.version>${h2.version}</jdbc.driver.version>
|
||||
</properties>
|
||||
|
||||
<!-- 设定仓库 如有Nexus私服, 取消注释并指向正确的服务器地址.
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>nexus</id>
|
||||
<name>Team Nexus Repository</name>
|
||||
<url>http://localhost:8081/nexus/content/groups/public</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
-->
|
||||
|
||||
<!-- 设定插件仓库 如有Nexus私服, 取消注释并指向正确的服务器地址.
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>nexus</id>
|
||||
<name>Team Nexus Repository</name>
|
||||
<url>http://localhost:8081/nexus/content/groups/public</url>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
-->
|
||||
|
||||
<!-- 依赖项定义 -->
|
||||
<dependencies>
|
||||
<!-- SPRINGSIDE -->
|
||||
<dependency>
|
||||
<groupId>org.springside</groupId>
|
||||
<artifactId>springside-core</artifactId>
|
||||
<version>${springside.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- SPRING begin -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-aop</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<!-- <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.9</version> </dependency> -->
|
||||
<dependency>
|
||||
<groupId>cglib</groupId>
|
||||
<artifactId>cglib</artifactId>
|
||||
<version>2.2.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>asm</groupId>
|
||||
<artifactId>asm</artifactId>
|
||||
<version>3.3.1</version>
|
||||
</dependency>
|
||||
<!-- SPRING end -->
|
||||
|
||||
<!-- PERSISTENCE begin -->
|
||||
<!-- hibernate -->
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-entitymanager</artifactId>
|
||||
<version>${hibernate.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate.javax.persistence</groupId>
|
||||
<artifactId>hibernate-jpa-2.0-api</artifactId>
|
||||
<version>1.0.1.Final</version>
|
||||
</dependency>
|
||||
|
||||
<!-- spring data access -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-jpa</artifactId>
|
||||
<version>${spring-data-jpa.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit-dep</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-orm</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jdbc</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- dbcp connection pool -->
|
||||
<dependency>
|
||||
<groupId>commons-dbcp</groupId>
|
||||
<artifactId>commons-dbcp</artifactId>
|
||||
<version>${commons-dbcp.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- jdbc driver -->
|
||||
<dependency>
|
||||
<groupId>${jdbc.driver.groupId}</groupId>
|
||||
<artifactId>${jdbc.driver.artifactId}</artifactId>
|
||||
<version>${jdbc.driver.version}</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<!-- PERSISTENCE end -->
|
||||
|
||||
<!-- WEB begin -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-webmvc</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>opensymphony</groupId>
|
||||
<artifactId>sitemesh</artifactId>
|
||||
<version>${sitemesh.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>jstl</artifactId>
|
||||
<version>1.2</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>servlet-api</artifactId>
|
||||
<version>2.5</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!-- WEB end -->
|
||||
|
||||
<!-- GENERAL UTILS begin -->
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>${commons-lang3.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<version>${guava.version}</version>
|
||||
</dependency>
|
||||
<!-- GENERAL UTILS end -->
|
||||
|
||||
<!-- JSON begin -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
<!-- JSON end -->
|
||||
|
||||
<!-- LOGGING begin -->
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>${slf4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-log4j12</artifactId>
|
||||
<version>${slf4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>jcl-over-slf4j</artifactId>
|
||||
<version>${slf4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>${log4j.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.lazyluke</groupId>
|
||||
<artifactId>log4jdbc-remix</artifactId>
|
||||
<version>0.2.7</version>
|
||||
</dependency>
|
||||
<!-- LOGGING end -->
|
||||
|
||||
<!-- TEST begin -->
|
||||
<dependency>
|
||||
<groupId>org.springside</groupId>
|
||||
<artifactId>springside-test</artifactId>
|
||||
<version>${springside.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>${junit.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<version>${mockito.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-test</artifactId>
|
||||
<version>${spring.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- selenium 2.0 -->
|
||||
<dependency>
|
||||
<groupId>org.seleniumhq.selenium</groupId>
|
||||
<artifactId>selenium-java</artifactId>
|
||||
<version>${selenium.version}</version>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.seleniumhq.selenium</groupId>
|
||||
<artifactId>selenium-android-driver</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.seleniumhq.selenium</groupId>
|
||||
<artifactId>selenium-iphone-driver</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.seleniumhq.selenium</groupId>
|
||||
<artifactId>selenium-remote-driver</artifactId>
|
||||
<version>${selenium.version}</version>
|
||||
<scope>test</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>cglib</groupId>
|
||||
<artifactId>cglib-nodep</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
<version>${h2.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.dbunit</groupId>
|
||||
<artifactId>dbunit</artifactId>
|
||||
<version>2.4.8</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- jetty -->
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty.aggregate</groupId>
|
||||
<artifactId>jetty-webapp</artifactId>
|
||||
<version>${jetty.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.eclipse.jetty</groupId>
|
||||
<artifactId>jetty-jsp</artifactId>
|
||||
<version>${jetty.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<!-- TEST end -->
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<!-- compiler插件, 设定JDK版本 -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.5</version>
|
||||
<configuration>
|
||||
<source>${jdk.version}</source>
|
||||
<target>${jdk.version}</target>
|
||||
<showWarnings>true</showWarnings>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<!-- war打包插件, 设定war包名称不带版本号 -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-war-plugin</artifactId>
|
||||
<version>2.2</version>
|
||||
<configuration>
|
||||
<warName>${project.artifactId}</warName>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<!-- test插件, 仅测试名称为*Test的类,使用支持分组测试的surefire-junit47 driver -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.12</version>
|
||||
<configuration>
|
||||
<includes>
|
||||
<include>**/*Test.java</include>
|
||||
</includes>
|
||||
<argLine>-Xmx256M</argLine>
|
||||
</configuration>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.maven.surefire</groupId>
|
||||
<artifactId>surefire-junit47</artifactId>
|
||||
<version>2.12</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
|
||||
<!-- 增加functional test的Source目录 -->
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<version>1.7</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>add-functional-source</id>
|
||||
<phase>generate-sources</phase>
|
||||
<goals>
|
||||
<goal>add-test-source</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<sources>
|
||||
<source>src/test/functional</source>
|
||||
</sources>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<!-- cobertura插件, 设置不需要计算覆盖率的类 -->
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>cobertura-maven-plugin</artifactId>
|
||||
<version>2.5.1</version>
|
||||
<configuration>
|
||||
<instrumentation>
|
||||
<excludes>
|
||||
<exclude>**/entity/**/*.class</exclude>
|
||||
<exclude>**/*Controller.class</exclude>
|
||||
</excludes>
|
||||
</instrumentation>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<!-- eclipse插件, 设定wtp版本 -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-eclipse-plugin</artifactId>
|
||||
<version>2.9</version>
|
||||
<configuration>
|
||||
<downloadSources>true</downloadSources>
|
||||
<downloadJavadocs>false</downloadJavadocs>
|
||||
<wtpversion>2.0</wtpversion>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<!-- resource插件 -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>2.5</version>
|
||||
</plugin>
|
||||
|
||||
<!-- clean插件 -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-clean-plugin</artifactId>
|
||||
<version>2.5</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<profiles>
|
||||
<!-- 仅执行smoke test -->
|
||||
<profile>
|
||||
<id>smoke-test</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<groups>org.springside.modules.test.category.Smoke</groups>
|
||||
<includes>
|
||||
<include>**/*IT.java</include>
|
||||
</includes>
|
||||
<!-- 支持taglib tld文件查找的必要设置 -->
|
||||
<useSystemClassLoader>false</useSystemClassLoader>
|
||||
<!-- 将mvn命令行传入的selenium driver参数传入surefire的JVM -->
|
||||
<systemPropertyVariables>
|
||||
<selenium.driver>${selenium.driver}</selenium.driver>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<!-- 执行所有functional test -->
|
||||
<profile>
|
||||
<id>functional-test</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<configuration>
|
||||
<includes>
|
||||
<include>**/*IT.java</include>
|
||||
</includes>
|
||||
<!-- 支持taglib tld文件查找的必要设置 -->
|
||||
<useSystemClassLoader>false</useSystemClassLoader>
|
||||
<!-- 将mvn命令行传入的selenium driver参数传入surefire的JVM -->
|
||||
<systemPropertyVariables>
|
||||
<selenium.driver>${selenium.driver}</selenium.driver>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<!-- 刷新开发环境数据库 -->
|
||||
<profile>
|
||||
<id>refresh-db</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-antrun-plugin</artifactId>
|
||||
<version>1.7</version>
|
||||
<configuration>
|
||||
<target>
|
||||
<property file="src/main/resources/application.development-local.properties" />
|
||||
<property file="src/main/resources/application.development.properties" />
|
||||
<property file="src/main/resources/application.properties" />
|
||||
|
||||
<property name="sql.type" value="h2" />
|
||||
<property name="dbunit.datatype" value="org.dbunit.ext.h2.H2DataTypeFactory" />
|
||||
|
||||
<taskdef name="dbunit" classname="org.dbunit.ant.DbUnitTask" classpathref="maven.test.classpath" />
|
||||
|
||||
<sql driver="${jdbc.driver}" url="${jdbc.url}" userid="${jdbc.username}" password="${jdbc.password}"
|
||||
src="src/main/resources/sql/${sql.type}/schema.sql" onerror="continue">
|
||||
<classpath refid="maven.test.classpath" />
|
||||
</sql>
|
||||
|
||||
<dbunit driver="${jdbc.driver}" url="${jdbc.url}" userid="${jdbc.username}" password="${jdbc.password}">
|
||||
<dbconfig>
|
||||
<property name="datatypeFactory" value="${dbunit.datatype}" />
|
||||
</dbconfig>
|
||||
<classpath refid="maven.test.classpath" />
|
||||
<operation type="CLEAN_INSERT" src="src/test/resources/data/sample-data.xml" format="flat"
|
||||
transaction="true" />
|
||||
</dbunit>
|
||||
</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
@@ -0,0 +1,8 @@
|
||||
package org.springside.examples.quickstart.dao;
|
||||
|
||||
import org.springframework.data.repository.PagingAndSortingRepository;
|
||||
import org.springside.examples.quickstart.entity.Task;
|
||||
|
||||
public interface TaskDao extends PagingAndSortingRepository<Task, Long> {
|
||||
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
package org.springside.examples.quickstart.entity;
|
||||
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.MappedSuperclass;
|
||||
|
||||
/**
|
||||
* 统一定义id的entity基类.
|
||||
*
|
||||
* 基类统一定义id的属性名称、数据类型、列名映射及生成策略.
|
||||
* 子类可重载getId()函数重定义id的列名映射和生成策略.
|
||||
*
|
||||
* @author calvin
|
||||
*/
|
||||
//JPA 基类的标识
|
||||
@MappedSuperclass
|
||||
public abstract class IdEntity {
|
||||
|
||||
protected Long id;
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
//@GeneratedValue(strategy = GenerationType.SEQUENCE)
|
||||
//@GeneratedValue(generator = "system-uuid")
|
||||
//@GenericGenerator(name = "system-uuid", strategy = "uuid")
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package org.springside.examples.quickstart.entity;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
|
||||
@Entity
|
||||
public class Task extends IdEntity {
|
||||
|
||||
private String title;
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
package org.springside.examples.quickstart.service;
|
||||
|
||||
/**
|
||||
* Service层公用的Exception.
|
||||
*
|
||||
* 继承自RuntimeException, 从由Spring管理事务的函数中抛出时会触发事务回滚.
|
||||
*
|
||||
* @author calvin
|
||||
*/
|
||||
public class ServiceException extends RuntimeException {
|
||||
|
||||
private static final long serialVersionUID = 3583566093089790852L;
|
||||
|
||||
public ServiceException() {
|
||||
super();
|
||||
}
|
||||
|
||||
public ServiceException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public ServiceException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public ServiceException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
package org.springside.examples.quickstart.service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.data.domain.Sort.Direction;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springside.examples.quickstart.dao.TaskDao;
|
||||
import org.springside.examples.quickstart.entity.Task;
|
||||
|
||||
//Spring Bean的标识.
|
||||
@Component
|
||||
//默认将类中的所有public函数纳入事务管理.
|
||||
@Transactional(readOnly = true)
|
||||
public class TaskManager {
|
||||
|
||||
private TaskDao taskDao;
|
||||
|
||||
public Task getTask(Long id) {
|
||||
return taskDao.findOne(id);
|
||||
}
|
||||
|
||||
@Transactional(readOnly = false)
|
||||
public void saveTask(Task entity) {
|
||||
taskDao.save(entity);
|
||||
}
|
||||
|
||||
@Transactional(readOnly = false)
|
||||
public void deleteTask(Long id) {
|
||||
taskDao.delete(id);
|
||||
}
|
||||
|
||||
public List<Task> getAllTask() {
|
||||
return (List<Task>) taskDao.findAll(new Sort(Direction.ASC, "id"));
|
||||
}
|
||||
|
||||
@Autowired
|
||||
public void setTaskDao(TaskDao taskDao) {
|
||||
this.taskDao = taskDao;
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
package org.springside.examples.quickstart.web;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||
import org.springside.examples.quickstart.entity.Task;
|
||||
import org.springside.examples.quickstart.service.TaskManager;
|
||||
|
||||
/**
|
||||
* Urls:
|
||||
* List page : GET /task/
|
||||
* Create page : GET /task/create
|
||||
* Create action : POST /task/save
|
||||
* Update page : GET /task/update/{id}
|
||||
* Update action : POST /task/save/{id}
|
||||
* Delete action : POST /task/delete/{id}
|
||||
*
|
||||
* @author calvin
|
||||
*
|
||||
*/
|
||||
@Controller
|
||||
@RequestMapping(value = "/task")
|
||||
public class TaskController {
|
||||
|
||||
@Autowired
|
||||
private TaskManager taskManager;
|
||||
|
||||
@RequestMapping(value = { "list", "" })
|
||||
public String list(Model model) {
|
||||
List<Task> tasks = taskManager.getAllTask();
|
||||
model.addAttribute("tasks", tasks);
|
||||
return "taskList";
|
||||
}
|
||||
|
||||
@RequestMapping(value = "create")
|
||||
public String createForm(Model model) {
|
||||
model.addAttribute("task", new Task());
|
||||
return "taskForm";
|
||||
}
|
||||
|
||||
@RequestMapping(value = "save")
|
||||
public String save(Task task, RedirectAttributes redirectAttributes) {
|
||||
taskManager.saveTask(task);
|
||||
redirectAttributes.addFlashAttribute("message", "创建任务" + task.getTitle() + "成功");
|
||||
return "redirect:/task/";
|
||||
}
|
||||
|
||||
@RequestMapping(value = "delete/{id}")
|
||||
public String delete(@PathVariable("id") Long id, RedirectAttributes redirectAttributes) {
|
||||
taskManager.deleteTask(id);
|
||||
redirectAttributes.addFlashAttribute("message", "删除任务成功");
|
||||
return "redirect:/task/";
|
||||
}
|
||||
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
package org.springside.examples.quickstart.web;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||
import org.springside.examples.quickstart.entity.Task;
|
||||
import org.springside.examples.quickstart.service.TaskManager;
|
||||
|
||||
/**
|
||||
* 使用@ModelAttribute, 实现Struts2 Preparable二次绑定的效果。
|
||||
* 因为@ModelAttribute被默认执行, 而其他的action url中并没有${id},所以需要独立出一个Controller.
|
||||
*
|
||||
* @author calvin
|
||||
*/
|
||||
@Controller
|
||||
@RequestMapping(value = "/task/")
|
||||
public class TaskDetailController {
|
||||
|
||||
@Autowired
|
||||
private TaskManager taskManager;
|
||||
|
||||
@RequestMapping(value = "update/{id}")
|
||||
public String updateForm(Model model) {
|
||||
return "taskForm";
|
||||
}
|
||||
|
||||
@RequestMapping(value = "save/{id}")
|
||||
public String save(@ModelAttribute("task") Task task, RedirectAttributes redirectAttributes) {
|
||||
taskManager.saveTask(task);
|
||||
redirectAttributes.addFlashAttribute("message", "修改任务" + task.getTitle() + "成功");
|
||||
return "redirect:/task/";
|
||||
}
|
||||
|
||||
@ModelAttribute("task")
|
||||
public Task getTask(@PathVariable("id") Long id) {
|
||||
return taskManager.getTask(id);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm/orm_2_0.xsd" version="2.0">
|
||||
</entity-mappings>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0">
|
||||
<!-- Keep this file empty, Spring will scan the @Entity classes -->
|
||||
<persistence-unit name="defaultPU" transaction-type="RESOURCE_LOCAL">
|
||||
<mapping-file>META-INF/orm.xml</mapping-file>
|
||||
</persistence-unit>
|
||||
</persistence>
|
||||
@@ -0,0 +1,9 @@
|
||||
#h2 database settings
|
||||
jdbc.driver=org.h2.Driver
|
||||
jdbc.url=jdbc:h2:file:~/.h2/quickstart;AUTO_SERVER=TRUE
|
||||
jdbc.username=sa
|
||||
jdbc.password=
|
||||
|
||||
#dbcp settings
|
||||
dbcp.maxIdle=5
|
||||
dbcp.maxActive=40
|
||||
@@ -0,0 +1,134 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
|
||||
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
|
||||
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
|
||||
xsi:schemaLocation="
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
|
||||
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
|
||||
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
|
||||
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
|
||||
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"
|
||||
default-lazy-init="true">
|
||||
|
||||
<description>Spring公共配置 </description>
|
||||
|
||||
<!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 -->
|
||||
<context:component-scan base-package="org.springside.examples.quickstart">
|
||||
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
|
||||
</context:component-scan>
|
||||
|
||||
<!-- Jpa Entity Manager 配置 -->
|
||||
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
|
||||
<property name="dataSource" ref="dataSource"/>
|
||||
<property name="persistenceUnitName" value="defaultPU"/>
|
||||
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
|
||||
<property name="jpaProperties">
|
||||
<props>
|
||||
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
|
||||
</props>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
|
||||
<property name="databasePlatform">
|
||||
<bean factory-method="getDialect" class="org.springside.modules.orm.Hibernates">
|
||||
<constructor-arg ref="dataSource"/>
|
||||
</bean>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- Spring Data Jpa配置 -->
|
||||
<jpa:repositories base-package="org.springside.examples.quickstart" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"/>
|
||||
|
||||
<!-- Jpa 事务配置 -->
|
||||
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
|
||||
<property name="entityManagerFactory" ref="entityManagerFactory"/>
|
||||
</bean>
|
||||
|
||||
<!-- 使用annotation定义事务 -->
|
||||
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
|
||||
|
||||
<!-- production环境 -->
|
||||
<beans profile="production">
|
||||
<context:property-placeholder ignore-unresolvable="true"
|
||||
location="classpath*:/application.properties" />
|
||||
|
||||
<!-- 数据源配置, 使用DBCP数据库连接池 -->
|
||||
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
|
||||
<!-- Connection Info -->
|
||||
<property name="driverClassName" value="${jdbc.driver}" />
|
||||
<property name="url" value="${jdbc.url}" />
|
||||
<property name="username" value="${jdbc.username}" />
|
||||
<property name="password" value="${jdbc.password}" />
|
||||
|
||||
<!-- Connection Pooling Info -->
|
||||
<property name="maxActive" value="${dbcp.maxActive}" />
|
||||
<property name="maxIdle" value="${dbcp.maxIdle}" />
|
||||
<property name="defaultAutoCommit" value="false" />
|
||||
<!-- 连接Idle一个小时后超时 -->
|
||||
<property name="timeBetweenEvictionRunsMillis" value="3600000" />
|
||||
<property name="minEvictableIdleTimeMillis" value="3600000" />
|
||||
</bean>
|
||||
|
||||
<!-- 数据源配置,使用应用服务器的数据库连接池 -->
|
||||
<!--<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ExampleDB" />-->
|
||||
</beans>
|
||||
|
||||
<!-- local development环境 -->
|
||||
<beans profile="development">
|
||||
<context:property-placeholder ignore-resource-not-found="true"
|
||||
location="classpath*:/application.properties,
|
||||
classpath*:/application.development.properties,
|
||||
classpath*:/application.development-local.properties" />
|
||||
|
||||
<!-- DBCP连接池 -->
|
||||
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
|
||||
<property name="driverClassName" value="${jdbc.driver}" />
|
||||
<property name="url" value="${jdbc.url}" />
|
||||
<property name="username" value="${jdbc.username}" />
|
||||
<property name="password" value="${jdbc.password}" />
|
||||
<property name="defaultAutoCommit" value="false" />
|
||||
</bean>
|
||||
</beans>
|
||||
|
||||
<beans profile="functional">
|
||||
<context:property-placeholder ignore-resource-not-found="true"
|
||||
location="classpath*:/application.properties,
|
||||
classpath*:/application.functional.properties,
|
||||
classpath*:/application.functional-local.properties" />
|
||||
|
||||
<!-- DBCP连接池 -->
|
||||
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
|
||||
<property name="driverClassName" value="${jdbc.driver}" />
|
||||
<property name="url" value="${jdbc.url}" />
|
||||
<property name="username" value="${jdbc.username}" />
|
||||
<property name="password" value="${jdbc.password}" />
|
||||
<property name="defaultAutoCommit" value="false" />
|
||||
</bean>
|
||||
|
||||
<!-- 初始化数据表结构 -->
|
||||
<jdbc:initialize-database data-source="dataSource" ignore-failures="ALL">
|
||||
<jdbc:script location="classpath:sql/h2/schema.sql" />
|
||||
</jdbc:initialize-database>
|
||||
</beans>
|
||||
|
||||
<!-- unit test环境 -->
|
||||
<beans profile="test">
|
||||
<context:property-placeholder ignore-resource-not-found="true"
|
||||
location="classpath*:/application.properties,
|
||||
classpath*:/application.test.properties" />
|
||||
|
||||
<!-- 嵌入式内存中数据库 -->
|
||||
<jdbc:embedded-database id="dataSource" type="H2">
|
||||
<jdbc:script location="classpath:sql/h2/schema.sql" />
|
||||
</jdbc:embedded-database>
|
||||
|
||||
<!-- 初始化默认数据 -->
|
||||
<bean class="org.springside.modules.test.data.DataInitializer" lazy-init="false">
|
||||
<property name="dataSource" ref="dataSource"/>
|
||||
<property name="dataFile" value="/data/sample-data.xml" />
|
||||
</bean>
|
||||
</beans>
|
||||
</beans>
|
||||
@@ -0,0 +1,19 @@
|
||||
# Output pattern : date [thread] priority category - message
|
||||
log4j.rootLogger=WARN, Console, RollingFile
|
||||
|
||||
#Console
|
||||
log4j.appender.Console=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
|
||||
|
||||
#RollingFile
|
||||
log4j.appender.RollingFile=org.apache.log4j.DailyRollingFileAppender
|
||||
log4j.appender.RollingFile.File=logs/quickstart.log
|
||||
log4j.appender.RollingFile.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.RollingFile.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
|
||||
|
||||
#Project defalult level
|
||||
log4j.logger.org.springside.examples.quickstart=INFO
|
||||
|
||||
#log4jdbc
|
||||
#log4j.logger.jdbc.sqltiming=INFO
|
||||
@@ -0,0 +1,8 @@
|
||||
|
||||
drop table if exists task;
|
||||
|
||||
create table task (
|
||||
id bigint generated by default as identity,
|
||||
title varchar(255) not null,
|
||||
primary key (id)
|
||||
) ;
|
||||
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<decorators defaultdir="/WEB-INF/layouts/">
|
||||
<excludes>
|
||||
<pattern>/static/*</pattern>
|
||||
</excludes>
|
||||
|
||||
<decorator name="default" page="default.jsp">
|
||||
<pattern>/*</pattern>
|
||||
</decorator>
|
||||
</decorators>
|
||||
@@ -0,0 +1,37 @@
|
||||
<%@ page contentType="text/html;charset=UTF-8"%>
|
||||
<%@ taglib prefix="sitemesh" uri="http://www.opensymphony.com/sitemesh/decorator" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}" />
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>QuickStart示例:<sitemesh:title/></title>
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
<meta http-equiv="Cache-Control" content="no-store" />
|
||||
<meta http-equiv="Pragma" content="no-cache" />
|
||||
<meta http-equiv="Expires" content="0" />
|
||||
|
||||
<link href="${ctx}/static/bootstrap/2.0.4/css/bootstrap.min.css" type="text/css" rel="stylesheet" />
|
||||
<link href="${ctx}/static/jquery-validation/1.9.0/validate.css" type="text/css" rel="stylesheet" />
|
||||
<link href="${ctx}/static/quickstart.css" type="text/css" rel="stylesheet" />
|
||||
<script src="${ctx}/static/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
|
||||
<script src="${ctx}/static/jquery-validation/1.9.0/jquery.validate.min.js" type="text/javascript"></script>
|
||||
<script src="${ctx}/static/jquery-validation/1.9.0/messages_cn.js" type="text/javascript"></script>
|
||||
|
||||
|
||||
<sitemesh:head/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container">
|
||||
<%@ include file="/WEB-INF/layouts/header.jsp"%>
|
||||
<div id="content" class="span12">
|
||||
<sitemesh:body/>
|
||||
</div>
|
||||
<%@ include file="/WEB-INF/layouts/footer.jsp"%>
|
||||
</div>
|
||||
<script src="${ctx}/static/bootstrap/2.0.4/js/bootstrap.min.js" type="text/javascript"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,5 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8" %>
|
||||
<div id="footer" class="span12">
|
||||
Copyright © 2005-2012 <a href="http://www.springside.org.cn">springside.org.cn</a>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<%@ page language="java" pageEncoding="UTF-8" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
<div id="header" class="span12">
|
||||
<div id="title">
|
||||
<h1>QuickStart示例<small>--TodoList应用演示</small></h1>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:context="http://www.springframework.org/schema/context"
|
||||
xmlns:mvc="http://www.springframework.org/schema/mvc"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
|
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
|
||||
|
||||
<!-- 自动扫描且只扫描@Controller -->
|
||||
<context:component-scan base-package="org.springside.examples.quickstart" use-default-filters="false">
|
||||
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
|
||||
</context:component-scan>
|
||||
|
||||
<mvc:annotation-driven />
|
||||
|
||||
<mvc:default-servlet-handler/>
|
||||
|
||||
<!-- 定义首页转向Task页面 -->
|
||||
<mvc:view-controller path="/" view-name="redirect:/task/"/>
|
||||
|
||||
<!-- 定义JSP -->
|
||||
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
|
||||
<property name="prefix" value="/WEB-INF/views/"/>
|
||||
<property name="suffix" value=".jsp"/>
|
||||
</bean>
|
||||
</beans>
|
||||
@@ -0,0 +1,18 @@
|
||||
<%@ page contentType="text/html;charset=UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
|
||||
<%response.setStatus(200);%>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>404 - 页面不存在</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div>
|
||||
<div><h1>页面不存在.</h1></div>
|
||||
<div><a href="<c:url value="/"/>">返回首页</a></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,28 @@
|
||||
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ page import="org.slf4j.Logger,org.slf4j.LoggerFactory" %>
|
||||
<%response.setStatus(200);%>
|
||||
|
||||
<%
|
||||
Throwable ex = null;
|
||||
if (exception != null)
|
||||
ex = exception;
|
||||
if (request.getAttribute("javax.servlet.error.exception") != null)
|
||||
ex = (Throwable) request.getAttribute("javax.servlet.error.exception");
|
||||
|
||||
//记录日志
|
||||
Logger logger = LoggerFactory.getLogger("500.jsp");
|
||||
logger.error(ex.getMessage(), ex);
|
||||
%>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>500 - 系统内部错误</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div><h1>系统发生内部错误.</h1></div>
|
||||
<div><a href="<c:url value="/"/>">返回首页</a></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,39 @@
|
||||
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
<html>
|
||||
<head>
|
||||
<title>任务管理</title>
|
||||
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
//聚焦第一个输入框
|
||||
$("#title").focus();
|
||||
//为inputForm注册validate函数
|
||||
$("#inputForm").validate();
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<form:form id="inputForm" modelAttribute="task" action="${ctx}/task/save/${task.id}" method="post" class="form-horizontal">
|
||||
<input type="hidden" name="id" value="${task.id}"/>
|
||||
<fieldset>
|
||||
<legend><small>管理任务</small></legend>
|
||||
<div id="messageBox" class="alert alert-error" style="display:none">输入有误,请先更正。</div>
|
||||
|
||||
<div class="control-group">
|
||||
<label for="title" class="control-label">任务名称:</label>
|
||||
<div class="controls">
|
||||
<input type="text" id="title" name="title" size="50" value="${task.title}" class="required"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-actions">
|
||||
<input id="submit" class="btn btn-primary" type="submit" value="提交"/>
|
||||
<input id="cancel" class="btn" type="button" value="返回" onclick="history.back()"/>
|
||||
</div>
|
||||
</fieldset>
|
||||
</form:form>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,31 @@
|
||||
<%@ page contentType="text/html;charset=UTF-8" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
|
||||
<html>
|
||||
<head>
|
||||
<title>任务管理</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<c:if test="${not empty message}">
|
||||
<div id="message" class="alert alert-success"><button data-dismiss="alert" class="close">×</button>${message}</div>
|
||||
</c:if>
|
||||
|
||||
<table id="contentTable" class="table table-striped table-bordered table-condensed">
|
||||
<thead><tr><th>任务编号</th><th>任务标题</th><th>操作</th></tr></thead>
|
||||
<tbody>
|
||||
<c:forEach items="${tasks}" var="task">
|
||||
<tr>
|
||||
<td>${task.id}</td>
|
||||
<td>${task.title}</td>
|
||||
<td>
|
||||
<a href="update/${task.id}" id="update-${task.id}-btn">修改</a> <a href="delete/${task.id}">删除</a>
|
||||
</td>
|
||||
</tr>
|
||||
</c:forEach>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<a class="btn" href="create">创建任务</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,100 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<web-app 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/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
||||
version="2.5">
|
||||
|
||||
<display-name>QuickStart</display-name>
|
||||
|
||||
<!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用,号分隔
|
||||
此参数用于后面的Spring Context Loader -->
|
||||
<context-param>
|
||||
<param-name>contextConfigLocation</param-name>
|
||||
<param-value>
|
||||
classpath*:/applicationContext.xml
|
||||
</param-value>
|
||||
</context-param>
|
||||
|
||||
<!-- 設定Spring Context的默认Profile -->
|
||||
<context-param>
|
||||
<param-name>spring.profiles.default</param-name>
|
||||
<param-value>production</param-value>
|
||||
</context-param>
|
||||
|
||||
<!--Spring的ApplicationContext 载入 -->
|
||||
<listener>
|
||||
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
|
||||
</listener>
|
||||
|
||||
<!-- Filter 定义 -->
|
||||
<!-- Character Encoding filter -->
|
||||
<filter>
|
||||
<filter-name>encodingFilter</filter-name>
|
||||
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
|
||||
<init-param>
|
||||
<param-name>encoding</param-name>
|
||||
<param-value>UTF-8</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>forceEncoding</param-name>
|
||||
<param-value>true</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>encodingFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
<!-- Open Entity Manager in View filter -->
|
||||
<filter>
|
||||
<filter-name>openEntityManagerInViewFilter</filter-name>
|
||||
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>openEntityManagerInViewFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
<!-- SiteMesh Web-Page Layout filter-->
|
||||
<filter>
|
||||
<filter-name>sitemeshFilter</filter-name>
|
||||
<filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>sitemeshFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
<!-- Spring MVC Servlet -->
|
||||
<servlet>
|
||||
<servlet-name>springServlet</servlet-name>
|
||||
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
|
||||
<init-param>
|
||||
<param-name>contextConfigLocation</param-name>
|
||||
<param-value>/WEB-INF/spring-mvc.xml</param-value>
|
||||
</init-param>
|
||||
<load-on-startup>1</load-on-startup>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>springServlet</servlet-name>
|
||||
<url-pattern>/</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<!-- session超时定义,单位为分钟 -->
|
||||
<session-config>
|
||||
<session-timeout>20</session-timeout>
|
||||
</session-config>
|
||||
|
||||
<!-- 出错页面定义 -->
|
||||
<error-page>
|
||||
<exception-type>java.lang.Throwable</exception-type>
|
||||
<location>/WEB-INF/views/error/500.jsp</location>
|
||||
</error-page>
|
||||
<error-page>
|
||||
<error-code>500</error-code>
|
||||
<location>/WEB-INF/views/error/500.jsp</location>
|
||||
</error-page>
|
||||
<error-page>
|
||||
<error-code>404</error-code>
|
||||
<location>/WEB-INF/views/error/404.jsp</location>
|
||||
</error-page>
|
||||
</web-app>
|
||||
+815
@@ -0,0 +1,815 @@
|
||||
/*!
|
||||
* Bootstrap Responsive v2.0.4
|
||||
*
|
||||
* Copyright 2012 Twitter, Inc
|
||||
* Licensed under the Apache License v2.0
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Designed and built with all the love in the world @twitter by @mdo and @fat.
|
||||
*/
|
||||
|
||||
.clearfix {
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.clearfix:before,
|
||||
.clearfix:after {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
|
||||
.clearfix:after {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.hide-text {
|
||||
font: 0/0 a;
|
||||
color: transparent;
|
||||
text-shadow: none;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.input-block-level {
|
||||
display: block;
|
||||
width: 100%;
|
||||
min-height: 28px;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-ms-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.visible-phone {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.visible-tablet {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.hidden-desktop {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.visible-phone {
|
||||
display: inherit !important;
|
||||
}
|
||||
.hidden-phone {
|
||||
display: none !important;
|
||||
}
|
||||
.hidden-desktop {
|
||||
display: inherit !important;
|
||||
}
|
||||
.visible-desktop {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) and (max-width: 979px) {
|
||||
.visible-tablet {
|
||||
display: inherit !important;
|
||||
}
|
||||
.hidden-tablet {
|
||||
display: none !important;
|
||||
}
|
||||
.hidden-desktop {
|
||||
display: inherit !important;
|
||||
}
|
||||
.visible-desktop {
|
||||
display: none !important ;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.nav-collapse {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
}
|
||||
.page-header h1 small {
|
||||
display: block;
|
||||
line-height: 18px;
|
||||
}
|
||||
input[type="checkbox"],
|
||||
input[type="radio"] {
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
.form-horizontal .control-group > label {
|
||||
float: none;
|
||||
width: auto;
|
||||
padding-top: 0;
|
||||
text-align: left;
|
||||
}
|
||||
.form-horizontal .controls {
|
||||
margin-left: 0;
|
||||
}
|
||||
.form-horizontal .control-list {
|
||||
padding-top: 0;
|
||||
}
|
||||
.form-horizontal .form-actions {
|
||||
padding-right: 10px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
.modal {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
left: 10px;
|
||||
width: auto;
|
||||
margin: 0;
|
||||
}
|
||||
.modal.fade.in {
|
||||
top: auto;
|
||||
}
|
||||
.modal-header .close {
|
||||
padding: 10px;
|
||||
margin: -10px;
|
||||
}
|
||||
.carousel-caption {
|
||||
position: static;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
body {
|
||||
padding-right: 20px;
|
||||
padding-left: 20px;
|
||||
}
|
||||
.navbar-fixed-top,
|
||||
.navbar-fixed-bottom {
|
||||
margin-right: -20px;
|
||||
margin-left: -20px;
|
||||
}
|
||||
.container-fluid {
|
||||
padding: 0;
|
||||
}
|
||||
.dl-horizontal dt {
|
||||
float: none;
|
||||
width: auto;
|
||||
clear: none;
|
||||
text-align: left;
|
||||
}
|
||||
.dl-horizontal dd {
|
||||
margin-left: 0;
|
||||
}
|
||||
.container {
|
||||
width: auto;
|
||||
}
|
||||
.row-fluid {
|
||||
width: 100%;
|
||||
}
|
||||
.row,
|
||||
.thumbnails {
|
||||
margin-left: 0;
|
||||
}
|
||||
[class*="span"],
|
||||
.row-fluid [class*="span"] {
|
||||
display: block;
|
||||
float: none;
|
||||
width: auto;
|
||||
margin-left: 0;
|
||||
}
|
||||
.input-large,
|
||||
.input-xlarge,
|
||||
.input-xxlarge,
|
||||
input[class*="span"],
|
||||
select[class*="span"],
|
||||
textarea[class*="span"],
|
||||
.uneditable-input {
|
||||
display: block;
|
||||
width: 100%;
|
||||
min-height: 28px;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-ms-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.input-prepend input,
|
||||
.input-append input,
|
||||
.input-prepend input[class*="span"],
|
||||
.input-append input[class*="span"] {
|
||||
display: inline-block;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) and (max-width: 979px) {
|
||||
.row {
|
||||
margin-left: -20px;
|
||||
*zoom: 1;
|
||||
}
|
||||
.row:before,
|
||||
.row:after {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
.row:after {
|
||||
clear: both;
|
||||
}
|
||||
[class*="span"] {
|
||||
float: left;
|
||||
margin-left: 20px;
|
||||
}
|
||||
.container,
|
||||
.navbar-fixed-top .container,
|
||||
.navbar-fixed-bottom .container {
|
||||
width: 724px;
|
||||
}
|
||||
.span12 {
|
||||
width: 724px;
|
||||
}
|
||||
.span11 {
|
||||
width: 662px;
|
||||
}
|
||||
.span10 {
|
||||
width: 600px;
|
||||
}
|
||||
.span9 {
|
||||
width: 538px;
|
||||
}
|
||||
.span8 {
|
||||
width: 476px;
|
||||
}
|
||||
.span7 {
|
||||
width: 414px;
|
||||
}
|
||||
.span6 {
|
||||
width: 352px;
|
||||
}
|
||||
.span5 {
|
||||
width: 290px;
|
||||
}
|
||||
.span4 {
|
||||
width: 228px;
|
||||
}
|
||||
.span3 {
|
||||
width: 166px;
|
||||
}
|
||||
.span2 {
|
||||
width: 104px;
|
||||
}
|
||||
.span1 {
|
||||
width: 42px;
|
||||
}
|
||||
.offset12 {
|
||||
margin-left: 764px;
|
||||
}
|
||||
.offset11 {
|
||||
margin-left: 702px;
|
||||
}
|
||||
.offset10 {
|
||||
margin-left: 640px;
|
||||
}
|
||||
.offset9 {
|
||||
margin-left: 578px;
|
||||
}
|
||||
.offset8 {
|
||||
margin-left: 516px;
|
||||
}
|
||||
.offset7 {
|
||||
margin-left: 454px;
|
||||
}
|
||||
.offset6 {
|
||||
margin-left: 392px;
|
||||
}
|
||||
.offset5 {
|
||||
margin-left: 330px;
|
||||
}
|
||||
.offset4 {
|
||||
margin-left: 268px;
|
||||
}
|
||||
.offset3 {
|
||||
margin-left: 206px;
|
||||
}
|
||||
.offset2 {
|
||||
margin-left: 144px;
|
||||
}
|
||||
.offset1 {
|
||||
margin-left: 82px;
|
||||
}
|
||||
.row-fluid {
|
||||
width: 100%;
|
||||
*zoom: 1;
|
||||
}
|
||||
.row-fluid:before,
|
||||
.row-fluid:after {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
.row-fluid:after {
|
||||
clear: both;
|
||||
}
|
||||
.row-fluid [class*="span"] {
|
||||
display: block;
|
||||
float: left;
|
||||
width: 100%;
|
||||
min-height: 28px;
|
||||
margin-left: 2.762430939%;
|
||||
*margin-left: 2.709239449638298%;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-ms-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.row-fluid [class*="span"]:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
.row-fluid .span12 {
|
||||
width: 99.999999993%;
|
||||
*width: 99.9468085036383%;
|
||||
}
|
||||
.row-fluid .span11 {
|
||||
width: 91.436464082%;
|
||||
*width: 91.38327259263829%;
|
||||
}
|
||||
.row-fluid .span10 {
|
||||
width: 82.87292817100001%;
|
||||
*width: 82.8197366816383%;
|
||||
}
|
||||
.row-fluid .span9 {
|
||||
width: 74.30939226%;
|
||||
*width: 74.25620077063829%;
|
||||
}
|
||||
.row-fluid .span8 {
|
||||
width: 65.74585634900001%;
|
||||
*width: 65.6926648596383%;
|
||||
}
|
||||
.row-fluid .span7 {
|
||||
width: 57.182320438000005%;
|
||||
*width: 57.129128948638304%;
|
||||
}
|
||||
.row-fluid .span6 {
|
||||
width: 48.618784527%;
|
||||
*width: 48.5655930376383%;
|
||||
}
|
||||
.row-fluid .span5 {
|
||||
width: 40.055248616%;
|
||||
*width: 40.0020571266383%;
|
||||
}
|
||||
.row-fluid .span4 {
|
||||
width: 31.491712705%;
|
||||
*width: 31.4385212156383%;
|
||||
}
|
||||
.row-fluid .span3 {
|
||||
width: 22.928176794%;
|
||||
*width: 22.874985304638297%;
|
||||
}
|
||||
.row-fluid .span2 {
|
||||
width: 14.364640883%;
|
||||
*width: 14.311449393638298%;
|
||||
}
|
||||
.row-fluid .span1 {
|
||||
width: 5.801104972%;
|
||||
*width: 5.747913482638298%;
|
||||
}
|
||||
input,
|
||||
textarea,
|
||||
.uneditable-input {
|
||||
margin-left: 0;
|
||||
}
|
||||
input.span12,
|
||||
textarea.span12,
|
||||
.uneditable-input.span12 {
|
||||
width: 714px;
|
||||
}
|
||||
input.span11,
|
||||
textarea.span11,
|
||||
.uneditable-input.span11 {
|
||||
width: 652px;
|
||||
}
|
||||
input.span10,
|
||||
textarea.span10,
|
||||
.uneditable-input.span10 {
|
||||
width: 590px;
|
||||
}
|
||||
input.span9,
|
||||
textarea.span9,
|
||||
.uneditable-input.span9 {
|
||||
width: 528px;
|
||||
}
|
||||
input.span8,
|
||||
textarea.span8,
|
||||
.uneditable-input.span8 {
|
||||
width: 466px;
|
||||
}
|
||||
input.span7,
|
||||
textarea.span7,
|
||||
.uneditable-input.span7 {
|
||||
width: 404px;
|
||||
}
|
||||
input.span6,
|
||||
textarea.span6,
|
||||
.uneditable-input.span6 {
|
||||
width: 342px;
|
||||
}
|
||||
input.span5,
|
||||
textarea.span5,
|
||||
.uneditable-input.span5 {
|
||||
width: 280px;
|
||||
}
|
||||
input.span4,
|
||||
textarea.span4,
|
||||
.uneditable-input.span4 {
|
||||
width: 218px;
|
||||
}
|
||||
input.span3,
|
||||
textarea.span3,
|
||||
.uneditable-input.span3 {
|
||||
width: 156px;
|
||||
}
|
||||
input.span2,
|
||||
textarea.span2,
|
||||
.uneditable-input.span2 {
|
||||
width: 94px;
|
||||
}
|
||||
input.span1,
|
||||
textarea.span1,
|
||||
.uneditable-input.span1 {
|
||||
width: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.row {
|
||||
margin-left: -30px;
|
||||
*zoom: 1;
|
||||
}
|
||||
.row:before,
|
||||
.row:after {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
.row:after {
|
||||
clear: both;
|
||||
}
|
||||
[class*="span"] {
|
||||
float: left;
|
||||
margin-left: 30px;
|
||||
}
|
||||
.container,
|
||||
.navbar-fixed-top .container,
|
||||
.navbar-fixed-bottom .container {
|
||||
width: 1170px;
|
||||
}
|
||||
.span12 {
|
||||
width: 1170px;
|
||||
}
|
||||
.span11 {
|
||||
width: 1070px;
|
||||
}
|
||||
.span10 {
|
||||
width: 970px;
|
||||
}
|
||||
.span9 {
|
||||
width: 870px;
|
||||
}
|
||||
.span8 {
|
||||
width: 770px;
|
||||
}
|
||||
.span7 {
|
||||
width: 670px;
|
||||
}
|
||||
.span6 {
|
||||
width: 570px;
|
||||
}
|
||||
.span5 {
|
||||
width: 470px;
|
||||
}
|
||||
.span4 {
|
||||
width: 370px;
|
||||
}
|
||||
.span3 {
|
||||
width: 270px;
|
||||
}
|
||||
.span2 {
|
||||
width: 170px;
|
||||
}
|
||||
.span1 {
|
||||
width: 70px;
|
||||
}
|
||||
.offset12 {
|
||||
margin-left: 1230px;
|
||||
}
|
||||
.offset11 {
|
||||
margin-left: 1130px;
|
||||
}
|
||||
.offset10 {
|
||||
margin-left: 1030px;
|
||||
}
|
||||
.offset9 {
|
||||
margin-left: 930px;
|
||||
}
|
||||
.offset8 {
|
||||
margin-left: 830px;
|
||||
}
|
||||
.offset7 {
|
||||
margin-left: 730px;
|
||||
}
|
||||
.offset6 {
|
||||
margin-left: 630px;
|
||||
}
|
||||
.offset5 {
|
||||
margin-left: 530px;
|
||||
}
|
||||
.offset4 {
|
||||
margin-left: 430px;
|
||||
}
|
||||
.offset3 {
|
||||
margin-left: 330px;
|
||||
}
|
||||
.offset2 {
|
||||
margin-left: 230px;
|
||||
}
|
||||
.offset1 {
|
||||
margin-left: 130px;
|
||||
}
|
||||
.row-fluid {
|
||||
width: 100%;
|
||||
*zoom: 1;
|
||||
}
|
||||
.row-fluid:before,
|
||||
.row-fluid:after {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
.row-fluid:after {
|
||||
clear: both;
|
||||
}
|
||||
.row-fluid [class*="span"] {
|
||||
display: block;
|
||||
float: left;
|
||||
width: 100%;
|
||||
min-height: 28px;
|
||||
margin-left: 2.564102564%;
|
||||
*margin-left: 2.510911074638298%;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-ms-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.row-fluid [class*="span"]:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
.row-fluid .span12 {
|
||||
width: 100%;
|
||||
*width: 99.94680851063829%;
|
||||
}
|
||||
.row-fluid .span11 {
|
||||
width: 91.45299145300001%;
|
||||
*width: 91.3997999636383%;
|
||||
}
|
||||
.row-fluid .span10 {
|
||||
width: 82.905982906%;
|
||||
*width: 82.8527914166383%;
|
||||
}
|
||||
.row-fluid .span9 {
|
||||
width: 74.358974359%;
|
||||
*width: 74.30578286963829%;
|
||||
}
|
||||
.row-fluid .span8 {
|
||||
width: 65.81196581200001%;
|
||||
*width: 65.7587743226383%;
|
||||
}
|
||||
.row-fluid .span7 {
|
||||
width: 57.264957265%;
|
||||
*width: 57.2117657756383%;
|
||||
}
|
||||
.row-fluid .span6 {
|
||||
width: 48.717948718%;
|
||||
*width: 48.6647572286383%;
|
||||
}
|
||||
.row-fluid .span5 {
|
||||
width: 40.170940171000005%;
|
||||
*width: 40.117748681638304%;
|
||||
}
|
||||
.row-fluid .span4 {
|
||||
width: 31.623931624%;
|
||||
*width: 31.5707401346383%;
|
||||
}
|
||||
.row-fluid .span3 {
|
||||
width: 23.076923077%;
|
||||
*width: 23.0237315876383%;
|
||||
}
|
||||
.row-fluid .span2 {
|
||||
width: 14.529914530000001%;
|
||||
*width: 14.4767230406383%;
|
||||
}
|
||||
.row-fluid .span1 {
|
||||
width: 5.982905983%;
|
||||
*width: 5.929714493638298%;
|
||||
}
|
||||
input,
|
||||
textarea,
|
||||
.uneditable-input {
|
||||
margin-left: 0;
|
||||
}
|
||||
input.span12,
|
||||
textarea.span12,
|
||||
.uneditable-input.span12 {
|
||||
width: 1160px;
|
||||
}
|
||||
input.span11,
|
||||
textarea.span11,
|
||||
.uneditable-input.span11 {
|
||||
width: 1060px;
|
||||
}
|
||||
input.span10,
|
||||
textarea.span10,
|
||||
.uneditable-input.span10 {
|
||||
width: 960px;
|
||||
}
|
||||
input.span9,
|
||||
textarea.span9,
|
||||
.uneditable-input.span9 {
|
||||
width: 860px;
|
||||
}
|
||||
input.span8,
|
||||
textarea.span8,
|
||||
.uneditable-input.span8 {
|
||||
width: 760px;
|
||||
}
|
||||
input.span7,
|
||||
textarea.span7,
|
||||
.uneditable-input.span7 {
|
||||
width: 660px;
|
||||
}
|
||||
input.span6,
|
||||
textarea.span6,
|
||||
.uneditable-input.span6 {
|
||||
width: 560px;
|
||||
}
|
||||
input.span5,
|
||||
textarea.span5,
|
||||
.uneditable-input.span5 {
|
||||
width: 460px;
|
||||
}
|
||||
input.span4,
|
||||
textarea.span4,
|
||||
.uneditable-input.span4 {
|
||||
width: 360px;
|
||||
}
|
||||
input.span3,
|
||||
textarea.span3,
|
||||
.uneditable-input.span3 {
|
||||
width: 260px;
|
||||
}
|
||||
input.span2,
|
||||
textarea.span2,
|
||||
.uneditable-input.span2 {
|
||||
width: 160px;
|
||||
}
|
||||
input.span1,
|
||||
textarea.span1,
|
||||
.uneditable-input.span1 {
|
||||
width: 60px;
|
||||
}
|
||||
.thumbnails {
|
||||
margin-left: -30px;
|
||||
}
|
||||
.thumbnails > li {
|
||||
margin-left: 30px;
|
||||
}
|
||||
.row-fluid .thumbnails {
|
||||
margin-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 979px) {
|
||||
body {
|
||||
padding-top: 0;
|
||||
}
|
||||
.navbar-fixed-top,
|
||||
.navbar-fixed-bottom {
|
||||
position: static;
|
||||
}
|
||||
.navbar-fixed-top {
|
||||
margin-bottom: 18px;
|
||||
}
|
||||
.navbar-fixed-bottom {
|
||||
margin-top: 18px;
|
||||
}
|
||||
.navbar-fixed-top .navbar-inner,
|
||||
.navbar-fixed-bottom .navbar-inner {
|
||||
padding: 5px;
|
||||
}
|
||||
.navbar .container {
|
||||
width: auto;
|
||||
padding: 0;
|
||||
}
|
||||
.navbar .brand {
|
||||
padding-right: 10px;
|
||||
padding-left: 10px;
|
||||
margin: 0 0 0 -5px;
|
||||
}
|
||||
.nav-collapse {
|
||||
clear: both;
|
||||
}
|
||||
.nav-collapse .nav {
|
||||
float: none;
|
||||
margin: 0 0 9px;
|
||||
}
|
||||
.nav-collapse .nav > li {
|
||||
float: none;
|
||||
}
|
||||
.nav-collapse .nav > li > a {
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
.nav-collapse .nav > .divider-vertical {
|
||||
display: none;
|
||||
}
|
||||
.nav-collapse .nav .nav-header {
|
||||
color: #999999;
|
||||
text-shadow: none;
|
||||
}
|
||||
.nav-collapse .nav > li > a,
|
||||
.nav-collapse .dropdown-menu a {
|
||||
padding: 6px 15px;
|
||||
font-weight: bold;
|
||||
color: #999999;
|
||||
-webkit-border-radius: 3px;
|
||||
-moz-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.nav-collapse .btn {
|
||||
padding: 4px 10px 4px;
|
||||
font-weight: normal;
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.nav-collapse .dropdown-menu li + li a {
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
.nav-collapse .nav > li > a:hover,
|
||||
.nav-collapse .dropdown-menu a:hover {
|
||||
background-color: #222222;
|
||||
}
|
||||
.nav-collapse.in .btn-group {
|
||||
padding: 0;
|
||||
margin-top: 5px;
|
||||
}
|
||||
.nav-collapse .dropdown-menu {
|
||||
position: static;
|
||||
top: auto;
|
||||
left: auto;
|
||||
display: block;
|
||||
float: none;
|
||||
max-width: none;
|
||||
padding: 0;
|
||||
margin: 0 15px;
|
||||
background-color: transparent;
|
||||
border: none;
|
||||
-webkit-border-radius: 0;
|
||||
-moz-border-radius: 0;
|
||||
border-radius: 0;
|
||||
-webkit-box-shadow: none;
|
||||
-moz-box-shadow: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
.nav-collapse .dropdown-menu:before,
|
||||
.nav-collapse .dropdown-menu:after {
|
||||
display: none;
|
||||
}
|
||||
.nav-collapse .dropdown-menu .divider {
|
||||
display: none;
|
||||
}
|
||||
.nav-collapse .navbar-form,
|
||||
.nav-collapse .navbar-search {
|
||||
float: none;
|
||||
padding: 9px 15px;
|
||||
margin: 9px 0;
|
||||
border-top: 1px solid #222222;
|
||||
border-bottom: 1px solid #222222;
|
||||
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||
-moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
.navbar .nav-collapse .nav.pull-right {
|
||||
float: none;
|
||||
margin-left: 0;
|
||||
}
|
||||
.nav-collapse,
|
||||
.nav-collapse.collapse {
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
.navbar .btn-navbar {
|
||||
display: block;
|
||||
}
|
||||
.navbar-static .navbar-inner {
|
||||
padding-right: 10px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 980px) {
|
||||
.nav-collapse.collapse {
|
||||
height: auto !important;
|
||||
overflow: visible !important;
|
||||
}
|
||||
}
|
||||
Vendored
+9
File diff suppressed because one or more lines are too long
+4983
File diff suppressed because it is too large
Load Diff
+9
File diff suppressed because one or more lines are too long
BIN
Binary file not shown.
|
After Width: | Height: | Size: 8.6 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 14 KiB |
File diff suppressed because it is too large
Load Diff
+6
File diff suppressed because one or more lines are too long
BIN
Binary file not shown.
|
After Width: | Height: | Size: 223 B |
+51
@@ -0,0 +1,51 @@
|
||||
/**
|
||||
* jQuery Validation Plugin 1.9.0
|
||||
*
|
||||
* http://bassistance.de/jquery-plugins/jquery-plugin-validation/
|
||||
* http://docs.jquery.com/Plugins/Validation
|
||||
*
|
||||
* Copyright (c) 2006 - 2011 Jörn Zaefferer
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
(function(c){c.extend(c.fn,{validate:function(a){if(this.length){var b=c.data(this[0],"validator");if(b)return b;this.attr("novalidate","novalidate");b=new c.validator(a,this[0]);c.data(this[0],"validator",b);if(b.settings.onsubmit){a=this.find("input, button");a.filter(".cancel").click(function(){b.cancelSubmit=true});b.settings.submitHandler&&a.filter(":submit").click(function(){b.submitButton=this});this.submit(function(d){function e(){if(b.settings.submitHandler){if(b.submitButton)var f=c("<input type='hidden'/>").attr("name",
|
||||
b.submitButton.name).val(b.submitButton.value).appendTo(b.currentForm);b.settings.submitHandler.call(b,b.currentForm);b.submitButton&&f.remove();return false}return true}b.settings.debug&&d.preventDefault();if(b.cancelSubmit){b.cancelSubmit=false;return e()}if(b.form()){if(b.pendingRequest){b.formSubmitted=true;return false}return e()}else{b.focusInvalid();return false}})}return b}else a&&a.debug&&window.console&&console.warn("nothing selected, can't validate, returning nothing")},valid:function(){if(c(this[0]).is("form"))return this.validate().form();
|
||||
else{var a=true,b=c(this[0].form).validate();this.each(function(){a&=b.element(this)});return a}},removeAttrs:function(a){var b={},d=this;c.each(a.split(/\s/),function(e,f){b[f]=d.attr(f);d.removeAttr(f)});return b},rules:function(a,b){var d=this[0];if(a){var e=c.data(d.form,"validator").settings,f=e.rules,g=c.validator.staticRules(d);switch(a){case "add":c.extend(g,c.validator.normalizeRule(b));f[d.name]=g;if(b.messages)e.messages[d.name]=c.extend(e.messages[d.name],b.messages);break;case "remove":if(!b){delete f[d.name];
|
||||
return g}var h={};c.each(b.split(/\s/),function(j,i){h[i]=g[i];delete g[i]});return h}}d=c.validator.normalizeRules(c.extend({},c.validator.metadataRules(d),c.validator.classRules(d),c.validator.attributeRules(d),c.validator.staticRules(d)),d);if(d.required){e=d.required;delete d.required;d=c.extend({required:e},d)}return d}});c.extend(c.expr[":"],{blank:function(a){return!c.trim(""+a.value)},filled:function(a){return!!c.trim(""+a.value)},unchecked:function(a){return!a.checked}});c.validator=function(a,
|
||||
b){this.settings=c.extend(true,{},c.validator.defaults,a);this.currentForm=b;this.init()};c.validator.format=function(a,b){if(arguments.length==1)return function(){var d=c.makeArray(arguments);d.unshift(a);return c.validator.format.apply(this,d)};if(arguments.length>2&&b.constructor!=Array)b=c.makeArray(arguments).slice(1);if(b.constructor!=Array)b=[b];c.each(b,function(d,e){a=a.replace(RegExp("\\{"+d+"\\}","g"),e)});return a};c.extend(c.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",
|
||||
validClass:"valid",errorElement:"label",focusInvalid:true,errorContainer:c([]),errorLabelContainer:c([]),onsubmit:true,ignore:":hidden",ignoreTitle:false,onfocusin:function(a){this.lastActive=a;if(this.settings.focusCleanup&&!this.blockFocusCleanup){this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass);this.addWrapper(this.errorsFor(a)).hide()}},onfocusout:function(a){if(!this.checkable(a)&&(a.name in this.submitted||!this.optional(a)))this.element(a)},
|
||||
onkeyup:function(a){if(a.name in this.submitted||a==this.lastElement)this.element(a)},onclick:function(a){if(a.name in this.submitted)this.element(a);else a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(a,b,d){a.type==="radio"?this.findByName(a.name).addClass(b).removeClass(d):c(a).addClass(b).removeClass(d)},unhighlight:function(a,b,d){a.type==="radio"?this.findByName(a.name).removeClass(b).addClass(d):c(a).removeClass(b).addClass(d)}},setDefaults:function(a){c.extend(c.validator.defaults,
|
||||
a)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",accept:"Please enter a value with a valid extension.",maxlength:c.validator.format("Please enter no more than {0} characters."),
|
||||
minlength:c.validator.format("Please enter at least {0} characters."),rangelength:c.validator.format("Please enter a value between {0} and {1} characters long."),range:c.validator.format("Please enter a value between {0} and {1}."),max:c.validator.format("Please enter a value less than or equal to {0}."),min:c.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:false,prototype:{init:function(){function a(e){var f=c.data(this[0].form,"validator"),g="on"+e.type.replace(/^validate/,
|
||||
"");f.settings[g]&&f.settings[g].call(f,this[0],e)}this.labelContainer=c(this.settings.errorLabelContainer);this.errorContext=this.labelContainer.length&&this.labelContainer||c(this.currentForm);this.containers=c(this.settings.errorContainer).add(this.settings.errorLabelContainer);this.submitted={};this.valueCache={};this.pendingRequest=0;this.pending={};this.invalid={};this.reset();var b=this.groups={};c.each(this.settings.groups,function(e,f){c.each(f.split(/\s/),function(g,h){b[h]=e})});var d=
|
||||
this.settings.rules;c.each(d,function(e,f){d[e]=c.validator.normalizeRule(f)});c(this.currentForm).validateDelegate("[type='text'], [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'] ","focusin focusout keyup",a).validateDelegate("[type='radio'], [type='checkbox'], select, option","click",
|
||||
a);this.settings.invalidHandler&&c(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){this.checkForm();c.extend(this.submitted,this.errorMap);this.invalid=c.extend({},this.errorMap);this.valid()||c(this.currentForm).triggerHandler("invalid-form",[this]);this.showErrors();return this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(a){this.lastElement=
|
||||
a=this.validationTargetFor(this.clean(a));this.prepareElement(a);this.currentElements=c(a);var b=this.check(a);if(b)delete this.invalid[a.name];else this.invalid[a.name]=true;if(!this.numberOfInvalids())this.toHide=this.toHide.add(this.containers);this.showErrors();return b},showErrors:function(a){if(a){c.extend(this.errorMap,a);this.errorList=[];for(var b in a)this.errorList.push({message:a[b],element:this.findByName(b)[0]});this.successList=c.grep(this.successList,function(d){return!(d.name in a)})}this.settings.showErrors?
|
||||
this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){c.fn.resetForm&&c(this.currentForm).resetForm();this.submitted={};this.lastElement=null;this.prepareForm();this.hideErrors();this.elements().removeClass(this.settings.errorClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b=0,d;for(d in a)b++;return b},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){return this.size()==
|
||||
0},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{c(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(a){}},findLastActive:function(){var a=this.lastActive;return a&&c.grep(this.errorList,function(b){return b.element.name==a.name}).length==1&&a},elements:function(){var a=this,b={};return c(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){!this.name&&
|
||||
a.settings.debug&&window.console&&console.error("%o has no name assigned",this);if(this.name in b||!a.objectLength(c(this).rules()))return false;return b[this.name]=true})},clean:function(a){return c(a)[0]},errors:function(){return c(this.settings.errorElement+"."+this.settings.errorClass,this.errorContext)},reset:function(){this.successList=[];this.errorList=[];this.errorMap={};this.toShow=c([]);this.toHide=c([]);this.currentElements=c([])},prepareForm:function(){this.reset();this.toHide=this.errors().add(this.containers)},
|
||||
prepareElement:function(a){this.reset();this.toHide=this.errorsFor(a)},check:function(a){a=this.validationTargetFor(this.clean(a));var b=c(a).rules(),d=false,e;for(e in b){var f={method:e,parameters:b[e]};try{var g=c.validator.methods[e].call(this,a.value.replace(/\r/g,""),a,f.parameters);if(g=="dependency-mismatch")d=true;else{d=false;if(g=="pending"){this.toHide=this.toHide.not(this.errorsFor(a));return}if(!g){this.formatAndAdd(a,f);return false}}}catch(h){this.settings.debug&&window.console&&console.log("exception occured when checking element "+
|
||||
a.id+", check the '"+f.method+"' method",h);throw h;}}if(!d){this.objectLength(b)&&this.successList.push(a);return true}},customMetaMessage:function(a,b){if(c.metadata){var d=this.settings.meta?c(a).metadata()[this.settings.meta]:c(a).metadata();return d&&d.messages&&d.messages[b]}},customMessage:function(a,b){var d=this.settings.messages[a];return d&&(d.constructor==String?d:d[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==undefined)return arguments[a]},defaultMessage:function(a,
|
||||
b){return this.findDefined(this.customMessage(a.name,b),this.customMetaMessage(a,b),!this.settings.ignoreTitle&&a.title||undefined,c.validator.messages[b],"<strong>Warning: No message defined for "+a.name+"</strong>")},formatAndAdd:function(a,b){var d=this.defaultMessage(a,b.method),e=/\$?\{(\d+)\}/g;if(typeof d=="function")d=d.call(this,b.parameters,a);else if(e.test(d))d=jQuery.format(d.replace(e,"{$1}"),b.parameters);this.errorList.push({message:d,element:a});this.errorMap[a.name]=d;this.submitted[a.name]=
|
||||
d},addWrapper:function(a){if(this.settings.wrapper)a=a.add(a.parent(this.settings.wrapper));return a},defaultShowErrors:function(){for(var a=0;this.errorList[a];a++){var b=this.errorList[a];this.settings.highlight&&this.settings.highlight.call(this,b.element,this.settings.errorClass,this.settings.validClass);this.showLabel(b.element,b.message)}if(this.errorList.length)this.toShow=this.toShow.add(this.containers);if(this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);
|
||||
if(this.settings.unhighlight){a=0;for(b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass)}this.toHide=this.toHide.not(this.toShow);this.hideErrors();this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return c(this.errorList).map(function(){return this.element})},showLabel:function(a,b){var d=this.errorsFor(a);if(d.length){d.removeClass(this.settings.validClass).addClass(this.settings.errorClass);
|
||||
d.attr("generated")&&d.html(b)}else{d=c("<"+this.settings.errorElement+"/>").attr({"for":this.idOrName(a),generated:true}).addClass(this.settings.errorClass).html(b||"");if(this.settings.wrapper)d=d.hide().show().wrap("<"+this.settings.wrapper+"/>").parent();this.labelContainer.append(d).length||(this.settings.errorPlacement?this.settings.errorPlacement(d,c(a)):d.insertAfter(a))}if(!b&&this.settings.success){d.text("");typeof this.settings.success=="string"?d.addClass(this.settings.success):this.settings.success(d)}this.toShow=
|
||||
this.toShow.add(d)},errorsFor:function(a){var b=this.idOrName(a);return this.errors().filter(function(){return c(this).attr("for")==b})},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(a){if(this.checkable(a))a=this.findByName(a.name).not(this.settings.ignore)[0];return a},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(a){var b=this.currentForm;return c(document.getElementsByName(a)).map(function(d,
|
||||
e){return e.form==b&&e.name==a&&e||null})},getLength:function(a,b){switch(b.nodeName.toLowerCase()){case "select":return c("option:selected",b).length;case "input":if(this.checkable(b))return this.findByName(b.name).filter(":checked").length}return a.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):true},dependTypes:{"boolean":function(a){return a},string:function(a,b){return!!c(a,b.form).length},"function":function(a,b){return a(b)}},optional:function(a){return!c.validator.methods.required.call(this,
|
||||
c.trim(a.value),a)&&"dependency-mismatch"},startRequest:function(a){if(!this.pending[a.name]){this.pendingRequest++;this.pending[a.name]=true}},stopRequest:function(a,b){this.pendingRequest--;if(this.pendingRequest<0)this.pendingRequest=0;delete this.pending[a.name];if(b&&this.pendingRequest==0&&this.formSubmitted&&this.form()){c(this.currentForm).submit();this.formSubmitted=false}else if(!b&&this.pendingRequest==0&&this.formSubmitted){c(this.currentForm).triggerHandler("invalid-form",[this]);this.formSubmitted=
|
||||
false}},previousValue:function(a){return c.data(a,"previousValue")||c.data(a,"previousValue",{old:null,valid:true,message:this.defaultMessage(a,"remote")})}},classRuleSettings:{required:{required:true},email:{email:true},url:{url:true},date:{date:true},dateISO:{dateISO:true},dateDE:{dateDE:true},number:{number:true},numberDE:{numberDE:true},digits:{digits:true},creditcard:{creditcard:true}},addClassRules:function(a,b){a.constructor==String?this.classRuleSettings[a]=b:c.extend(this.classRuleSettings,
|
||||
a)},classRules:function(a){var b={};(a=c(a).attr("class"))&&c.each(a.split(" "),function(){this in c.validator.classRuleSettings&&c.extend(b,c.validator.classRuleSettings[this])});return b},attributeRules:function(a){var b={};a=c(a);for(var d in c.validator.methods){var e;if(e=d==="required"&&typeof c.fn.prop==="function"?a.prop(d):a.attr(d))b[d]=e;else if(a[0].getAttribute("type")===d)b[d]=true}b.maxlength&&/-1|2147483647|524288/.test(b.maxlength)&&delete b.maxlength;return b},metadataRules:function(a){if(!c.metadata)return{};
|
||||
var b=c.data(a.form,"validator").settings.meta;return b?c(a).metadata()[b]:c(a).metadata()},staticRules:function(a){var b={},d=c.data(a.form,"validator");if(d.settings.rules)b=c.validator.normalizeRule(d.settings.rules[a.name])||{};return b},normalizeRules:function(a,b){c.each(a,function(d,e){if(e===false)delete a[d];else if(e.param||e.depends){var f=true;switch(typeof e.depends){case "string":f=!!c(e.depends,b.form).length;break;case "function":f=e.depends.call(b,b)}if(f)a[d]=e.param!==undefined?
|
||||
e.param:true;else delete a[d]}});c.each(a,function(d,e){a[d]=c.isFunction(e)?e(b):e});c.each(["minlength","maxlength","min","max"],function(){if(a[this])a[this]=Number(a[this])});c.each(["rangelength","range"],function(){if(a[this])a[this]=[Number(a[this][0]),Number(a[this][1])]});if(c.validator.autoCreateRanges){if(a.min&&a.max){a.range=[a.min,a.max];delete a.min;delete a.max}if(a.minlength&&a.maxlength){a.rangelength=[a.minlength,a.maxlength];delete a.minlength;delete a.maxlength}}a.messages&&delete a.messages;
|
||||
return a},normalizeRule:function(a){if(typeof a=="string"){var b={};c.each(a.split(/\s/),function(){b[this]=true});a=b}return a},addMethod:function(a,b,d){c.validator.methods[a]=b;c.validator.messages[a]=d!=undefined?d:c.validator.messages[a];b.length<3&&c.validator.addClassRules(a,c.validator.normalizeRule(a))},methods:{required:function(a,b,d){if(!this.depend(d,b))return"dependency-mismatch";switch(b.nodeName.toLowerCase()){case "select":return(a=c(b).val())&&a.length>0;case "input":if(this.checkable(b))return this.getLength(a,
|
||||
b)>0;default:return c.trim(a).length>0}},remote:function(a,b,d){if(this.optional(b))return"dependency-mismatch";var e=this.previousValue(b);this.settings.messages[b.name]||(this.settings.messages[b.name]={});e.originalMessage=this.settings.messages[b.name].remote;this.settings.messages[b.name].remote=e.message;d=typeof d=="string"&&{url:d}||d;if(this.pending[b.name])return"pending";if(e.old===a)return e.valid;e.old=a;var f=this;this.startRequest(b);var g={};g[b.name]=a;c.ajax(c.extend(true,{url:d,
|
||||
mode:"abort",port:"validate"+b.name,dataType:"json",data:g,success:function(h){f.settings.messages[b.name].remote=e.originalMessage;var j=h===true;if(j){var i=f.formSubmitted;f.prepareElement(b);f.formSubmitted=i;f.successList.push(b);f.showErrors()}else{i={};h=h||f.defaultMessage(b,"remote");i[b.name]=e.message=c.isFunction(h)?h(a):h;f.showErrors(i)}e.valid=j;f.stopRequest(b,j)}},d));return"pending"},minlength:function(a,b,d){return this.optional(b)||this.getLength(c.trim(a),b)>=d},maxlength:function(a,
|
||||
b,d){return this.optional(b)||this.getLength(c.trim(a),b)<=d},rangelength:function(a,b,d){a=this.getLength(c.trim(a),b);return this.optional(b)||a>=d[0]&&a<=d[1]},min:function(a,b,d){return this.optional(b)||a>=d},max:function(a,b,d){return this.optional(b)||a<=d},range:function(a,b,d){return this.optional(b)||a>=d[0]&&a<=d[1]},email:function(a,b){return this.optional(b)||/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(a)},
|
||||
url:function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},
|
||||
date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a))},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 -]+/.test(a))return false;var d=0,e=0,f=false;a=a.replace(/\D/g,"");for(var g=a.length-1;g>=
|
||||
0;g--){e=a.charAt(g);e=parseInt(e,10);if(f)if((e*=2)>9)e-=9;d+=e;f=!f}return d%10==0},accept:function(a,b,d){d=typeof d=="string"?d.replace(/,/g,"|"):"png|jpe?g|gif";return this.optional(b)||a.match(RegExp(".("+d+")$","i"))},equalTo:function(a,b,d){d=c(d).unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){c(b).valid()});return a==d.val()}}});c.format=c.validator.format})(jQuery);
|
||||
(function(c){var a={};if(c.ajaxPrefilter)c.ajaxPrefilter(function(d,e,f){e=d.port;if(d.mode=="abort"){a[e]&&a[e].abort();a[e]=f}});else{var b=c.ajax;c.ajax=function(d){var e=("port"in d?d:c.ajaxSettings).port;if(("mode"in d?d:c.ajaxSettings).mode=="abort"){a[e]&&a[e].abort();return a[e]=b.apply(this,arguments)}return b.apply(this,arguments)}}})(jQuery);
|
||||
(function(c){!jQuery.event.special.focusin&&!jQuery.event.special.focusout&&document.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.handle.call(this,e)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)},handler:function(e){arguments[0]=c.event.fix(e);arguments[0].type=b;return c.event.handle.apply(this,arguments)}}});c.extend(c.fn,{validateDelegate:function(a,
|
||||
b,d){return this.bind(b,function(e){var f=c(e.target);if(f.is(a))return d.apply(f,arguments)})}})})(jQuery);
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Translated default messages for the jQuery validation plugin.
|
||||
* Locale: CN
|
||||
*/
|
||||
jQuery.extend(jQuery.validator.messages, {
|
||||
required: "必选字段",
|
||||
remote: "请修正该字段",
|
||||
email: "请输入正确格式的电子邮件",
|
||||
url: "请输入合法的网址",
|
||||
date: "请输入合法的日期",
|
||||
dateISO: "请输入合法的日期 (ISO).",
|
||||
number: "请输入合法的数字",
|
||||
digits: "只能输入整数",
|
||||
creditcard: "请输入合法的信用卡号",
|
||||
equalTo: "请再次输入相同的值",
|
||||
accept: "请输入拥有合法后缀名的字符串",
|
||||
maxlength: jQuery.validator.format("请输入一个长度最多是 {0} 的字符串"),
|
||||
minlength: jQuery.validator.format("请输入一个长度最少是 {0} 的字符串"),
|
||||
rangelength: jQuery.validator.format("请输入一个长度介于 {0} 和 {1} 之间的字符串"),
|
||||
range: jQuery.validator.format("请输入一个介于 {0} 和 {1} 之间的值"),
|
||||
max: jQuery.validator.format("请输入一个最大为 {0} 的值"),
|
||||
min: jQuery.validator.format("请输入一个最小为 {0} 的值")
|
||||
});
|
||||
@@ -0,0 +1,7 @@
|
||||
label.error {
|
||||
background:url("images/unchecked.gif") no-repeat 0px 0px;
|
||||
padding-left: 16px;
|
||||
padding-bottom: 2px;
|
||||
font-weight: bold;
|
||||
color: #EA5200;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -0,0 +1,17 @@
|
||||
/* header */
|
||||
#header {margin-bottom:15px;}
|
||||
|
||||
#header h1 {color: #658A16;}
|
||||
|
||||
#header h1 small {color: #BACE87;}
|
||||
|
||||
/* footer */
|
||||
#footer {
|
||||
margin-top: 15px;
|
||||
padding: 15px 0px 0px 0px;
|
||||
font-size: 95%;
|
||||
text-align: center;
|
||||
border-top: 2px solid #658A16;
|
||||
}
|
||||
|
||||
#footer a {color: #999;}
|
||||
+110
@@ -0,0 +1,110 @@
|
||||
package org.springside.examples.quickstart.functional;
|
||||
|
||||
import java.net.URL;
|
||||
import java.sql.Driver;
|
||||
|
||||
import org.eclipse.jetty.server.Server;
|
||||
import org.junit.BeforeClass;
|
||||
import org.openqa.selenium.WebDriver;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
|
||||
import org.springside.modules.test.data.DataFixtures;
|
||||
import org.springside.modules.test.functional.JettyFactory;
|
||||
import org.springside.modules.test.functional.Selenium2;
|
||||
import org.springside.modules.test.functional.WebDriverFactory;
|
||||
import org.springside.modules.utils.PropertiesLoader;
|
||||
|
||||
/**
|
||||
* 功能测试基类.
|
||||
*
|
||||
* 在整个测试期间启动一次Jetty Server和 Selenium,在JVM退出时关闭两者。
|
||||
* 在每个TestCase Class执行前重新载入默认数据.
|
||||
*
|
||||
* @author calvin
|
||||
*/
|
||||
public class BaseFunctionalTestCase {
|
||||
|
||||
protected static String baseUrl;
|
||||
|
||||
protected static Server jettyServer;
|
||||
|
||||
protected static SimpleDriverDataSource dataSource;
|
||||
|
||||
protected static Selenium2 s;
|
||||
|
||||
protected static PropertiesLoader propertiesLoader = new PropertiesLoader("classpath:/application.properties",
|
||||
"classpath:/application.functional.properties", "classpath:/application.functional-local.properties");
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(BaseFunctionalTestCase.class);
|
||||
|
||||
@BeforeClass
|
||||
public static void beforeClass() throws Exception {
|
||||
|
||||
baseUrl = propertiesLoader.getProperty("baseUrl", QuickStartServer.BASE_URL);
|
||||
|
||||
//如果是目标地址是localhost,则启动嵌入式jetty。如果指向远程地址,则不需要启动Jetty.
|
||||
Boolean isEmbedded = new URL(baseUrl).getHost().equals("localhost");
|
||||
|
||||
if (isEmbedded) {
|
||||
startJettyOnce();
|
||||
}
|
||||
|
||||
buildDataSourceOnce();
|
||||
reloadSampleData();
|
||||
|
||||
createSeleniumOnce();
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动Jetty服务器, 仅启动一次.
|
||||
*/
|
||||
protected static void startJettyOnce() throws Exception {
|
||||
if (jettyServer == null) {
|
||||
//设定Spring的profile
|
||||
System.setProperty("spring.profiles.active", "functional");
|
||||
|
||||
jettyServer = JettyFactory.createServerInSource(new URL(baseUrl).getPort(), QuickStartServer.CONTEXT);
|
||||
jettyServer.start();
|
||||
|
||||
logger.info("Jetty Server started");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造数据源,仅构造一次.
|
||||
* 连接参数从配置文件中读取,可指向本地的开发环境,也可以指向远程的测试服务器。
|
||||
*/
|
||||
protected static void buildDataSourceOnce() throws ClassNotFoundException {
|
||||
if (dataSource == null) {
|
||||
dataSource = new SimpleDriverDataSource();
|
||||
dataSource.setDriverClass((Class<? extends Driver>) Class.forName(propertiesLoader
|
||||
.getProperty("jdbc.driver")));
|
||||
dataSource.setUrl(propertiesLoader.getProperty("jdbc.url"));
|
||||
dataSource.setUsername(propertiesLoader.getProperty("jdbc.username"));
|
||||
dataSource.setPassword(propertiesLoader.getProperty("jdbc.password"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 载入测试数据.
|
||||
*/
|
||||
protected static void reloadSampleData() throws Exception {
|
||||
DataFixtures.reloadData(dataSource, "/data/sample-data.xml");
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建Selenium,,仅构造一次.
|
||||
*/
|
||||
protected static void createSeleniumOnce() throws Exception {
|
||||
if (s == null) {
|
||||
//根据配置创建Selenium driver.
|
||||
String driverName = propertiesLoader.getProperty("selenium.driver");
|
||||
|
||||
WebDriver driver = WebDriverFactory.createDriver(driverName);
|
||||
|
||||
s = new Selenium2(driver, baseUrl);
|
||||
s.setStopAtShutdown();
|
||||
}
|
||||
}
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
package org.springside.examples.quickstart.functional;
|
||||
|
||||
import org.eclipse.jetty.server.Server;
|
||||
import org.springside.modules.test.functional.JettyFactory;
|
||||
|
||||
/**
|
||||
* 使用Jetty运行调试Web应用, 在Console输入回车停止服务.
|
||||
*
|
||||
* @author calvin
|
||||
*/
|
||||
public class QuickStartServer {
|
||||
|
||||
public static final int PORT = 8080;
|
||||
public static final String CONTEXT = "/quickstart";
|
||||
public static final String BASE_URL = "http://localhost:8080/quickstart";
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
//设定Spring的profile
|
||||
System.setProperty("spring.profiles.active", "development");
|
||||
|
||||
//启动Jetty
|
||||
Server server = JettyFactory.createServerInSource(PORT, CONTEXT);
|
||||
try {
|
||||
server.start();
|
||||
|
||||
System.out.println("Server running at " + BASE_URL);
|
||||
System.out.println("Hit Enter in console to stop server");
|
||||
|
||||
//wait for close
|
||||
System.in.read();
|
||||
server.stop();
|
||||
server.join();
|
||||
System.out.println("Server stopped");
|
||||
} catch (Exception e) {
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package org.springside.examples.quickstart.functional;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.experimental.categories.Category;
|
||||
import org.springside.modules.test.category.Smoke;
|
||||
|
||||
/**
|
||||
* 任务管理的功能测试, 测试页面JavaScript及主要用户故事流程.
|
||||
*
|
||||
* @author calvin
|
||||
*/
|
||||
public class TaskManageIT extends BaseFunctionalTestCase {
|
||||
|
||||
/**
|
||||
* 查看任务列表.
|
||||
*/
|
||||
@Test
|
||||
@Category(Smoke.class)
|
||||
public void viewTaskList() {
|
||||
s.open("/task/");
|
||||
}
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package org.springside.examples.quickstart.dao;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.PersistenceContext;
|
||||
import javax.persistence.metamodel.EntityType;
|
||||
import javax.persistence.metamodel.Metamodel;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springside.modules.test.spring.SpringTransactionalTestCase;
|
||||
|
||||
@ContextConfiguration(locations = { "/applicationContext.xml" })
|
||||
public class JpaMappingTest extends SpringTransactionalTestCase {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(JpaMappingTest.class);
|
||||
|
||||
@PersistenceContext
|
||||
private EntityManager em;
|
||||
|
||||
@Test
|
||||
public void allClassMapping() throws Exception {
|
||||
Metamodel model = em.getEntityManagerFactory().getMetamodel();
|
||||
for (EntityType entityType : model.getEntities()) {
|
||||
String entityName = entityType.getName();
|
||||
em.createQuery("select o from " + entityName + " o").getFirstResult();
|
||||
logger.info("ok: " + entityName);
|
||||
}
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package org.springside.examples.quickstart.data;
|
||||
|
||||
import org.springside.examples.quickstart.entity.Task;
|
||||
import org.springside.modules.test.data.RandomData;
|
||||
|
||||
/**
|
||||
* Task相关实体测试数据生成.
|
||||
*
|
||||
* @author calvin
|
||||
*/
|
||||
public class TaskData {
|
||||
|
||||
public static Task getRandomTask() {
|
||||
Task task = new Task();
|
||||
task.setTitle(RandomData.randomName("Task"));
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package org.springside.examples.quickstart.service;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.springside.examples.quickstart.dao.TaskDao;
|
||||
import org.springside.examples.quickstart.service.TaskManager;
|
||||
|
||||
/**
|
||||
* TaskManager的测试用例, 测试Service层的业务逻辑.
|
||||
*
|
||||
* @author calvin
|
||||
*/
|
||||
public class TaskManagerTest {
|
||||
|
||||
private TaskManager taskManager;
|
||||
@Mock
|
||||
private TaskDao mockTaskDao;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
taskManager = new TaskManager();
|
||||
taskManager.setTaskDao(mockTaskDao);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
#(optional)override jdbc url for local development
|
||||
@@ -0,0 +1,7 @@
|
||||
baseUrl=http://localhost:8082/quickstart
|
||||
|
||||
#selenium settings, options include firefox,ie,chrome,remote:localhost:4444:firefox
|
||||
selenium.driver=firefox
|
||||
|
||||
#(optional)override jdbc url for functional test
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<dataset>
|
||||
<TASK ID="1" TITLE="Study PlayFramework 2.0" />
|
||||
<TASK ID="2" TITLE="Study Grails2.0" />
|
||||
<TASK ID="3" TITLE="Try SpringFuse" />
|
||||
<TASK ID="4" TITLE="Try Spring Roo" />
|
||||
<TASK ID="5" TITLE="Release SprignSide 4.0" />
|
||||
</dataset>
|
||||
@@ -16,8 +16,7 @@
|
||||
<ul>
|
||||
<li>演示基于Guava的单JVM内的,简单Cache</li>
|
||||
<li>演示基于Ehcache的JVM内的,可集群共享的,功能丰富的Cache</li>
|
||||
<li>演示基于Memcached的中央式cache,使用Spymemcached客户端</li>
|
||||
|
||||
<li>演示基于Memcached的中央式cache,使用Spymemcached客户端</li>
|
||||
</ul>
|
||||
|
||||
<h3>用户故事:</h3>
|
||||
|
||||
@@ -24,6 +24,5 @@
|
||||
<li>HMAC-SHA1共享密钥消息签名演示.(见Cryptos及其测试用例)</li>
|
||||
<li>AES的共享密钥消息加密演示,支持IV(初始向量).(见Cryptos及其测试用例)</li>
|
||||
</ul>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -71,6 +71,7 @@
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.module</groupId>
|
||||
<artifactId>jackson-module-jaxb-annotations</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sf.dozer</groupId>
|
||||
|
||||
@@ -54,7 +54,7 @@ public class Hibernates {
|
||||
} else if (StringUtils.contains(jdbcUrl, ":oracle:")) {
|
||||
return Oracle10gDialect.class.getName();
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unknown Database");
|
||||
throw new IllegalArgumentException("Unknown Database of " + jdbcUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+22
-5
@@ -15,6 +15,8 @@
|
||||
<hibernate.version>4.1.4.Final</hibernate.version>
|
||||
<mybatis.version>3.1.1</mybatis.version>
|
||||
<spring-data-jpa.version>1.1.0.RELEASE</spring-data-jpa.version>
|
||||
<commons-dbcp.version>1.4</commons-dbcp.version>
|
||||
<sitemesh.version>2.4.2</sitemesh.version>
|
||||
<cxf.version>2.6.1</cxf.version>
|
||||
<jersey.version>1.13</jersey.version>
|
||||
<shiro.version>1.2.0</shiro.version>
|
||||
@@ -33,6 +35,7 @@
|
||||
<freemarker.version>2.3.19</freemarker.version>
|
||||
<poi.version>3.8</poi.version>
|
||||
<slf4j.version>1.6.6</slf4j.version>
|
||||
<log4j.version>1.2.17</log4j.version>
|
||||
<jetty.version>7.6.4.v20120524</jetty.version>
|
||||
<h2.version>1.3.167</h2.version>
|
||||
<junit.version>4.10</junit.version>
|
||||
@@ -199,6 +202,12 @@
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-jpa</artifactId>
|
||||
<version>${spring-data-jpa.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit-dep</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<!-- mybatis -->
|
||||
@@ -229,7 +238,7 @@
|
||||
<dependency>
|
||||
<groupId>commons-dbcp</groupId>
|
||||
<artifactId>commons-dbcp</artifactId>
|
||||
<version>1.4</version>
|
||||
<version>${commons-dbcp.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-pool</groupId>
|
||||
@@ -255,7 +264,7 @@
|
||||
<dependency>
|
||||
<groupId>opensymphony</groupId>
|
||||
<artifactId>sitemesh</artifactId>
|
||||
<version>2.4.2</version>
|
||||
<version>${sitemesh.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- j2ee web spec -->
|
||||
@@ -471,7 +480,7 @@
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.17</version>
|
||||
<version>${log4j.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- log4jdbc -->
|
||||
@@ -748,6 +757,10 @@
|
||||
<groupId>org.seleniumhq.selenium</groupId>
|
||||
<artifactId>selenium-iphone-driver</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@@ -760,6 +773,10 @@
|
||||
<groupId>cglib</groupId>
|
||||
<artifactId>cglib-nodep</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>commons-logging</groupId>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
@@ -795,7 +812,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>2.4</version>
|
||||
<version>2.5</version>
|
||||
<configuration>
|
||||
<source>${jdk.version}</source>
|
||||
<target>${jdk.version}</target>
|
||||
@@ -876,7 +893,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-clean-plugin</artifactId>
|
||||
<version>2.4.1</version>
|
||||
<version>2.5</version>
|
||||
</plugin>
|
||||
|
||||
<!-- install插件 -->
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
eclipse.preferences.version=1
|
||||
encoding/<project>=UTF-8
|
||||
@@ -5,7 +5,7 @@ import javax.sql.DataSource;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
|
||||
/**
|
||||
* 在Spring Context启动时,使用DBUnit一次性初始化数据。
|
||||
* 在Spring Context�动时,使用DBUnit一次性�始化数�。
|
||||
*
|
||||
* @author calvin
|
||||
*/
|
||||
@@ -27,5 +27,4 @@ public class DataInitializer implements InitializingBean {
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
DataFixtures.reloadData(dataSource, dataFile);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+5
-8
@@ -19,15 +19,12 @@ mvn antrun:run -Prefresh-db
|
||||
cd ..
|
||||
|
||||
echo "[Step 4] Start all example projects."
|
||||
cd examples/mini-service
|
||||
mvn clean jetty:run -Djetty.port=8082 &
|
||||
cd ../mini-web
|
||||
mvn clean jetty:run -Djetty.port=8081 &
|
||||
cd ../showcase
|
||||
cd examples/quickstart
|
||||
mvn clean jetty:run &
|
||||
cd ../showcase
|
||||
mvn clean jetty:run -Djetty.port=8081 &
|
||||
|
||||
echo "[INFO] Please wait a moment then access below demo sites:"
|
||||
echo "[INFO] http://localhost:8082/mini-service"
|
||||
echo "[INFO] http://localhost:8081/mini-web"
|
||||
echo "[INFO] http://localhost:8080/showcase"
|
||||
echo "[INFO] http://localhost:8080/quickstart"
|
||||
echo "[INFO] http://localhost:8081/showcase"
|
||||
|
||||
|
||||
+5
-9
@@ -22,22 +22,18 @@ if errorlevel 1 goto error
|
||||
cd ..\
|
||||
|
||||
echo [Step 4] Start all example projects.
|
||||
cd examples\mini-service
|
||||
start "Mini-Service" %MVN% clean jetty:run -Djetty.port=8082
|
||||
if errorlevel 1 goto error
|
||||
cd ..\mini-web
|
||||
start "Mini-Web" %MVN% clean jetty:run -Djetty.port=8081
|
||||
cd examples\quickstart
|
||||
start "Quickstart" %MVN% clean jetty:run
|
||||
if errorlevel 1 goto error
|
||||
cd ..\showcase
|
||||
start "Showcase" %MVN% clean jetty:run
|
||||
start "Showcase" %MVN% clean jetty:run -Djetty.port=8081
|
||||
if errorlevel 1 goto error
|
||||
|
||||
cd ..\..\
|
||||
|
||||
echo [INFO] Please wait a moment then access below demo sites:
|
||||
echo [INFO] http://localhost:8082/mini-service
|
||||
echo [INFO] http://localhost:8081/mini-web
|
||||
echo [INFO] http://localhost:8080/showcase
|
||||
echo [INFO] http://localhost:8080/quickstart
|
||||
echo [INFO] http://localhost:8081/showcase
|
||||
|
||||
goto end
|
||||
:error
|
||||
|
||||
Reference in New Issue
Block a user