HttpInvoker in spring 2.0

本文介绍如何使用Spring框架实现远程服务的发布与调用,包括配置HTTP Invoker服务端与客户端的过程,以及所需的依赖包和配置文件。

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

使用Spring进行远程访问与Web服务
17.1. 简介
Spring为各种远程访问技术的集成提供了工具类。Spring远程支持是由普通(Spring)POJO实现的,这使得开发具有远程访问功能的服务变得相当容易。目前,Spring支持四种远程技术:
• 远程方法调用(RMI)。通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,Spring同时支持传统的RMI(使用java.rmi.Remote接口和java.rmi.RemoteException)和通过RMI调用器实现的透明远程调用(支持任何Java接口)。
• Spring的HTTP调用器。Spring提供了一种特殊的允许通过HTTP进行Java串行化的远程调用策略,支持任意Java接口(就像RMI调用器)。相对应的支持类是 HttpInvokerProxyFactoryBean 和 HttpInvokerServiceExporter。
• Hessian。通过 HessianProxyFactoryBean 和 HessianServiceExporter,可以使用Caucho提供的基于HTTP的轻量级二进制协议来透明地暴露服务。
• Burlap。 Burlap是Caucho的另外一个子项目,可以作为Hessian基于XML的替代方案。Spring提供了诸如 BurlapProxyFactoryBean 和 BurlapServiceExporter 的支持类。
• JAX RPC。Spring通过JAX-RPC为远程Web服务提供支持。
• JMS(待实现)。
在讨论Spring对远程访问的支持时,我们将使用下面的域模型和对应的服务:


package com.test.spring;

import java.io.Serializable;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

/**
 * 用户和服务层交互的对象,即用来传递数据的对象
 *
 * @author test
 *
 */
public class Account implements Serializable {
 /**
  *
  */
 private static final long serialVersionUID = 2151697717808881589L;

 private String name;

 private int amount;

 public String getName() {
  return this.name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAmount() {
  return amount;
 }

 public void setAmount(int amount) {
  this.amount = amount;
 }

 public Account(String name, int amount) {
  super();
  this.name = name;
  this.amount = amount;
 }

 @Override
 public String toString() {

        return ToStringBuilder.reflectionToString(this,
                ToStringStyle.MULTI_LINE_STYLE);
 }
 
}

package com.test.spring;

import java.util.List;

/**
 * 服务层接口,对外公布的接口
 *
 * @author test
 *
 */
public interface AccountService {
 
 
 /**
  * 插入帐户信息
  * @param account
  */
 public void insertAccount(Account account);

 /**
  *
  * 根据帐户名称取对应帐户信息集合
  * @param name
  * @return
  */
 public List getAccounts(String name);

}

 


package com.test.spring;

import java.util.ArrayList;
import java.util.List;

/**
 * 服务端实现发布的服务的实现类
 * @author test
 *
 */
public class AccountServiceImpl implements AccountService {

 private List list=new ArrayList();
 
 @SuppressWarnings("unchecked")
 
 public void insertAccount(Account acc) {
  this.list.add(acc);
 }

 @SuppressWarnings("unchecked")
 public List getAccounts(String name) {
  List tempList=new ArrayList();
  for(int i=0;i    if (((Account)list.get(i)).getName().equals(name)){
    tempList.add(list.get(i));
   }
  }
  return tempList;
 }
}


在eclipse 中建立一个 java_web工程,

Web-inf/lib下加入以下包:
Commons-lang.jar
Connons-logging.jar
Hessian.jar
Spring.jar
Spring-aspects.jar


将上面的代码放到src下


Web.xml中加入:


 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/remoting-servlet.xml</param-value>
 </context-param>

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

