SpringMVC-web项目和HttpInvoker

springmvc+httpInvoke+mybatis例子_svc springmvc 例子。采用了httpInvoke远程调用技术,为了简单只用了jsp->controller->dao分层。。其中的jsp controller 放在_web工程中,业务逻辑放在_svc中,分开下载,如果觉得没用,就可以不用下载另外一个工程了,持久层用mybatis,数据库oracle。 立即下载

部分摘抄自

https://blog.youkuaiyun.com/caomiao2006/article/details/51290494

SpringMVC的基本使用

<context:component-scan base-package="com.gdl.service" />

从Spring提供的参考手册中我们得知该配置的功能是扫描配置的base-package包下的所有使用了@Component注解的类,并且将它们自动注册到容器中,同时也扫描@Controller,@Service,@Respository这三个注解,因为他们是继承自@Component。

<mvc:annotation-driven />

声明了@RequestMapping、@RequestBody、@ResponseBody

<context:annotation-config/>

声明了@Required、@Autowired、 @PostConstruct、@PersistenceContext、@Resource、@PreDestroy等注解。

Web容器中SpringMVC项目的启动流程

一个典型的web.xml的内容如下

<?xml version="1.0" encoding="UTF-8"?>  
  
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
    
    <!—创建Root WebApplicationContext-->
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>/WEB-INF/spring/applicationContext.xml</param-value>  
    </context-param>  
  
    <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>  
    
    <!—创建Servlet WebApplicationContext-->
    <servlet>  
        <servlet-name>dispatcher</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>/WEB-INF/spring/spring-servlet.xml</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>dispatcher</servlet-name>  
        <url-pattern>/*</url-pattern>  
    </servlet-mapping>  
	 <filter>
		<filter-name>encodingfilter</filter-name>
		<filter-class>com.my.app.EncodingFilter</filter-class>
		<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
	<filter-name>encodingfilter</filter-name>
	<url-pattern>/*</url-pattern>
	</filter-mapping>







  
</web-app>

首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境;

其次,在web.xml中会提供有contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时contextLoaderListener会监听到这个事件,其contextInitialized方法会被调用,在这个方法中,spring会初始化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext,这是一个接口类,确切的说,其实际的实现类是XmlWebApplicationContext。这个就是spring的IoC容器,其对应的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到ServletContext中,便于获取;

再次,contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这个servlet可以配置多个,以最常见的DispatcherServlet为例,这个servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的IoC上下文,用以持有spring mvc相关的bean。在建立DispatcherServlet自己的IoC上下文时,会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先从ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文之后,再初始化自己持有的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化处理器映射、视图解析等。这个servlet自己持有的上下文默认实现类也是XmlWebApplicationContext。初始化完毕后,spring以与servlet的名字相关(此处不是简单的以servlet名为Key,而是通过一些转换,具体可自行查看源码)的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每个servlet就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的bean,即根上下文(第2步中初始化的上下文)定义的那些bean。
在这里插入图片描述

注意,在默认的情况下,DispatcherServlet只会在MVC的spring context中寻找controller的定义(包括哪些没有配置为controller但是实现了HttpRequestHandler的bean)。如果,你不小心把controller定义到了WebApplicationContext,那么将无法找到。你可以通过如下配置改变默认行为,使DispatcherServlet在初始化时去寻找WebApplicationContext中controller的定义。

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
   <property name="detectHandlerMethodsInAncestorContexts">
       <value>true</value>
   </property>
</bean>

但是,spring官方建议你各司其职,不要把controller定义在WebApplicationContext中。

SpringMVC的执行流程

首先是filter的执行。fitler的执行顺序有如下约定

1.以url-pattern方式配置的filter运行时肯定先于以servlet-name方式配置的filter
2.以url-partern方式配置的filter中,如果有多个与当前请求匹配,则按web.xml中filter-mapping出现的顺序来运行
3.对于以servlet-name方式配置的filter,如果有多个与当前请求匹配,也是按web.xml中filter-mapping出现的顺序来运行

ApplicationFilterChain执行完后,会进入对用servlet的处理程序。

在这里插入图片描述

在DispathServelet执行流程一般为

在这里插入图片描述

HttpInvoker

HttpInvoker的竞争者是RMI。RMI使用java标准的序列化机制(Spring也支持RMI)。RMI的主要缺点是如何穿越防火墙。 RMI穿越防火墙不方便主要是因为除了RMI服务注册的端口(默认1099)外,与RMI的通讯还需要另外的端口来传送数据,而另外的端口是随机分配的,所以,防火墙只设置允许1099是不可以的(这种坑爹的设计究竟是谁想出来的呢)。HttpInvoker基于HTTP进行远程调用,是使用Spring提供web服务的基础。
首先来看服务端代码
首先,我们要在spring配置文件中配置这样一个handler

    <bean name="/queryFlightWayPointSVC"
          class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service" ref="queryFlightWayPointSVC" />
        <property name="serviceInterface"
                  value="com.gdl.service.flight.interfaces.IQuery" />
    </bean>

在这里,最终要的是HttpInvokerServiceExporter这个类。该类会接收到客户端的请求。
这里写图片描述

    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            //从网络请求中恢复调用对象RemoteInvocation
            RemoteInvocation invocation = this.readRemoteInvocation(request);
            //并不是本对象亲自处理该请求,呼叫本对象的代理
            RemoteInvocationResult result = this.invokeAndCreateResult(invocation, this.getProxy());
            //将结果返回客户端
            this.writeRemoteInvocationResult(request, response, result);
        } catch (ClassNotFoundException var5) {
            throw new NestedServletException("Class not found during deserialization", var5);
        }
    }

该对象的代理构造过程如下

    protected Object getProxyForService() {
        ProxyFactory proxyFactory;
        label25: {
            this.checkService();
            this.checkServiceInterface();
            proxyFactory = new ProxyFactory();
            proxyFactory.addInterface(this.getServiceInterface());
            if (this.registerTraceInterceptor != null) {
                if (!this.registerTraceInterceptor.booleanValue()) {
                    break label25;
                }
            } else if (this.interceptors != null) {
                break label25;
            }
			//主要添加了一些日志的打印
            proxyFactory.addAdvice(new RemoteInvocationTraceInterceptor(this.getExporterName()));
        }
        //注册关于该服务的一些interceptors
        if (this.interceptors != null) {
            AdvisorAdapterRegistry adapterRegistry = GlobalAdvisorAdapterRegistry.getInstance();

            for(int i = 0; i < this.interceptors.length; ++i) {
                proxyFactory.addAdvisor(adapterRegistry.wrap(this.interceptors[i]));
            }
        }

        proxyFactory.setTarget(this.getService());
        proxyFactory.setOpaque(true);
        return proxyFactory.getProxy(this.getBeanClassLoader());
    }

再来看客户端代码
spring默认的Executor是CommonsHttpInvokerRequestExecutor,但是实际中因为服务注册的各个使用场景一般都写自己的Executor(继承AbstractHttpInvokerRequestExecutor即可)。CommonsHttpInvokerRequestExecutor使用HttpClient进行网络通信。使用POST请求。

	protected RemoteInvocationResult doExecuteRequest(
			HttpInvokerClientConfiguration config, ByteArrayOutputStream baos)
			throws IOException, ClassNotFoundException {

		PostMethod postMethod = createPostMethod(config);
		try {
			setRequestBody(config, postMethod, baos);
			executePostMethod(config, getHttpClient(), postMethod);
			validateResponse(config, postMethod);
			InputStream responseBody = getResponseBody(config, postMethod);
			return readRemoteInvocationResult(responseBody, config.getCodebaseUrl());
		}
		finally {
			// Need to explicitly release because it might be pooled.
			postMethod.releaseConnection();
		}
	}
2025最新聚合易支付官方完整版 – 全开源 2025聚合易支付5.0全开源版引领下一代智能支付革命,以"开放·智能·可信"为核心理念,成为全球首个通过量子安全认证的开源支付系统。该系统具备三大突破性创新:AI原生风控架构、跨链支付协议和零信任安全体系,支持百万级TPS处理能力。技术亮点包括Rust异步框架、Llama3风控模型、Polkadot跨链方案及IPFS分布式存储。提供量子安全支付、智能路由、元宇宙支付等六大功能,并通过开放原子基金会认证,构建了包含1200+全球开发者的开源生态。 阅读详情

相关推荐

coze开发-5、给智能体添加“技能”

中间编排与技能组件 中间编排的定义 中间编排是指在智能体的构建过程中,使用一些工具对智能体进行协调和管理。通过这些工具,我们能够更好地实现智能体在特定业务场景中的应用。

andyyah晓波的博客 527

HttpInvoker SSL双向认证远程接口调用

在工作中,遇到需要开放一个web接口给对方调用,所以用到了HttpInvoker ,但是又遇到了一个问题,就是采用的是双向认证,只开放443端口,也就是说配置接口必须采用https,而且调用接口时,还需要通过双向认证。下面是我做的事例,贴出来供大家参考。 一、创建接口和接口实现类 public interface SyncRemoteService {     /**      * 挂网成

hongfu951的专栏 1817

RAG 赋能客服机器人:多轮对话与精准回复

在人工智能技术飞速发展的今天,客服机器人已成为企业提升服务效率的重要工具。然而,传统客服系统在多轮对话连贯性和精准回复能力上存在明显短板。检索增强生成(Retrieval-Augmented Generation, RAG)技术通过结合大语言模型(LLM)与外部知识库,为解决这一问题提供了创新路径。本文将深入探讨 RAG 在客服机器人中的应用,重点分析其如何实现多轮对话与精准回复,并结合实际案例与技术框架展开讨论。

shuizhudan223的博客 2143

Spring4 HttpInvoker 超时配置

1.spring4x 后 httpinvoker 默认采用 SimpleHttpInvokerRequestExecutor 调度器,默认不设超时时间。 2.网上大多数采用CommonsHttpInvokerRequestExecutor。 两个缺点,1)性能低于SimpleHttpInvokerRequestExecutor;2)spring4x后移除该类。 3.采用 sp...

sinat_24928447的博客 728

基于FSL的DTI数据预处理流程

最近在学习处理DTI数据,总结了一份应用FSL做DTI数据预处理的流程与大家交流交流。如果有错误的地方欢迎大家指正!        我用的数据是Philips的数据,如果是GE或者西门子的数据可能会有所不同。   原始数据:包括3DT1数据和高分辨率DTI数据,均是dicom格式。 工具:MRICRON和FSL,所有的命令均在Linux的终端中运行。   1.格式转换:将后缀名为dcm

zaza_zaza的博客 2万+

激光雷达测距方式全解析:ToF、三角测距和FMCW到底怎么选?

本文深度解析激光雷达三种主流测距方式(ToF、三角测距和FMCW)的技术原理、环境适应性和成本模型,提供场景化选型决策指南。通过对比各技术在精度、抗干扰能力和维护成本等方面的表现,帮助工程师在自动驾驶、工业检测和消费电子等领域做出最优选择。

qqq44的博客 720

Spring HttpInvoke远程调用服务

Spring HttpInvoke实现和效率提升 2人收藏此文章, 收藏此文章 发表于3个月前 , 已有143次阅读 共0个评论 2人收藏此文章 Spring HttpInvoke,一种较为常用的、基于Spring架构的服务器之间的远程调用实现,可以说是轻量级的RMI。 最初,我们使用Spring HttpInvoke同步配置数据,刷新多个服务器上的缓存,当然如果用分布式缓存是不是...

zhangmiao12的专栏 900

使用Eggjs做服务端获取微信小程序云开发数据库的access_token

最近自己想写了一个微信小程序,恰巧里面有个云开发,恰巧里面有个数据库,那懒人的我,就直接用云开发里面的数据库了,做测试或者正式也好,对于刚开始来说,免费的配额是够用的。 后来想到在小程序云开发上面的数据怎么看才方便?刚好微信小程序有一个服务端API,那就方便很多了,那就直接敲个服务端来获取云开发上数据库的数据出来到自己的后台上面,那以后管理起来也方便很多。 看了一下服务端api之后,发现有三个重要...

kalenE992的博客 1705

聊聊HttpComponentsHttpInvokerRequestExecutor

本文主要研究一下HttpComponentsHttpInvokerRequestExecutor。

go4it 723

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3330

YOLO11 改进 - C2PSA | C2PSA融合HEWL(高频增强小波层):小波逆变换+双通道注意力增强+高频显式增强 | TGRS 2026

本文介绍了高频增强小波层(HEWL),一种专为解决红外小目标检测中边缘退化与语义模糊问题设计的上采样模块。该方法结合小波逆变换与交替通道注意力(ALCA),通过显式增强高频细节并优化特征融合,实现精准的边缘重建与语义对齐。我们将 HEWL 融入 PSABlock 结构构建了 C2PSA_HEWL 模块,并成功集成进 YOLO11 的骨干网络,替代原有的 C2PSA 模块。实验证明,结合 HEWL 的 YOLO11 在检测任务中表现优异,有效提升了模型对细节特征的捕捉能力。

魔改工程师的博客 103

java httpinvoker漏洞_Spring HttpInvoker 服务端安全验证的和客户端请求配置

1、服务端服务Java接口packageservice;publicinterfaceTestService{intadd(inti,intj);}服务的Java实现packageservice.impl;importorg.springframework.stereotype.Service;importservice.TestService;@Service("testSe...

weixin_33855578的博客 514

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring HttpInvoker和Hessian在Spring MVC下出错

dispatcher-servlet.xml中做如下配置  Java代码  "registerService" class="com.xxx.service.impl.RegisterServiceImpl"/>      "/register" class="org.springframework.remoting.caucho.HessianServiceExpor

kiss_vicente的专栏 1541

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring RMI,Hessian/Burlap,HttpInvoker的区别

1 Hessian/Burlap 方式    客户端通过Hessian/BurlapProxyFactoryBean生成的代理对象负责通过HTTP协议与远程服务通信。在服务端,HessianServiceExporter是一个Spring MVC的控制器,可以通过接收请求并将这些请求翻译成对POJO对象的调用将POJO输出为一个服务。需要添加两处配置(1)Spring配置文件处理URL。用来分发Hessian的URL请求给适当的Hessian服务Bean。(2)在web.xml文件配置Spring的Disp

arkblue的专栏 7331

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

spring httpInvoker

Spring中HttpInvoker远程调用使用实例 代码结构图如下: 客户端通过Spring的HttpInvoker,完成对远程函数的调用。涉及的类有: 客户端调用User类的服务UserService,完成对实现类UserServiceImpl的addUser(User u)方法调用。其中User类为普通Pojo对象,UserService为接口,UserServiceImpl为

地平线的专栏 522

Java学习之路-Spring的HttpInvoker学习

Hessian和Burlap都是基于HTTP的,他们都解决了RMI所头疼的防火墙渗透问题。但当传递过来的RPC消息中包含序列化对象时,RMI就完胜Hessian和Burlap了。   因为Hessian和Burlap都是采用了私有的序列化机制,而RMI使用的是Java本身的序列化机制。如果数据模型非常复杂,那么Hessian/Burlap的序列化模型可能就无法胜任了。   Spring开发团队

可口可乐的博客 496

Spring HttpInvoker 开发

<br />Spring提供了利用Spring MVC将远程服务输出为http调用的功能,下面演示一个客户端查询远程服务器日期的例子:<br />首先,定义远程服务的接口:<br />package org.chy.rmi.service; import java.util.Date; public interface ISystemTimeQuery { public Date query(); }<br />开发远程服务接口的实现类<br />package org.chy.rmi.s

JavaChenYang的专栏 2295

Spring的HttpInvoker

转载请出自出处:http://eksliang.iteye.com/blog/2267682 一、概述 上两篇博客《RMI远程方式调用》、《Heasian与Spring集成》他们都有自己的缺陷,第一,RMI使用Java标准的对象序列化机制,但是很难穿透防火墙。另一个方面,Hessian和Burlap能很好的穿透防火墙,但是使用私有的对象序列化机制。 就这样Spring invoker应运...

xiatianba的专栏 248

Spring中HttpInvoker远程方法调用使用实例

代码结构图如下: 客户端通过Spring的HttpInvoker,完成对远程函数的调用。涉及的类有: 客户端调用User类的服务UserService,完成对实现类UserServiceImpl的addUser(User u)方法调用。其中User类为普通Pojo对象,UserService为接口,UserServiceImpl为UserService的具体实现。代码如下: publ...

dawuafang 287

SpringMVC集成Hessian

转自:http://blog.youkuaiyun.com/isea533/article/details/45038779 先配置好SpringMVC。 主要是在web.xml中有了如下的配置:     springMVC-hessian     org.springframework.web.servlet.DispatcherServlet     1

CaBCo的博客 682

spring httpinvoker https

Spring HttpInvoke,一种较为常用的、基于Spring架构的服务器之间的远程调用实现,可以说是轻量级的RMI   1.在web.xml配置spring 并添加对应的spring配置文件   &lt;listener&gt; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListene...

asdfljw的博客 383

Java Spring的远程调用方式(如RMI、Hessian、Burlap等)

Spring框架通过提供对多种远程调用技术的集成,使得开发者可以根据项目需求和偏好选择合适的远程调用方式。Spring框架提供了对多种远程调用技术的集成,使得开发者可以方便地在分布式系统中实现远程服务调用。随着Web服务的发展,REST(Representational State Transfer)已成为一种流行的远程调用方式。RMI是一种Java特有的远程调用技术,允许一个Java虚拟机上的对象调用另一个Java虚拟机上的对象的方法。Spring对Hessian的支持通过。)的简单远程调用方案。

编程小弟的博客 1279

第33章 Spring远程方案(二)

SpringRemoting提供了三种基于HTTP的远程方案Spring框架自行开发的HttpInvoker方案;基于Caucho的Hessian远程方案;基于Caucho的Burlap远程方案。在进一步了解每一种方案之前,我们先来从总体上分析一下,这些基于HTTP的轻量级远程方案都有哪些共通之处,或者说它们是怎么实现的。...

hello world 11万+
上一篇: JUC之AQS第二部分:共享锁部分
下一篇: Mysql深入浅出之架构
define_us
博客等级 码龄14年 157粉丝 531原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值