Spring系列文章之 resteasy与spring集成

 实例代码目录结构

 

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值