 <servlet>
  <servlet-name>remoting</servlet-name>
  <servlet-class>
   org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>remoting</servlet-name>
  <url-pattern>/remoting/*</url-pattern>
 </servlet-mapping>


 

remoting-servlet.xml的内容:

<bean class="com.liuxt.spring.AccountServiceImpl" id="accountService"></bean><beans>
<bean id="accountService" class="com.liuxt.spring.AccountServiceImpl">
  <!-- any additional properties, maybe a DAO? -->
</bean>
<!--httpinvoker config   -->
<bean name="/AccountService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter" singleton="false">
  <property name="service" ref="accountService"/>
  <property name="serviceInterface" value="com.liuxt.spring.AccountService"/>
</bean>
 


在eclpse中启动 tomcat


确保没有错误,正常启动

 

   以上服务端的程序建立完毕

 


下面是客户端的程序的建立
建立一个普通的java工程
  将服务端的类:Account和AccountService复制到该工程的src下,确保包名不变
正常的工程是需要服务端把发布的接口和数据对象bean,打成jar包,发给客户端
   客户端也需要上面的服务器倒入的jar包


package spring.client;

import com.test.spring.AccountService;


/**
 * 该类主要在客户端用于调用服务器的发布的服务
 * @author test
 *
 */
public class SimpleObject {

 private AccountService accountService;

 public void setAccountService(AccountService accountService) {
  this.accountService = accountService;
 }


 public AccountService getAccountService() {
  return accountService;
 }
 
}


Src 目录下建立BeanHttpInvoker.xml
内容如下:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
  "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean class="spring.client.SimpleObject">
 <property name="accountService" ref="httpInvokerProxy"/>
</bean>
<bean id="httpInvokerProxy" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
  <property name="serviceUrl" value="http://localhost:8080/SpringWebRomote/remoting/AccountService"/>
  <property name="serviceInterface" value="com.liuxt.spring.AccountService"/>
</bean>


</beans>

 

注意url的填写,需要用你的web工程的名字替换

 

客户测试程序;

package spring.client;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.test.spring.Account;

public class HttpInvokerClient {

 public static void main(String[] args) {
  ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
    "BeanHttpInvoker.xml");
  SimpleObject simpleObject = (SimpleObject) applicationContext
    .getBean("spring.client.SimpleObject");
  Account account = new Account("cccc", 30);
  simpleObject.getAccountService().insertAccount(account);
  System.out.println("dddd"
    + simpleObject.getAccountService().getAccounts("cccc"));
 }

}

 

当然可以用其他的方法,文档最开头介绍的几个部分

具体参考spring2.0的官方在线文档

 

 


 

资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 行列式是线性代数的核心概念,在求解线性方程组、分析矩阵特性以及几何计算中都极为关键。本教程将讲解如何用C++实现行列式的计算,重点在于如何输出分数形式的结果。 行列式定义如下:对于n阶方阵A=(a_ij),其行列式由主对角线元素的乘积,按行或列的奇偶性赋予正负号后求和得到,记作det(A)。例如,2×2矩阵的行列式为det(A)=a11×a22-a12×a21,而更高阶矩阵的行列式可通过Laplace展开或Sarrus规则递归计算。 在C++中实现行列式计算时,首先需定义矩阵类或结构体,用二维数组存储矩阵元素,并实现初始化、加法、乘法、转置等操作。为支持分数形式输出,需引入分数类,包含分子和分母两个整数,并提供与整数、浮点数的转换以及加、减、乘、除等运算。C++中可借助std::pair表示分数,或自定义结构体并重载运算符。 计算行列式的函数实现上,3×3及以下矩阵可直接按定义计算,更大矩阵可采用Laplace展开或高斯 - 约旦消元法。Laplace展开是沿某行或列展开,将矩阵分解为多个小矩阵的行列式乘积,再递归计算。在处理分数输出时,需注意避免无限循环和除零错误,如在分数运算前先约简,确保分子分母互质,且所有计算基于整数进行,最后再转为浮点数,以避免浮点数误差。 为提升代码可读性和可维护性,建议采用面向对象编程,将矩阵类和分数类封装,每个类有明确功能和接口,便于后续扩展如矩阵求逆、计算特征值等功能。 总结C++实现行列式计算的关键步骤:一是定义矩阵类和分数类;二是实现矩阵基本操作;三是设计行列式计算函数;四是用分数类处理精确计算;五是编写测试用例验证程序正确性。通过这些步骤,可构建一个高效准确的行列式计算程序,支持分数形式计算,为C++编程和线性代数应用奠定基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值