SpringMVC + WebSocket + X

本文探讨了如何在Spring框架中利用WebSocket实现客户端与服务器之间的实时通信,包括配置WebSocket消息架构、实现服务器定时发送信息到客户端、以及客户端接收并响应服务器信息的方法。详细介绍了WebSocket在Spring4中的整合与应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

官方文档:[color=red]WebSocket Support[/color]
[url]http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html[/url]
[color=red]WebSocket结合hibernate+spring+json 实际经验 [/color][url]http://www.cnblogs.com/lucious/archive/2013/06/05/3118394.html[/url]
Spring Framework 4.0 M2 中的 WebSocket 消息架构 [url]http://www.oschina.net/translate/spring-framework-4-0-m2-websocket-messaging-architectures[/url]
Spring 4.0 中的WebSocket 架构 [url]http://developer.51cto.com/art/201311/418069.htm[/url]
spring4 + WebSocket笔记 [url]http://blog.youkuaiyun.com/sl543001/article/details/19343005[/url]
基于Tomcat7、Java、WebSocket的服务器推送聊天室 [url]http://blog.youkuaiyun.com/leecho571/article/details/9707497[/url]

Using websockets in Java using Spring 4 [url]http://syntx.io/using-websockets-in-java-using-spring-4/[/url]
[color=red]STOCK TICKER DEMO WEBAPP USING SPRING 4 WEBSOCKET[/color] [url]http://gerrydevstory.com/2014/03/04/stock-ticker-demo-webapp-using-spring-4-websocket/[/url]
[color=red]Using Spring 4 WebSocket, sockJS and Stomp support to implement two way server client communication[/color]
[url]http://raymondhlee.wordpress.com/2014/01/19/using-spring-4-websocket-sockjs-and-stomp-support-to-implement-two-way-server-client-communication/[/url]
[color=red]Set up a full broker for Spring 4 STOMP over WebSocket messaging using ActiveMQ[/color] [url]http://raymondhlee.wordpress.com/2014/04/12/set-up-a-full-broker-for-spring-4-stomp-over-websocket-messaging-using-activemq/[/url]

spring-websocket-portfolio源码 [url]https://github.com/rstoyanchev/spring-websocket-portfolio[/url]

WebSocket的JavaScript例子 [url]http://www.xyhtml5.com/websocket-javascript-example.html[/url]


默认配置:
<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/hello">
<websocket:sockjs/>
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="/topic,/queue"/>
</websocket:message-broker>

自定义配置:
<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/hello">
<websocket:sockjs/>
</websocket:stomp-endpoint>
<websocket:stomp-broker-relay prefix="/topic,/queue"
relay-host="localhost" relay-port="61613"
heartbeat-send-interval="20000" heartbeat-receive-interval="20000"/>
</websocket:message-broker>

The "STOMP broker relay" in the above configuration is a Spring MessageHandler that handles messages by forwarding them to an external message broker. To do so it establishes TCP connections to the broker, forwards all messages to it, and reversely forwards all messages received from the broker to clients through their WebSocket sessions. Essentially it acts as a "relay" forwarding messages in both directions.


[size=x-large][color=red]一个例子的源码[/color][/size]
附件是两个用到的两个js
web.xml
========================================
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<display-name>Archetype Created Web Application</display-name>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext*.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

</web-app>



log4j.xml
===================================
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>

<!-- Application Loggers -->
<logger name="com">
<level value="info" />
</logger>

<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</logger>

<logger name="org.springframework.beans">
<level value="info" />
</logger>

<logger name="org.springframework.context">
<level value="info" />
</logger>

<logger name="org.springframework.web">
<level value="info" />
</logger>

<!-- Root Logger -->
<root>
<priority value="warn" />
<appender-ref ref="console" />
</root>

</log4j:configuration>



log4j.properties
===========================================
[color=darkblue]log4j.rootCategory=DEBUG, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

log4j.appender.stdout.Threshold=trace
log4j.category.org.hibernate.SQL=trace
log4j.category.org.hibernate.type=trace

# log4jdbc
log4j.logger.jdbc.sqlonly=INFO
log4j.logger.jdbc.sqltiming=INFO
log4j.logger.jdbc.audit=OFF
log4j.logger.jdbc.resultset=OFF
log4j.logger.jdbc.connection=OFF[/color]


jdbc.properties
==========================================
[color=darkblue]#mysql
#jdbc.dataSource=org.logicalcobwebs.proxool.ProxoolDataSource
#jdbc.driver=com.mysql.jdbc.Driver
#jdbc.url=jdbc:mysql://localhost:3306/jbpmtest?useUnicode=true&characterEncoding=utf8
#log4jdbc
jdbc.dataSource=org.springframework.jdbc.datasource.DriverManagerDataSource
jdbc.driver=net.sf.log4jdbc.DriverSpy
jdbc.url=jdbc:log4jdbc:mysql://localhost:3306/jbpmtest?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root
sqlserver 2008
#jdbc.dataSource=com.alibaba.druid.pool.DruidDataSource
#jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
#jdbc.url=jdbc:sqlserver://localhost:1433;DatabaseName=jbpmtest
#jdbc.username=sa
#jdbc.password=sa

proxool.alias=ds
proxool.prototypeCount=2
proxool.minimumConnectionCount=5
proxool.maximumConnectionCount=20
proxool.houseKeepingTestSql=select 1[/color]


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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<mvc:annotation-driven />
<context:component-scan base-package="com">
<context:exclude-filter expression="org.springframework.stereotype.Controller"
type="annotation" />
</context:component-scan>

<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="${jdbc.dataSource}">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>



applicationContext-spring.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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:jbpm="http://drools.org/schema/drools-spring"
xmlns:kie="http://drools.org/schema/kie-spring"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://drools.org/schema/drools-spring
http://drools.org/schema/drools-spring-1.3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://drools.org/schema/kie-spring
http://drools.org/schema/kie-spring-2.0.0.xsd">

<!-- 使用Spring + Hibernate对非JBPM代码的事务管理 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:packagesToScan="com.pandy.model">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.format_sql">false</prop>
<!--<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="hibernate.cache.use_structured_entries">true</prop>
<prop key="hibernate.generate_statistics">true</prop>-->
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

</beans>



springmvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:websocket="http://www.springframework.org/schema/websocket"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="com">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
<mvc:annotation-driven/>

<mvc:resources mapping="/js/**" location="/js/"/>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>

<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/ws">
<websocket:sockjs/>
</websocket:stomp-endpoint>
<websocket:simple-broker prefix="/topic"/>
</websocket:message-broker>

</beans>



三个domain
==============================================
package com.pandy.domain;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Stock implements Serializable {

private static final long serialVersionUID = 1L;
private String code = "";
private double price = 0.0;
private Date time = new Date();
//..................

}



package com.pandy.domain;
public class Greeting {
private String content;
public Greeting(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}



package com.pandy.domain;
public class HelloMessage {
private String name;
public String getName() {
return name;
}
}



两个服务器处理信息的controller
==========================================
package com.pandy.controller;

import com.pandy.domain.Stock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

/**
* 服务器定时发送信息到客户端的例子
*/
@Controller
public class HomeController {

@Autowired
private SimpMessagingTemplate template;
private TaskScheduler scheduler = new ConcurrentTaskScheduler();
private List<Stock> stockPrices = new ArrayList<Stock>();
private Random rand = new Random(System.currentTimeMillis());

/**
* 处理信息并发送给客户端
*/
private void updatePriceAndBroadcast() {
for (Stock stock : stockPrices) {
double chgPct = rand.nextDouble() * 5.0;
if (rand.nextInt(2) == 1) chgPct = -chgPct;
stock.setPrice(stock.getPrice() + (chgPct / 100.0 * stock.getPrice()));
stock.setTime(new Date());
}
template.convertAndSend("/topic/price", stockPrices);
}

/**
* controller初始化的时候,就初始化一个定时任务
*/
@PostConstruct
private void broadcastTimePeriodically() {
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("自动任务执行====================================" + new Date());
updatePriceAndBroadcast();
}
}, 1000);
}

