Spring3.2.2+Struts2.3.14+Hiberante4.2.1+CXF2.6.7構建WebService

引用的Jar包

Struts2.3.14

aopalliance-1.0.jar
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
classworlds-1.1.jar
commons-beanutils-1.8.0.jar
commons-chain-1.2.jar
commons-collections-3.1.jar
commons-digester-2.0.jar
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang-2.4.jar
commons-lang3-3.1.jar
commons-logging-api-1.1.jar
commons-logging-1.1.1.jar
commons-validator-1.3.1.jar
dwr-1.1.1.jar
ezmorph-1.0.6.jar
freemarker-2.3.19.jar
jackson-core-asl-1.9.2.jar
jackson-mapper-asl-1.9.2.jar
javassist-3.11.0.GA.jar
json-lib-2.3-jdk15.jar
juli-6.0.18.jar
ognl-3.0.6.jar
oro-2.0.8.jar
oval-1.31.jar
plexus-container-default-1.0-alpha-10.jar
plexus-utils-1.2.jar
sitemesh-2.4.2.jar
struts2-config-browser-plugin-2.3.14.jar
struts2-convention-plugin-2.3.14.jar
struts2-core-2.3.14.jar
struts2-dojo-plugin-2.3.14.jar
struts2-dwr-plugin-2.3.14.jar
struts2-json-plugin-2.3.14.jar
struts2-spring-plugin-2.3.14.jar
struts-core-1.3.10.jar
testng-5.1-jdk15.jar
tiles-api-2.0.6.jar
tiles-core-2.0.6.jar
tiles-jsp-2.0.6.jar
velocity-1.6.4.jar
xmlpull-1.1.3.1.jar
xpp3_min-1.1.4c.jar
xstream-1.4.2.jar
xwork-core-2.3.14.jar

Spring3.2.2

spring-aop-3.2.2.RELEASE.jar
spring-aspects-3.2.2.RELEASE.jar
spring-beans-3.2.2.RELEASE.jar
spring-context-3.2.2.RELEASE.jar
spring-context-support-3.2.2.RELEASE.jar
spring-core-3.2.2.RELEASE.jar
spring-expression-3.2.2.RELEASE.jar
spring-instrument-3.2.2.RELEASE.jar
spring-jdbc-3.2.2.RELEASE.jar
spring-jms-3.2.2.RELEASE.jar
spring-orm-3.2.2.RELEASE.jar
spring-oxm-3.2.2.RELEASE.jar
spring-struts-3.2.2.RELEASE.jar
spring-test-3.2.2.RELEASE.jar
spring-tx-3.2.2.RELEASE.jar
spring-web-3.2.2.RELEASE.jar
spring-webmvc-3.2.2.RELEASE.jar
spring-webmvc-portlet-3.2.2.RELEASE.jar
aspectjweaver.jar

Hibernate4.2.1

optional\ehcache\ehcache-core-2.4.3.jar
optional\ehcache\hibernate-ehcache-4.2.1.Final.jar
optional\c3p0\c3p0-0.9.1.jar
optional\c3p0\hibernate-c3p0-4.2.1.Final.jar
required\antlr-2.7.7.jar
required\dom4j-1.6.1.jar
required\hibernate-commons-annotations-4.0.1.Final.jar
required\hibernate-core-4.2.1.Final.jar
required\hibernate-jpa-2.0-api-1.0.1.Final.jar
required\javassist-3.15.0-GA.jar
required\jboss-logging-3.1.0.GA.jar
required\jboss-transaction-api_1.1_spec-1.0.1.Final.jar
optional\infinispan\woodstox-core-asl-4.2.0.jar

CXF2.6.7

cxf-2.6.7.jar
cxf-manifest.jar
cxf-services-sts-core-2.6.7.jar
cxf-services-wsn-api-2.6.7.jar
cxf-services-wsn-core-2.6.7.jar
cxf-xjc-boolean-2.6.1.jar
cxf-xjc-bug671-2.6.1.jar
cxf-xjc-dv-2.6.1.jar
cxf-xjc-runtime-2.6.1.jar
cxf-xjc-ts-2.6.1.jar
neethi-3.0.2.jar
wsdl4j-1.6.3.jar
wss4j-1.6.10.jar
xmlschema-core-2.0.3.jar
stax2-api-3.1.1.jar
slf4j-api-1.7.5.jar
slf4j-jdk14-1.7.5.jar
jettison-1.3.3.jar
jsr311-api-1.1.1.jar
js-1.7R2.jar
jaxb-api-2.2.5.jar
jaxb-impl-2.2.5.1.jar
jaxb-xjc-2.2.5.1.jar


