1. 程式人生 > >cxf框架整合ssm框架案例

cxf框架整合ssm框架案例

同學因為公司領導讓其演講cxf框架,由於其對ssm框架不熟悉,遂讓我幫其搭建一個基於cfx框架的ssm框架

專案搭建好後的圖形:


下面開始搭建框架之旅吧

1  pom.xml 裡的配置

<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>cxfDe</groupId>
	<artifactId>cxfDemo</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>cxfDemo Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<!-- 專案屬性 -->
	<properties>
		<commons-beanutils.version>1.9.1</commons-beanutils.version>
		<commons-httpclient.version>3.0.1</commons-httpclient.version>
		<!-- spring版本號 -->
		<spring.version>4.0.2.RELEASE</spring.version>
		<!-- mybatis版本號 -->
		<mybatis.version>3.2.6</mybatis.version>
		<!-- log4j日誌檔案管理包版本 -->
		<slf4j.version>1.7.7</slf4j.version>
		<log4j.version>1.2.17</log4j.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<!-- gson -->
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.8.0</version>
		</dependency>
		<!-- spring核心包 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.3.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>4.3.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>4.3.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.3.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.10</version>
		</dependency>
		<dependency>
			<groupId>aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>1.5.4</version>
		</dependency>
		<!-- -->
		<dependency>
			
			<groupId>javax.servlet</groupId>
			
			<artifactId>servlet-api</artifactId>
			
			<version>2.4</version>
			
			<scope>provided</scope>
			
		</dependency>
		<!-- -->
		<dependency>
			<groupId>org.codehaus.jackson</groupId>
			<artifactId>jackson-mapper-asl</artifactId>
			<version>1.9.13</version>
		</dependency>
		<!--mybatis核心包 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.2</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.1</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.39</version>
		</dependency>
		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.1.2</version>
			<type>jar</type>
		</dependency>
		<!--列印日誌 -->
		<!-- <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> 
			<version>1.7.24</version> </dependency> <dependency> <groupId>org.slf4j</groupId> 
			<artifactId>slf4j-log4j12</artifactId> <version>1.7.24</version> </dependency> 
			<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> 
			</dependency> -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>4.3.6.RELEASE</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<!-- cxf -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxws</artifactId>
			<version>3.1.10</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-databinding-aegis</artifactId>
			<version>3.1.10</version>
		</dependency>
		<!-- <dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>3.1.10</version>
		</dependency> -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http-jetty</artifactId>
			<version>3.1.10</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.8.7</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.8.7</version>
		</dependency>

	</dependencies>
	<build>
		<finalName>SmartHome</finalName>
		<plugins>
			<!-- 編譯的時候使用JDK8和UTF8編碼 , -->
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<!-- <version>3.0</version> -->
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<!-- 編譯jar包 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<configuration>
					<url>http://${basic.serverIp}:8080/smarthome</url>
					<server>Tomcat9</server>
					<port>8080</port>
					<path>/</path>
					<archive>
						<addMavenDescriptor>false</addMavenDescriptor>
						<manifest>
							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
							<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
						</manifest>
					</archive>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>  

2.applicationContext-dao.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"
	
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- 配置整合mybatis過程 -->
	<!-- 1.配置資料庫相關引數properties的屬性:${url} -->
	<context:property-placeholder location="classpath:jdbc.properties" />

	<!-- 2.資料庫連線池 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driver}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<!-- 初始化連線大小 -->
		<property name="initialSize" value="${initialSize}"></property>
		<!-- 連線池最大數量 -->
		<property name="maxActive" value="${maxActive}"></property>
		<!-- 連線池最大空閒 -->
		<property name="maxIdle" value="${maxIdle}"></property>
		<!-- 連線池最小空閒 -->
		<property name="minIdle" value="${minIdle}"></property>
		<!-- 獲取連線最大等待時間 -->
		<property name="maxWait" value="${maxWait}"></property>
	</bean>
	<!-- 3.配置mybatis的SqlSessionFactory物件 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 注入資料庫連線池 -->
		<property name="dataSource" ref="dataSource" />
		<!-- 配置MyBaties全域性配置檔案:sqlMapConfig.xml -->
		<property name="configLocation" value="classpath:sqlMapConfig.xml" />
		<!-- 掃描entity包 使用別名 -->
		<property name="typeAliasesPackage" value="com.pojo" />

	</bean>

	<!-- 4.配置掃描Dao介面包,動態實現Dao介面,注入到spring容器中 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 注入sqlSessionFactory -->
		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

		<!-- 給出需要掃描Dao介面包 -->
		<property name="basePackage" value="com.dao" />
	</bean>
	