/**
* 增加信息
*/
@MessageMapping("/addStock")
public void addStock(Stock stock) throws Exception {
stockPrices.add(stock);
updatePriceAndBroadcast();
}

/**
* 移除所有
*/
@MessageMapping("/removeAllStocks")
public void removeAllStocks() {
stockPrices.clear();
updatePriceAndBroadcast();
}

@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
return "home";
}


}



package com.pandy.controller;

import com.pandy.domain.Greeting;
import com.pandy.domain.HelloMessage;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

import java.util.Date;
/**
* 由客户端触发,并接受服务器发送信息的例子
*/
@Controller
public class MessageController {
@MessageMapping("/greeting")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
System.out.println("MessageController====================================>客户端连接");
return new Greeting("["+(new Date())+"] 服务器返回: Hello,客户端输入信息< " + message.getName() + ">");
}
}



两个测试客户端
index.jsp
================================================
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Spring + WebSocket 例子</title>
<script src="/SpringWebSocket/js/sockjs-0.3.min.js"></script>
<script src="/SpringWebSocket/js/stomp.js"></script>
<script src="/SpringWebSocket/js/jquery-1.10.2.js"></script>
<script src="/SpringWebSocket/js/jquery-ui-1.10.4.custom.js"></script>
<script src="/SpringWebSocket/js/jquery.json.js"></script>
<style>
table{
border: 1px solid #000000;
}
table th{
border: 1px solid #000000;
background-color: #889966;
}
table td{
border: 1px solid #000000;
background-color: #00ff00;
}
</style>
<script>
//创建sockJS协议
var socket = new SockJS("/SpringWebSocket/ws");
var stompClient = Stomp.over(socket);

//连接服务器
stompClient.connect("guest", "guest", function () {
//成功连接后,设定接受服务器的地址和处理方法
stompClient.subscribe('/topic/price', function (frame) {
//服务器返回请求处理
var prices = JSON.parse(frame.body);
$('#price').empty();
for (var i in prices) {
var price = prices[i];
$('#price').append(
$('<tr>').append(
$('<td>').html(price.code),
$('<td>').html(price.price.toFixed(2)),
$('<td>').html(price.timeStr)
)
);
}
});
}, function (error) {
//连接出现错误回调函数
alert(error.headers.message);
});

// Register handler for add button
$(document).ready(function () {
$('.add').click(function (e) {
e.preventDefault();
var code = $('.new .code').val();
var price = Number($('.new .price').val());
var jsonstr = JSON.stringify({ 'code': code, 'price': price });
//发送信息给服务器
stompClient.send("/app/addStock", {}, jsonstr);
return false;
});
$('.remove-all').click(function (e) {
e.preventDefault();
//发送信息给服务器
stompClient.send("/app/removeAllStocks");
return false;
});
});
</script>
</head>
<body>
<h1>Spring + WebSocket 例子</h1>

<p class="new">
编码: <input type="text" class="code"/>
价格: <input type="text" class="price"/>
<button class="add">增加</button>
<button class="remove-all">移除所有</button>
</p>
<table style="width: 1000px;">
<thead>
<tr>
<th style="width: 30%">编码</th>
<th style="width: 30%">价格</th>
<th style="width: 40%">时间</th>
</tr>
</thead>
<tbody id="price">

</tbody>
</table>
测试方式:
提交信息到服务器,服务器会定时发送数据到页面,不管多少个浏览器打开都能接收服务器发送来的信息。
</body>
</html>