部份Web.xml:

<!-- 配置struts2 -->
	<filter>
		<filter-name>struts2</filter-name>
		<!-- 默認的struts2的過慮器類 
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
		-->
		<!-- 自定義struts2過慮器類 用於解決struts2把cxf的請求當action處理的問題 -->
		<filter-class>com.ccland.filter.ExtendStruts2Filter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- webservice -->
	<servlet>
		<servlet-name>CXFService</servlet-name>
		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>CXFService</servlet-name>
		<url-pattern>/CXFService/*</url-pattern>
	</servlet-mapping>

ApplicationContext-WebService.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://cxf.apache.org/jaxrs
    http://cxf.apache.org/schemas/jaxrs.xsd">

	<!-- Import Apache CXF Bean Definition -->
	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<!-- 將WebService Bean的創建託管給Spring -->
	<bean id="helloBean" class="com.ccland.service.impl.HelloWorldImpl" />
	<bean id="storageBean" class="com.ccland.service.impl.StorageServiceImpl">
		<property name="fileStorageDao">
			<ref bean="fileStorageDao" />
		</property>
	</bean>

	<!-- 要發佈成webservice的bean -->
	<jaxrs:server id="restFulContainer" address="/">
		<jaxrs:serviceBeans>
			<ref bean="helloBean" />
			<ref bean="storageBean" />
		</jaxrs:serviceBeans>
	</jaxrs:server>
</beans>


自定義過慮器ExtendStruts2Filter,爲解決Struts把Webservice請求當普通Action被處理掉的問題。

package com.ccland.filter;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// 自定義擴展Struts2過濾器,用於解決struts會攔截cxf webservice請求的問題
public class ExtendStruts2Filter extends StrutsPrepareAndExecuteFilter {

	private static Logger log = LoggerFactory
			.getLogger(ExtendStruts2Filter.class);

	@Override
	public void doFilter(ServletRequest req, ServletResponse res,
			FilterChain chain) throws IOException, ServletException {

		try {
			HttpServletRequest request = (HttpServletRequest) req;
			// 判斷是否是向WebService發出的請求
			if (request.getRequestURI().contains("/CXFService")) {
				// 如果是來自向CXFService發出的請求
				chain.doFilter(req, res);
			} else {
				// 默認action請求
				super.doFilter(req, res, chain);
			}
		} catch (Exception e) {
			log.error(e.getMessage());
			e.printStackTrace();
		}
	}

}


Service層

package com.ccland.service;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import com.ccland.model.FileStorage;
import com.ccland.model.FileStorages;

@Path(value = "/storager")
public interface StorageService {

	@GET
	@Path(value = "/findById")
	@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
	public FileStorage findById(@QueryParam("id") String id)
			throws RuntimeException;

	@GET
	@Path(value = "/listAll")
	@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
	public FileStorages listAll() throws RuntimeException;
}

package com.ccland.service.impl;

import java.util.List;

import com.ccland.dao.FileStorageDao;
import com.ccland.model.FileStorage;
import com.ccland.model.FileStorages;
import com.ccland.service.StorageService;

public class StorageServiceImpl implements StorageService {

	private FileStorageDao fileStorageDao;

	public void setFileStorageDao(FileStorageDao fileStorageDao) {
		this.fileStorageDao = fileStorageDao;
	}

	@Override
	public FileStorage findById(String id) throws RuntimeException {
		try {
			return this.fileStorageDao.findById(id);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e.getMessage());
		}
	}

	@Override
	public FileStorages listAll() throws RuntimeException {
		FileStorages storager = new FileStorages();

		try {
			List<FileStorage> list = this.fileStorageDao.listFile();
			storager.setList(list);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e.getMessage());
		}
		return storager;
	}

}

Dao層

package com.ccland.dao;

import java.util.List;

import com.ccland.model.FileStorage;

public interface FileStorageDao {

	public long save(FileStorage entity) throws Exception;

	public void delete(String fileUrl) throws Exception;

	public FileStorage findById(String fileUrl) throws Exception;

	public List listFile() throws Exception;

}

package com.ccland.dao.impl;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.SessionFactory;

import com.ccland.dao.FileStorageDao;
import com.ccland.model.FileStorage;

public class FileStorageDaoImpl implements FileStorageDao {
	// Hibernate4不再支持 HibernateTemplate類了 所以this.getHibernateTemplate()不能再用

	private SessionFactory sessionFactory;

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Override
	public long save(FileStorage entity) throws Exception {
		this.sessionFactory.getCurrentSession().save(entity);
		return entity.getId();
	}

	@Override
	public void delete(String fileUrl) throws Exception {

		this.sessionFactory.getCurrentSession().delete(this.findById(fileUrl));
	}

	@Override
	public FileStorage findById(String fileUrl) throws Exception {

		FileStorage entity = null;

		String hql = "from FileStorage where fileUrl=?";

		Query query = this.sessionFactory.getCurrentSession().createQuery(hql);
		query.setString(0, fileUrl);
		List<FileStorage> list = query.list();
		for (FileStorage item : list) {
			entity = item;
		}
		return entity;
		// return this.getHibernateTemplate().get(FileStorage.class, fileUrl);
	}

	@Override
	public List listFile() throws Exception {
		// HQL 語句中的字段和表名,必須使用配置文件中定義的名字
		StringBuffer hql = new StringBuffer();
		hql.append("from FileStorage order by id");
		Query query = this.sessionFactory.getCurrentSession().createQuery(
				hql.toString());
		return query.list();
	}

}

Model層

package com.ccland.model;

import javax.xml.bind.annotation.XmlRootElement;

/**
 * FileStorage entity. @author MyEclipse Persistence Tools
 */

