实例代码目录结构
maven依赖
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mkyong.common</groupId>
<artifactId>RESTfulExample</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>RESTfulExample Maven Webapp</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>JBoss repository</id>
<url>https://repository.jboss.org/nexus/content/groups/public-jboss/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<version>2.3.4.726</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.14</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.4</version>
</dependency>
<!-- JBoss RESTEasy -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.0.4.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>3.0.4.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>3.0.4.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-spring</artifactId>
<version>3.0.4.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson2-provider</artifactId>
<version>3.0.4.Final</version>
</dependency>
<!-- Spring 3 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
<build>
<finalName>RESTfulExample</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
web.xml
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Restful Web Application</display-name>
<!-- Auto scan REST service -->
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<!-- this need same with resteasy servlet url-pattern -->
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/resteasy</param-value>
</context-param>
<!-- <context-param>-->
<!-- <param-name>resteasy.resources</param-name>-->
<!-- <param-value>com.mkyong.rest.PrintService</param-value>-->
<!-- </context-param>-->
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<!-- <listener> <listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class>
</listener> -->
<!-- <listener>-->
<!-- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>-->
<!-- </listener>-->
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/resteasy/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Upload</servlet-name>
<servlet-class>com.mkyong.rest.Upload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Upload</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
</web-app>
applicationContext.xml
<?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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!-- 使用Spring提供的数据库连接池 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
</bean>
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/> <!--注入DataSource以对事务进行管理-->
</bean>
<!-- 使用Spring提供的SqlMapClient -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:SqlMapConfig.xml"/> <!-- 指定ibatis的配置文件路径 -->
<property name="dataSource" ref="dataSource"/> <!-- 注入数据源 -->
</bean>
<!-- SqlMapClientTemplate 将被注入到需要与数据库进行交互的地方 -->
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<constructor-arg ref="sqlMapClient" />
</bean>
<!-- 定义事务管理器 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="delete*" rollback-for="Exception"
propagation="REQUIRED" isolation="READ_COMMITTED" />
<tx:method name="update*" rollback-for="Exception"
propagation="REQUIRED" isolation="READ_COMMITTED"/>
<tx:method name="remove*" rollback-for="Exception" isolation="READ_COMMITTED"/>
<tx:method name="count*" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 定义切点,由于该包下皆为接口类,因此对于符合条件的类,Spring将采取JDK动态代理的方式实现AOP功能 -->
<!-- 对于未实现接口的类需要使用CGLib 如果未引入依赖则会抛出异常 -->
<aop:pointcut id="daoMethod" expression="execution(public * com.mkyong.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethod"/>
</aop:config>
<!-- 开启包扫描 -->
<context:component-scan base-package="com.mkyong.service.impl;com.mkyong.dao"/>
</beans>
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!-- 指定SqlMap映射文件的路径 -->
<sqlMap resource="mapper/User.xml" />
</sqlMapConfig>
User.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 3.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="">
<sql id="userField">
SELECT ID,NAME
</sql>
<typeAlias alias="bean.User" type="com.mkyong.bean.User" />
<select id="getAllUsers" resultClass="bean.User">
select * from users
</select>
<select id="getListUsers" parameterClass="java.util.List" resultClass="java.util.HashMap">
select * from users
where id in
<iterate conjunction="," open="(" close=")">
#list[]#
</iterate>
</select>
<select id="getUserListById" parameterClass="bean.User" resultClass="bean.User">
<include refid="userField"/>
from users where id = #id#
</select>
<update id="updateUser" parameterClass="bean.User">
update users set `name` = #name# where id = #id#
</update>
<insert id="insertUser" parameterClass="bean.User">
insert users(id,name) values(#id#,#name#)
</insert>
</sqlMap>
页面 success.jsp
<html>
<body>
<h2>Success ! ${user.uhead}</h2>
</body>
</html>
upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--表单后面写入enctype 是说明表单不仅有文字还有二进制文件--%>
<form name="regForm" action="/upload" method="post" enctype="multipart/form-data" >
<table width="400" align="center" border="1" margin-top="50%">
<tr>
<td colspan="2" >用户注册</td>
</tr>
<tr>
<td>账号:</td>
<td><input name="uname" type="text"></td>
</tr>
<tr>
<td>密码:</td>
<td><input name="upass" type="password"></td>
</tr>
<tr>
<td>头像:</td>
<td><input name="uhead" type="file"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
<td><input type="reset"></td>
</tr>
</table>
</form>
</body>
</html>
index.jsp
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
控制层代码
PrintService
package com.mkyong.rest;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import com.mkyong.bean.User;
import com.mkyong.context.ServiceManager;
import com.mkyong.context.SpringApplicationContext;
import com.mkyong.dao.CustomerBo;
import com.mkyong.dao.UserDAO;
@Path("/customer")
public class PrintService {
CustomerBo customerBo;
private UserDAO userDAO;
@GET
@Path("/print")
public Response printMessage() {
//customerBo = (CustomerBo) SpringApplicationContext.getBean("customerBo");
customerBo = (CustomerBo)ServiceManager.getService("customerBoImpl");
String result = customerBo.getMsg();
return Response.status(200).entity(result).build();
}
@Path("/getEnv")
@GET
@Produces("text/html")
public Response forwardComplete(@Context HttpServletRequest request ) {
System.out.println("forwardComplete=========================================>");
userDAO = (UserDAO) SpringApplicationContext.getBean("userDAO");
User user = new User();
user.setId(18);
user.setName("SUCCESS");
userDAO.insertUser(user);
return sendRedirect();
}
private Response sendRedirect() {
Response.ResponseBuilder builder = Response.ok();
builder.status(302);
builder.header("location", "/upload.jsp");
return builder.build();
}
}
业务层代码
UserService
package com.mkyong.service;
import com.mkyong.bean.User;
public interface UserService {
public int updateUser(User user);
public int updateUser(User user, boolean triggerException);
}
UserServiceImpl
package com.mkyong.service.impl;
import com.mkyong.bean.User;
import com.mkyong.dao.UserDAO;
import com.mkyong.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDAO userDAO;
@Override
public int updateUser(User user) {
if (user == null) {
return 0;
}
return userDAO.updateUser(user);
}
@Override
public int updateUser(User user, boolean triggerException) {
if (user == null) {
return 0;
}
int result = userDAO.updateUser(user);
if (triggerException) {
throw new RuntimeException("eeeet?");
}
return result;
}
}
数据访问层
UserDAO
package com.mkyong.dao;
import com.mkyong.bean.User;
import java.util.List;
import java.util.Map;
public interface UserDAO {
public int updateUser(User user);
public List<User> queryUser(User user);
public List<Map> queryListUser(User user);
public Object insertUser(User user);
public boolean insertBatchUser(List<User> users);
}
UserDAOImpl
package com.mkyong.dao.impl;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.mkyong.bean.User;
import com.mkyong.dao.UserDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
import org.springframework.stereotype.Component;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@Component
public class UserDAOImpl implements UserDAO {
@Autowired
private SqlMapClientTemplate sqlMapClientTemplate;
@Override
public int updateUser(User user){
return sqlMapClientTemplate.update("updateUser",user);
}
@Override
public List<User> queryUser(User user) {
return sqlMapClientTemplate.queryForList("getUserListById",user);
}
@Override
public List<Map> queryListUser(User user) {
List<Integer> userIds = new ArrayList<>();
userIds.add(1);
//userIds.add(2);
return sqlMapClientTemplate.queryForList("getListUsers",userIds);
}
@Override
public Object insertUser(User user) {
return sqlMapClientTemplate.insert("insertUser",user);
}
@Override
public boolean insertBatchUser(List<User> users) {
boolean flag = false;
SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient();
try {
Iterator<User> iterator = users.iterator();
sqlMapClient.startTransaction();
while (iterator.hasNext()){
User user = iterator.next();
sqlMapClient.insert("insertUser",user);
}
flag = true;
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
try {
sqlMapClient.commitTransaction();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
sqlMapClient.endTransaction();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return flag;
}
}
实体对象
User
package com.mkyong.bean;
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "[id:" + id + ",name:" + name + "]";
}
}
spring上下文对象
ServiceManager
package com.mkyong.context;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
@Component
public final class ServiceManager {
static BeanFactory factory = null;
public static Object getService(String name) {
return factory.getBean(name);
}
static {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});
factory = context;
}
}
访问测试一下 localhost:8080/resteasy/customer/print