hello.jsp
=================================================
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Spring + WebSocket Hello world例子</title>
<script src="/SpringWebSocket/js/sockjs-0.3.min.js"></script>
<script src="/SpringWebSocket/js/stomp.js"></script>
<script src="/SpringWebSocket/js/jquery-1.10.2.js"></script>
<script src="/SpringWebSocket/js/jquery-ui-1.10.4.custom.js"></script>
<script src="/SpringWebSocket/js/jquery.json.js"></script>
<script>
//创建sockJS协议
var socket = new SockJS("/SpringWebSocket/ws");
var stompClient = Stomp.over(socket);
//连接服务器
stompClient.connect("guest", "guest", function () {
$("#recFromServer").append("<br>" + "成功连接服务器.!");
//成功连接后,设定接受服务器的地址和处理方法
stompClient.subscribe('/topic/greetings', function (greeting) {
var content = JSON.parse(greeting.body).content;
$("#recFromServer").append("<br>" + content);
});
}, function (error) {
//连接出现错误回调函数
alert(error.headers.message);
});


function sendMessage() {
//发送信息给服务器
stompClient.send("/app/greeting", {}, JSON.stringify({ 'name': $("#message").val() }));
}
</script>
</head>
<body>
输入名称:
<input id="message" type="text">
<input type="button" onclick="sendMessage()" value="发送到服务器">
<div id="recFromServer"></div>
测试方式:
用两个浏览器打开这个页面,然后一个页面提交信息,它能接收到服务器的数据,同时另一个页面也能接收到服务器发送的数据。
</body>
</html>



附加:pom.xml
===================================
<?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>SpringWebSocket</groupId>
<artifactId>SpringWebSocket</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<cglib.version>2.2.2</cglib.version>
<mysql.version>5.1.30</mysql.version>
<slf4j.version>1.6.1</slf4j.version>
<log4j.version>1.2.16</log4j.version>

<spring.version>4.0.5.RELEASE</spring.version>
<spring.asm.version>3.1.4.RELEASE</spring.asm.version>
<aspectj.version>1.6.2</aspectj.version>

<hibernate.version>4.3.5.Final</hibernate.version>
<hibernateCommAnn.version>3.2.0.Final</hibernateCommAnn.version>
<hibernateAnn.version>3.5.6-Final</hibernateAnn.version>

<jdbc.groupId>com.alibaba</jdbc.groupId>
<jdbc.artifactId>druid</jdbc.artifactId>
<jdbc.version>1.0.4</jdbc.version>
<commons.lang.version>2.6</commons.lang.version>
<commons.lang3.version>3.1</commons.lang3.version>
<tomcat.ws.version>7.0.53</tomcat.ws.version>
</properties>

<dependencies>
<!-- Spring 3 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-asm</artifactId>
<version>${spring.asm.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</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>
<!--<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<optional>true</optional>
<scope>test</scope>
</dependency>-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<!-- <dependency> <groupId>org.apache.openjpa</groupId> <artifactId>openjpa-persistence</artifactId>
<version>2.2.2</version> </dependency> -->
<!-- Hibernate -->
<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>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>${hibernateCommAnn.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>${hibernateAnn.version}</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>${cglib.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.1.Final</version>
</dependency>
<!-- JBOSS Cache & Hibernate -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>4.2.1.Final</version>
</dependency>
<!--<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.4</version>
</dependency>-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-testing</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.4.3</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!--<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>-->

<!-- WebSocket for tomcat -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-coyote</artifactId>
<version>${tomcat.ws.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>${tomcat.ws.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-annotations-api</artifactId>
<version>${tomcat.ws.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>${spring.version}</version>
</dependency>


<!-- Log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.lazyluke</groupId>
<artifactId>log4jdbc-remix</artifactId>
<version>0.2.7</version>
</dependency>


<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>15.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>sqljdbc</groupId>
<artifactId>sqljdbc</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>${jdbc.groupId}</groupId>
<artifactId>${jdbc.artifactId}</artifactId>
<version>${jdbc.version}</version>
</dependency>

<!-- JSON -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.2</version>
</dependency>
<!--<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.7.1</version>
</dependency>-->

<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>${commons.lang.version}</version>
</dependency>
<!--<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons.lang3.version}</version>
</dependency>-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons.lang3.version}</version>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<url>http://localhost:8080/manager/text</url>
<username>admin</username>
<password>admin</password>
<path>/SpringWebSocket</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值