引用的Jar包
Struts2.3.14
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-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\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-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;
}
}
打開瀏覽器進行測試:
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對象: