建立 maven-archetype-quickstart,GroupId/ArtifactId 自定,得到標準目錄結構與 pom.xml。
Properties → Project Facets → 勾選 Dynamic Web Module → 生成 WebContent/WEB-INF/web.xml。
<web-app version="3.0"> <welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list> </web-app>
<properties><spring.version>4.2.5.RELEASE</spring.version></properties> <dependencies> <!-- Spring Core, Web, ORM, TX, JDBC, WebMVC, AOP, Context, Test --> <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>1.10.1.RELEASE</version></dependency> </dependencies>
<context:component-scan base-package="com.anxpp.demo"/> <mvc:annotation-driven/>
<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener> <context-param><param-name>contextConfigLocation</param-name><param-value>WEB-INF/applicationContext.xml</param-value></context-param> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:springmvc-servlet.xml</param-value></init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>
User (id, name)UserDao interface + UserDaoImpl (@Repository)UserService interface + UserServiceImpl (@Service, @Autowired UserDao)DemoController (@Controller, @RequestMapping("/"), @Autowired UserService)Properties → Deployment Assembly → Add → Java Build Path Entries → Maven Dependencies,否則運行時缺 JAR。
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.5.0</version></dependency> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.5.0</version></dependency> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.5.0</version></dependency>
Controller 直接返回 Map<String, Object>,@ResponseBody 自動轉 JSON。
<mvc:default-servlet-handler/> <mvc:resources mapping="/resources/**" location="/public-resources/"> <mvc:cache-control max-age="3600" cache-public="true"/> </mvc:resources>
CharacterEncodingFilter (web.xml)server.xml <Connector URIEncoding="UTF-8"/><properties><hibernate.version>5.1.0.Final</hibernate.version></properties>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version></dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${hibernate.version}</version></dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.9</version></dependency>
<persistence-unit name="demo" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.anxpp.demo.core.entity.User</class>
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1:3306/demo?createDatabaseIfNotExist=true"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
</properties>
</persistence-unit>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true"/>
<property name="database" value="MYSQL"/>
</bean>
</property>
<property name="persistenceUnitName" value="demo"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<jpa:repositories base-package="com.anxpp.demo"/>
@Entity @Table
public class User {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String name;
// getter/setter/toString
}
public interface UserDao extends JpaRepository<User, Serializable> {
User findById(Integer id);
// 衍生查詢:方法名即語義
List<User> findByIdGreaterThanAndNameLike(Integer id, String name);
}
無需寫 DAO 實現,Spring Data JPA 自動代理實現所有 CRUD 與衍生查詢。
GET /findall → 返回所有用戶 JSONGET /findbyid?id=1 → 返回單用戶GET /add?name=Tom → 新增用戶findByIdGreaterThanAndNameLike 直接可用,無需寫 SQL/JPQL從零開始,逐層疊加,最終得到一個擁有 RESTful API、JSON 輸出、靜態資源、事務管理、JPA 自動化持久層的現代化 Spring 應用骨架。