@XmlRootElement(name = "FileStorage")
public class FileStorage implements java.io.Serializable {

	// Fields

	/**
	 * 
	 */
	private static final long serialVersionUID = 2256369202006332596L;
	private Long id;
	private String fileName;
	private String fileUrl;
	private Long taskId;

	// Constructors

	/** default constructor */
	public FileStorage() {
	}

	/** minimal constructor */
	public FileStorage(String fileName, String fileUrl) {
		this.fileName = fileName;
		this.fileUrl = fileUrl;
	}

	/** full constructor */
	public FileStorage(String fileName, String fileUrl, Long taskId) {
		this.fileName = fileName;
		this.fileUrl = fileUrl;
		this.taskId = taskId;
	}

	// Property accessors

	public Long getId() {
		return this.id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getFileName() {
		return this.fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public String getFileUrl() {
		return this.fileUrl;
	}

	public void setFileUrl(String fileUrl) {
		this.fileUrl = fileUrl;
	}

	public Long getTaskId() {
		return this.taskId;
	}

	public void setTaskId(Long taskId) {
		this.taskId = taskId;
	}

}

爲支持傳遞複合類型對象

package com.ccland.model;

import java.util.HashMap;
import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "FileStorages")
public class FileStorages {

	private FileStorage fileStorage;
	private List<FileStorage> list;
	private FileStorage[] fileArr;
	private HashMap<String, FileStorage> maps;

	public FileStorage getFileStorage() {
		return fileStorage;
	}

	public void setFileStorage(FileStorage fileStorage) {
		this.fileStorage = fileStorage;
	}

	public List<FileStorage> getList() {
		return list;
	}

	public void setList(List<FileStorage> list) {
		this.list = list;
	}

	public HashMap<String, FileStorage> getMaps() {
		return maps;
	}

	public void setMaps(HashMap<String, FileStorage> maps) {
		this.maps = maps;
	}

	public FileStorage[] getFileArr() {
		return fileArr;
	}

	public void setFileArr(FileStorage[] fileArr) {
		this.fileArr = fileArr;
	}

}

package com.ccland.model;

import java.util.Map;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class MapBean {
	private Map<String, FileStorage> map;

	public Map<String, FileStorage> getMap() {
		return map;
	}

	public void setMap(Map<String, FileStorage> map) {
		this.map = map;
	}
}



打開瀏覽器進行測試:

http://localhost:8080/WebServiceDemo/CXFService/storager/listAll/

運行結果正確:



JS調用測試:

function listAll() {
		$.ajax({
			type : 'get',
			url : '<%=basePath%>CXFService/storager/listAll',
			dataType : 'json',
			data : {},
			success : function(res, status, xhr) {
				alert(res.FileStorages.list[0].fileName);			
			}
		});
	}

返回Json對象:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章