</beans>

3.applicationContext-transaction.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:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-4.3.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-4.0.xsd 
	http://www.springframework.org/schema/tx
	
	http://www.springframework.org/schema/tx/spring-tx.xsd">
	<!-- 配置事務管理器 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- 注入資料庫連線池 -->
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- 配置基於註解的宣告式事務 -->
<!-- <tx:annotation-driven transaction-manager="transactionManager" > -->
	<!-- =======================新增事物管理(不是基於註解的宣告式事務)====================== -->
	
	
	<!-- 配置事務通知屬性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<!-- 定義事務傳播屬性 -->
		<tx:attributes>
			<tx:method name="insert*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="edit*" propagation="REQUIRED" />
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="new*" propagation="REQUIRED" />
			<tx:method name="set*" propagation="REQUIRED" />
			<tx:method name="remove*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
			<tx:method name="change*" propagation="REQUIRED" />
			<tx:method name="check*" propagation="REQUIRED" />
			<tx:method name="get*" propagation="REQUIRED" read-only="true" />
			<tx:method name="find*" propagation="REQUIRED"  />
			<tx:method name="load*" propagation="REQUIRED" read-only="true" />
			<tx:method name="*" propagation="REQUIRED" read-only="true" />
		</tx:attributes>
	</tx:advice>
	<!-- 配置事務切面 -->
	<aop:config>
		<aop:pointcut id="serviceOperation"
			expression="execution(* com.service.*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
	</aop:config>

	<!-- =======================上面是新加事物管理====================== -->
</beans>

3.spring-springMVC.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" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  
            http://www.springframework.org/schema/beans/spring-beans-4.3.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"
	default-lazy-init="true">
	<!-- 通過mvc:resources設定靜態資源,這樣servlet就會處理這些靜態資源,而不通過控制器 -->
	<!-- 設定不過濾內容,比如:css,jquery,img 等資原始檔 -->
	<mvc:resources location="/*.html" mapping="/**.html" />
	<mvc:resources location="/css/*" mapping="/css/**" />
	<mvc:resources location="/js/*" mapping="/js/**" />
	<mvc:resources location="/images/*" mapping="/images/**" />
	<!-- 添加註解驅動 -->
	<mvc:annotation-driven />
	<!-- 預設掃描的包路徑 -->
	<context:component-scan base-package="com" />
	<!-- mvc:view-controller可以在不需要Controller處理request的情況,轉向到設定的View -->
	<!-- 像下面這樣設定,如果請求為/,則不通過controller,而直接解析為/index.jsp -->
	<mvc:view-controller path="/" view-name="index" />
	<!--=======================新新增的支援shiro對Controller的方法級aop安全控制  -->
	<bean
		class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
		depends-on="lifecycleBeanPostProcessor">
		<property name="proxyTargetClass" value="true" />
	</bean>
	<bean
		class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
		<property name="securityManager" ref="securityManager" />
	</bean>
	<!-- ========================================== -->
	

		<!-- 檢視解析器 -->
	<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView"></property>
		<!-- 配置jsp路徑字首 -->
		<property name="prefix" value="/jsp/"></property>
		<!-- 配置URl字尾 -->
		<property name="suffix" value=".jsp"></property>
	</bean>
</beans> 

4.sqlMapCOnfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 別名 -->
	<typeAliases>
		
	</typeAliases>
	<mappers>
	
	</mappers>
</configuration>

需要注意的是: 這個架包 必須追加buildPath,而不能在maven倉庫裡放,不然依然報錯


5:在WEB-INF裡寫cxf-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>  
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor   
    license agreements. See the NOTICE file distributed with this work for additional   
    information regarding copyright ownership. The ASF licenses this file to   
    you under the Apache License, Version 2.0 (the "License"); you may not use   
    this file except in compliance with the License. You may obtain a copy of   
    the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required   
    by applicable law or agreed to in writing, software distributed under the   
    License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS   
    OF ANY KIND, either express or implied. See the License for the specific   
    language governing permissions and limitations under the License. -->  
<!-- START SNIPPET: beans -->  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"  
    xsi:schemaLocation=" http://www.springframework.org/schema/beans    
    http://www.springframework.org/schema/beans/spring-beans.xsd    
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">  
    <import resource="classpath:META-INF/cxf/cxf.xml" />  
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  
    <!-- 定義的對外呼叫介面 -->  
    <!-- implementorClass就是配置這個service的interface,然後implementor就是去引用Spring容器中的feedBackMapperService這個bean -->  
    <jaxws:endpoint id="feback" implementor="com.service.impl.HelloWorldImpl"  
        implementorClass="com.service.IHelloWorld"  
        address="com.service.impl.HelloWorldImpl" />  
  
</beans>  


6:寫web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<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>
	<!-- Spring 重新整理 Introspector防止記憶體洩露 -->
	<listener>
		<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
	</listener>
	<!-- ==================== -->
	
	<servlet>
		<servlet-name>Spring-SpringMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath*:Spring-SpringMVC.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Spring-SpringMVC</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

	<!-- 字元編碼格式 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	
	<!-- cxf -->
	 <servlet>  
        <description>Apache CXF Endpoint</description>  
        <display-name>cxf</display-name>  
        <servlet-name>cxf</servlet-name>  
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>cxf</servlet-name>  
        <url-pattern>/webservice/*</url-pattern>  
    </servlet-mapping> 



	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

好了  這些寫完就配置好了,  下面就可以 在 service層 和實現層配置了

實體類是這樣的

package com.po;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "student")
public class Student {
	private String sno;
	private String sname;
	private int sage;
	private String ssex;
	
	
	public Student() {
		super();
	}
	
	
	public Student(String sno, String sname, int sage, String ssex) {
		super();
		this.sno = sno;
		this.sname = sname;
		this.sage = sage;
		this.ssex = ssex;
	}


	public String getSno() {
		return sno;
	}
	public void setSno(String sno) {
		this.sno = sno;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public int getSage() {
		return sage;
	}
	public void setSage(int sage) {
		this.sage = sage;
	}
	public String getSsex() {
		return ssex;
	}
	public void setSsex(String ssex) {
		this.ssex = ssex;
	}
	
	
}

service層是這樣的

package com.service;

import javax.jws.WebParam;
import javax.jws.WebService;

import com.po.Student;

@WebService
public interface IHelloWorld {

	public String sayHi(@WebParam(name="params")String params); 
	public String sayHiToUser(Student student);
}


serviceImpl是這樣的

package com.service.impl;

import javax.jws.WebService;

import com.po.Student;
import com.service.IHelloWorld;

@WebService(endpointInterface="com.service.IHelloWorld",serviceName="HelloWorld",targetNamespace="http://localhost:8080/wokan.com")
public class HelloWorldImpl implements IHelloWorld {

	@Override
	public String sayHi(String params) {
		
		return "hello , "+params; 
	}

	@Override
	public String sayHiToUser(Student student) {
		
		return "hello , name="+student.getSname();
	}

}


配置好後  就可以開啟Tomcat執行一下了。。