简述:
基于Spring MVC, 使用Http Service Invoke远程调用方法
(参考: http://blog.csdn.net/hanqunfeng/article/details/4303127)
步骤:
1. 本地定义接口,并在配置文件中说明
PersonService.java
package com.anialy.httpservice.service; import com.anialy.httpservice.entity.Person; public interface PersonService { public Person getPersonByName(String name); }
PersonService.java
package com.anialy.httpservice.service.impl; import com.anialy.httpservice.entity.Person; import com.anialy.httpservice.service.PersonService; public class PersonServiceImpl implements PersonService{ public Person getPersonByName(String name) { if("anialy".equals(name)) return new Person("anialy", 100); return null; } }
<?xml version="1.0" encoding="UTF-8"?> <!-- 指定Spring配置文件的Schema信息 --> <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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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"> <bean id="httpService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"> <property name="service"> <ref bean="personService" /> </property> <property name="serviceInterface" value="com.anialy.httpservice.service.PersonService"> </property> </bean> <bean id="personService" class="com.anialy.httpservice.service.impl.PersonServiceImpl"/> </beans>
2. mvc配置服务uri与对应的service
applicationContext-mvc.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/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <mvc:view-controller path="/" view-name="redirect:/home" /> <mvc:view-controller path="/home" view-name="home" /> <!-- Spring Service Invoke --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/service/httpService">httpService</prop> </props> </property> </bean> <!-- Spring MVC --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <value> /test=testController </value> </property> <property name="order" value="1" /> </bean> <bean id="testController" class="com.anialy.webproj.controller.TestController"> <property name="methodNameResolver" ref="paramResolver" /> </bean> <!-- 定义JSP --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="paramResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> <property name="paramName" value="action" /> <property name="defaultMethodName" value="test" /> </bean> </beans>
3. 客户端配置uri的invoke
applicationContext-client-http-service.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- 指定Spring配置文件的Schema信息 --> <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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-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"> <bean id="personService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean" depends-on="propertyConfigurer"> <property name="serviceUrl" > <value> http://${host}:${port}/${contextPath}/service/httpService </value> </property> <property name="serviceInterface" value="com.anialy.httpservice.service.PersonService"> </property> </bean> </beans>
system.properties
serviceName=localhost host=127.0.0.1 port=8080 contextPath=WebProj
加载配置文件的xml
applicationContext-constants.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> <value>classpath:system.properties</value> </list> </property> </bean> </beans>
4. 编写测试方法
TestHttpServiceInvoke.java
package httpservice; import java.io.IOException; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.anialy.httpservice.entity.Person; import com.anialy.httpservice.service.PersonService; public class TestHttpServiceInvoke { private static final Logger logger = LoggerFactory.getLogger(TestHttpServiceInvoke.class); private ApplicationContext ctx; private PersonService personService; @Before public void init() throws IOException{ ctx = new ClassPathXmlApplicationContext(new String[]{ "classpath*:/applicationContext-client-http-service.xml", "classpath*:/applicationContext-constants.xml" }); personService = (PersonService) ctx.getBean("personService"); System.out.println(""); } @Test public void test() { Person person = personService.getPersonByName("anialy"); logger.info("姓名:" + person.getName()); logger.info("年龄:" + person.getAge()); } }
输出: