分类
未分类

With NPOI, you can read/write Office 2003/2007 files very easily

https://github.com/nissl-lab/npoi

分类
未分类

Open XML SDK 2.5 for Office

https://learn.microsoft.com/en-us/office/open-xml/open-xml-sdk

示例代码:
Calculate the sum of a range of cells in a spreadsheet document

分类
未分类

.net core通过RFC调用SAP的Function

最近发现github已经有了.net core的SAP的RFC组件SapNwRfc(https://github.com/huysentruitw/SapNwRfc)。.net core项目不用再愁不能与SAP接口的问题了,不过使用这个RFC组件需要另外一个SAP的库SAP NetWeaver RFC Library 7.50 SDK,费了一番劲才弄到(SAP不提供对外下载)。

SapNwRfc直接在VS中nuget安装即可,SAP NetWeaver RFC Library 7.50 SDK需要将下面选中的6个模块放到项目的工作目录中(vs是debug/bin里面,vs code是cwd设置的工作目录)。

链接: https://pan.baidu.com/s/1Gsn7a6DP7IsdBnEB2Xmavg 提取码: cwfb 复制这段内容后打开百度网盘手机App,操作更方便哦

转自

https://www.cnblogs.com/treelie/p/13749255.html

分类
未分类

Vue Framework Comparison 2022

https://vuetifyjs.com/en/

分类
未分类

linux中spawn远程执行,linux 远程登录执行命令

@(Linux 命令脚本)

方便自动化运维部署,在多台机器上自动执行命令。

ssh 需要输入密码, 所以使用 expect 进行交互,从执行文本读取远程主机 IP, 登录名和密码后执行远程登录,执行命令。

脚本 remote_cmd.sh

#!/bin/bash

if [ ! -f “host.list” ]; then

echo “host.list no exit”

exit -1

fi

# 去除空行

sed -i ‘/^[:space:]*$/d’ host.list

while read LINE

do

eval $(echo $LINE | awk ‘{printf(“IP=%s USER=%s PASSWD=%s”,$1, $2, $3)}’)

expect <

set timeout 1200

spawn ssh -p 36000 -l $USER $IP

expect {

“yes/no” {send “yes\r”; exp_continue}

“password:” {send $PASSWD\r”;}

}

sleep 1

send “cd ~/work/\r”

sleep 1

send “touch aa\r”

sleep 1

send “exit\n”

expect eof

exit

END

done < host.list

主机列表 host.list

192.168.67.236 lcd jklfds

192.168.67.236 lcd jklfds

通过 ssh 远程登录执行命令,启动远程终端, 通过参数 -t 实现 :

ssh -t -p 36000 -l lcd 192.168.67.236 “mkdir -p ~/work/lcd”

expect 需要安装 :

ubuntu 下 : sudo apt-get install expect
转自https://blog.csdn.net/weixin_33400388/article/details/116851210

分类
未分类

.NET中的动态编译

代码的动态编译并执行是一个.NET平台提供给我们的很强大的工具用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序。这在很大程度上给我们提供了另外一种扩展的方式(当然这并不能算是严格意义上的扩展,但至少为我们提供了一种思路)。

动态代码执行可以应用在诸如模板生成,外加逻辑扩展等一些场合。一个简单的例子,为了网站那的响应速度,HTML静态页面往往是我们最好的选择,但基于数据驱动的网站往往又很难用静态页面实现,那么将动态页面生成html的工作或许就是一个很好的应用场合。另外,对于一些模板的套用,我们同样可以用它来做。另外这本身也是插件编写的方式。

最基本的动态编译

.Net为我们提供了很强大的支持来实现这一切我们可以去做的基础,主要应用的两个命名空间是:System.CodeDom.Compiler和Microsoft.CSharp或Microsoft.VisualBasic。另外还需要用到反射来动态执行你的代码。动态编译并执行代码的原理其实在于将提供的源代码交予CSharpCodeProvider来执行编译(其实和CSC没什么两样),如果没有任何编译错误,生成的IL代码会被编译成DLL存放于于内存并加载在某个应用程序域(默认为当前)内并通过反射的方式来调用其某个方法或者触发某个事件等。之所以说它是插件编写的一种方式也正是因为与此,我们可以通过预先定义好的借口来组织和扩展我们的程序并将其交还给主程序去触发。一个基本的动态编译并执行代码的步骤包括:

·         将要被编译和执行的代码读入并以字符串方式保存

·         声明CSharpCodeProvider对象实例

·         调用CSharpCodeProvider实例的CompileAssemblyFromSource方法编译

·         用反射生成被生成对象的实例(Assembly.CreateInstance)

·         调用其方法

以下代码片段包含了完整的编译和执行过程:

//get the code to compilestring strSourceCode = this.txtSource.Text; // 1.Create a new CSharpCodePrivoder instanceCSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(); // 2.Sets the runtime compiling parameters by crating a new CompilerParameters instanceCompilerParameters objCompilerParameters = new CompilerParameters();objCompilerParameters.ReferencedAssemblies.Add(“System.dll”);objCompilerParameters.ReferencedAssemblies.Add(“System.Windows.Forms.dll”);objCompilerParameters.GenerateInMemory = true; // 3.CompilerResults: Complile the code snippet by calling a method from the providerCompilerResults cr = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, strSourceCode); if (cr.Errors.HasErrors){    string strErrorMsg = cr.Errors.Count.ToString() + ” Errors:”;     for (int x = 0; x < cr.Errors.Count; x++)    {        strErrorMsg = strErrorMsg + “\r\nLine: ” +                     cr.Errors[x].Line.ToString() + ” – ” +                     cr.Errors[x].ErrorText;    }     this.txtResult.Text = strErrorMsg;    MessageBox.Show(“There were build erros, please modify your code.”, “Compiling Error”);     return;} // 4. Invoke the method by using ReflectionAssembly objAssembly = cr.CompiledAssembly;object objClass = objAssembly.CreateInstance(“Dynamicly.HelloWorld”);if (objClass == null){    this.txtResult.Text = “Error: ” + “Couldn’t load class.”;    return;} object[] objCodeParms = new object[1];objCodeParms[0] = “Allan.”; string strResult = (string)objClass.GetType().InvokeMember(           “GetTime”, BindingFlags.InvokeMethod, null, objClass, objCodeParms); this.txtResult.Text = strResult;

需要解释的是,这里我们在传递编译参数时设置了GenerateInMemory为true,这表明生成的DLL会被加载在内存中(随后被默认引用入当前应用程序域)。在调用GetTime方法时我们需要加入参数,传递object类型的数组并通过Reflection的InvokeMember来调用。在创建生成的Assembly中的对象实例时,需要注意用到的命名空间是你输入代码的真实命名空间。以下是我们输入的测试代码(为了方便,所有的代码都在外部输入,动态执行时不做调整):

using System; namespace Dynamicly{    public class HelloWorld    {        public string GetTime(string strName)        {            return  “Welcome ” + strName + “, Check in at ” + System.DateTime.Now.ToString();        }    }}

运行附件中提供的程序,可以很容易得到一下结果:

改进的执行过程

现在一切看起来很好,我们可以编译代码并把代码加载到当前应用程序域中来参与我们的活动,但你是否想过去卸载掉这段程序呢?更好的去控制程序呢?另外,当你运行这个程序很多遍的时候,你会发现占用内存很大,而且每次执行都会增大内存使用。是否需要来解决这个问题呢?当然需要,否则你会发现这个东西根本没用,我需要执行的一些大的应用会让我的服务器crzay,不堪重负而疯掉的。

要解决这个问题我们需要来了解一下应用程序域。.NET Application Domain是.NET提供的运行和承载一个活动的进程(Process)的容器,它将这个进程运行所需的代码和数据,隔离到一个小的范围内,称为Application Domain。当一个应用程序运行时,Application Domains将所有的程序集/组件集加载到当前的应用程序域中,并根据需要来调用。而对于动态生成的代码/程序集,我们看起来好像并没有办法去管理它。其实不然,我们可以用Application Domain提供的管理程序集的办法来动态加载和移除Assemblies来达到我们的提高性能的目的。具体怎么做呢,在前边的基础上增加以下步骤:

·         创建另外一个Application Domain

·         动态创建(编译)代码并保存到磁盘

·         创建一个公共的远程调用接口

·         创建远程调用接口的实例。并通过这个接口来访问其方法。

换句话来讲就是将对象加载到另外一个AppDomain中并通过远程调用的方法来调用。所谓远程调用其实也就是跨应用程序域调用,所以这个对象(动态代码)必须继承于MarshalByRefObject类。为了复用,这个接口被单独提到一个工程中,并提供一个工厂来简化每次的调用操作:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Reflection; namespace RemoteAccess{    /// <summary>          /// Interface that can be run over the remote AppDomain boundary.          /// </summary>          public interface IRemoteInterface          {                   object Invoke(string lcMethod,object[] Parameters);          }           /// <summary>          /// Factory class to create objects exposing IRemoteInterface          /// </summary>          public class RemoteLoaderFactory : MarshalByRefObject          {                   private const BindingFlags bfi = BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance;                    public RemoteLoaderFactory() {}                    public IRemoteInterface Create( string assemblyFile, string typeName, object[] constructArgs )                   {                             return (IRemoteInterface) Activator.CreateInstanceFrom(                                      assemblyFile, typeName, false, bfi, null, constructArgs,                                      null, null, null ).Unwrap();                   }          }       }

接下来在原来基础上需要修改的是:

·         将编译成的DLL保存到磁盘中。

·         创建另外的AppDomain。

·         获得IRemoteInterface接口的引用。(将生成的DLL加载到额外的AppDomain)

·         调用InvokeMethod方法来远程调用。

·         可以通过AppDomain.Unload()方法卸载程序集。

以下是完整的代码,演示了如何应用这一方案。

//get the code to compilestring strSourceCode = this.txtSource.Text; //1. Create an addtional AppDomainAppDomainSetup objSetup = new AppDomainSetup();objSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;AppDomain objAppDomain = AppDomain.CreateDomain(“MyAppDomain”, null, objSetup); // 1.Create a new CSharpCodePrivoder instanceCSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider(); // 2.Sets the runtime compiling parameters by crating a new CompilerParameters instanceCompilerParameters objCompilerParameters = new CompilerParameters();objCompilerParameters.ReferencedAssemblies.Add(“System.dll”);objCompilerParameters.ReferencedAssemblies.Add(“System.Windows.Forms.dll”); // Load the remote loader interfaceobjCompilerParameters.ReferencedAssemblies.Add(“RemoteAccess.dll”); // Load the resulting assembly into memoryobjCompilerParameters.GenerateInMemory = false;objCompilerParameters.OutputAssembly = “DynamicalCode.dll”; // 3.CompilerResults: Complile the code snippet by calling a method from the providerCompilerResults cr = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, strSourceCode); if (cr.Errors.HasErrors){    string strErrorMsg = cr.Errors.Count.ToString() + ” Errors:”;     for (int x = 0; x < cr.Errors.Count; x++)    {        strErrorMsg = strErrorMsg + “\r\nLine: ” +                     cr.Errors[x].Line.ToString() + ” – ” +                     cr.Errors[x].ErrorText;    }     this.txtResult.Text = strErrorMsg;    MessageBox.Show(“There were build erros, please modify your code.”, “Compiling Error”);     return;} // 4. Invoke the method by using ReflectionRemoteLoaderFactory factory = (RemoteLoaderFactory)objAppDomain.CreateInstance(“RemoteAccess”,”RemoteAccess.RemoteLoaderFactory”).Unwrap(); // with help of factory, create a real ‘LiveClass’ instanceobject objObject = factory.Create(“DynamicalCode.dll”, “Dynamicly.HelloWorld”, null); if (objObject == null){    this.txtResult.Text = “Error: ” + “Couldn’t load class.”;    return;} // *** Cast object to remote interface, avoid loading type infoIRemoteInterface objRemote = (IRemoteInterface)objObject; object[] objCodeParms = new object[1];objCodeParms[0] = “Allan.”; string strResult = (string)objRemote.Invoke(“GetTime”, objCodeParms); this.txtResult.Text = strResult; //Dispose the objects and unload the generated DLLs.objRemote = null;AppDomain.Unload(objAppDomain); System.IO.File.Delete(“DynamicalCode.dll”);

对于客户端的输入程序,我们需要继承于MarshalByRefObject类和IRemoteInterface接口,并添加对RemoteAccess程序集的引用。以下为输入:

using System;using System.Reflection;using RemoteAccess; namespace Dynamicly{    public class HelloWorld : MarshalByRefObject,IRemoteInterface    {        public object Invoke(string strMethod,object[] Parameters)        {            return this.GetType().InvokeMember(strMethod, BindingFlags.InvokeMethod,null,this,Parameters);        }         public string GetTime(string strName)        {            return  “Welcome ” + strName + “, Check in at ” + System.DateTime.Now.ToString();        }    }}

这样,你可以通过适时的编译,加载和卸载程序集来保证你的程序始终处于一个可控消耗的过程,并且达到了动态编译的目的,而且因为在不同的应用程序域中,让你的本身的程序更加安全和健壮。示例代码下载:https://files.cnblogs.com/zlgcool/DynamicCompiler.rar

转自https://www.cnblogs.com/zlgcool/archive/2008/10/12/1309616.html

分类
未分类

wkhtmltox

https://app365.club/wp-content/uploads/2022/09/wkhtmltox-0.12.6-1.msvc2015-win64.exe

分类
未分类

Web Platform Installer

https://app365.club/wp-content/uploads/2022/09/WebPlatformInstaller_x64_en-US.msi

分类
未分类

Java webservice详解

Archie_java于 2022-02-22 22:43:37 发布1736 收藏 5

分类专栏:WebService文章标签:javaxml开发语言

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_43842093/article/details/123079151

版权

WebService 专栏收录该内容

5 篇文章2 订阅

订阅专栏

文章目录

1 webservice概述

webservice 即 web 服务,因互联网而产生,通过 webservice 这种 web 服务,我们可以实现互联网应用之间的资源共享,比如我们想知道 手机号码归属地,列车时刻表,天气预报,省市区邮政编码等信息,由于我们自己的数据库中并没有这些信息,那么我们可以调用第三方提供的 webservice服务,获取这些信息;

webservice 是一种系统之间进行调用的技术,系统之间调用的技术有:httpClient、hessian、dubbo、webservice 等;WebService 是一种跨越编程语言,跨越操作系统,跨越终端的远程调用技术,比如一个系统是 Java 语言开发的,另一个系统是 PHP 语言开发的,他们之间要实现信息交互,则可以使用 webservice 进行数据交互;

??所以 webservice 实现了异构系统之间的通信,不管是采用什么语言编写的,不管部署在什么操作系统平台上,使用 webservice 都可以实现信息的交换;

2 webservice核心要素

2.1 SOAP

SOAP 英文全称为:Simple Object Access Protocol,即简单对象访问协议,它是基于 xml 格式的消息交换协议;

OAP 定义了信息交换的格式,它包含一个重要的信封 envelope,使用信封envelope 来包装要传递的信息,使用命名空间 namespace 来区分传递的信息;简单来说,在 WebService 中传递的信息就是一封信,SOAP 就是信的通用格式,它定义了一封信应该有信封,信封里装着信的内容;

信封(envlope)的格式是固定的,而信的内容(要传递的数据)可以自己定义;SOAP 协议传输的数据采用 xml 格式进行封装,采用 http 协议进行传输,即soap=xml+http;

2.2 WSDL

WSDL 英文全称为 Web Service Description Language,即 Web Service 描述语言;它使用 xml 对 Web Service 进行描述,比如提供服务的方法、参数、返回值、数据类型等信息进行描述;简单来说,wsdl 就是 webservice 服务的使用说明书;

3 webservice的使用场景

1、应用系统集成
多个应用系统集成在一起,则需要信息交换或通信,那么可以采用 webservice进行通信;

2、异构系统之间通信
异构系统,主要是指编程语言不同的系统;不同系统之间,特别是开发语言不同的系统之间,可以通过 webservice 进行信息交换;

3、软件复用
webservice 可以作为一个公共的服务,供客户端调用,避免软件重复开发工作;

4 webservice的结构

服务端:提供服务,供客户端调用;
客户端:调用服务,获得服务的数据;

在这里插入图片描述

5 Java中的webservice

各种编程语言下都有 webservice 技术,比如 php、c#、Java 等;由于 webservice 定义交互的格式,所以不同编程语言之间可以实现相互调用,数据交换和通信;
Java 中的 webservice,即 Java API for XML-Based Webservices,简称JAX-WS 规范;

JAX-WS 是 sun 公司随 Java 5 发布的一项 webservice 规范,在此之前是JAX-RPC,JAX-RPC 不是很完善;由于 JAX-RPC 并不是很完善,所以在 Java 5 发布后,随即发布了 JAX-RPC2.0,该版本已经比较成熟和完善,后来为了和之前的规范进行区分,又将其改名为JAX-WS 2.0;

Java 5 对应 JAX-WS 2.0 版本;
Java 6 对应 JAX-WS 2.1 版本;
Java 7 对应 JAX-WS 2.2 版本;
目前 JAX-WS 是 2.2.9

5.1 webservice服务端

1、定义一个服务接口及实现,并将实现类注解为@WebService,标注了该注解的类的方法就变为 webservice 方法;

public interface UserService {

    public String sayHi (String name);

    public String work (String work);

    public User getUser (User user);

}
/**
 * 标注了该@WebService注解的类的方法就变为webservice方法
 */
@WebService
public class UserServiceImpl implements UserService {

    @Override
    public String sayHi(String name) {
        return "Hi, " + name;
    }

    @Override
    public String work (String work) {
        return "He is working " + work;
    }

    @Override
    public User getUser (User user) {
        user.setName(user.getName() + "-service");
        return user;
    }
}
12345678910111213141516171819202122
public class User {

    private int id;

    private String name;

    private Date birthday;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
1234567891011121314151617181920212223242526272829303132

2、通过 Endpoint 的 publish 方法,将上一步定义的服务发布出去;

public class Server {

    public static void main(String[] args) {
        //发布webservice
        String wsAddress = "http://localhost:6868/01-ws-java-server/ws";
        Endpoint endpoint = Endpoint.publish(wsAddress, new UserServiceImpl());
        System.out.println("webservice发布成功:" + endpoint.isPublished());
    }
}

3、运行 main 方法;

4、 在 浏 览 器 里 输入 http://localhost:6868/01-ws-java-server/ws?wsdl 将 会 看 到webservice 的 wsdl 信息;有了服务端的 webservice 描述文件 wsdl,就可以根据这个描述文件开发客户端调用程序
在这里插入图片描述

5.2 webservice客户端

1、根据服务端的 wsdl 文件生成客户端调用代码:
在命令行输入命令(需要配置了 Java 环境变量):
wsimport -encoding [编码] -keep -p [包名] [发布的服务地址?wsdl]
比如:

wsimport -encoding utf8 -keep -p com.ws.stub -Xnocompile http://localhost:6868/01-ws-java-server/ws?wsdl

其中:
wsimport 命令
-encoding 指定生成代码的编码格式
-keep 保存生成的代码
-p 指定包名
-Xnocompile 表示生成的代码不编译

在这里插入图片描述
在这里插入图片描述
2、使用生成的代码调用服务端提供的服务;

public class Client {

    public static void main(String[] args) {

        //1.创建一个webservice的客户端
        UserServiceImplService userServiceImplService = new UserServiceImplService();

        //2.获取远程服务接口对象
        UserServiceImpl userService = userServiceImplService.getUserServiceImplPort();

        //3.直接调用远程服务接口对象的方法
        String hi= userService.sayHi("张三丰");
        System.out.println(hi);

        String work = userService.work("Java");
        System.out.println(work);

        User user = new User();
        user.setId(100);
        user.setName("张无忌");
        user.setBirthday(DateUtils.dateToXmlDate(new Date()));
        User userServer = userService.getUser(user);
        System.out.println(userServer.getId() + "--" + userServer.getName() + "--" + userServer.getBirthday());
    }
}
12345678910111213141516171819202122232425

注意Date类型要使用工具类特殊处理

public class DateUtils {

    /**
     * 将Date类转换为XMLGregorianCalendar
     *
     * @param date
     * @return
     */
    public static XMLGregorianCalendar dateToXmlDate(Date date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        DatatypeFactory dtf = null;
        try {
            dtf = DatatypeFactory.newInstance();
            XMLGregorianCalendar dateType = dtf.newXMLGregorianCalendar();
            dateType.setYear(cal.get(Calendar.YEAR));
            //由于Calendar.MONTH取值范围为0~11,需要加1
            dateType.setMonth(cal.get(Calendar.MONTH)+1);
            dateType.setDay(cal.get(Calendar.DAY_OF_MONTH));
            dateType.setHour(cal.get(Calendar.HOUR_OF_DAY));
            dateType.setMinute(cal.get(Calendar.MINUTE));
            dateType.setSecond(cal.get(Calendar.SECOND));

            return dateType;
        } catch (DatatypeConfigurationException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将XMLGregorianCalendar转换为Date
     *
     * @param cal
     * @return
     */
    public static Date xmlDate2Date(XMLGregorianCalendar cal){
        return cal.toGregorianCalendar().getTime();
    }
}
12345678910111213141516171819202122232425262728293031323334353637383940

6 WDSL文件说明

service

  • 整个 webservice 的服务信息,比如服务名,包括所有的服务;

binding

  • 定义每个服务接口的消息格式和协议细节;

portType

  • 描述整个 webservice 可以被执行的操作及相关信息;

message

  • 定义操作的一个或多个数据参数;

types

  • 定义 webservice 使用的全部数据类型;

7 webservice 请求与响应监控

webservice 的请求和响应是 soap 格式的 xml,可以采用一个端口监听工具 TCPMon,通过这个工具,我们可以非常方便地监听目标端口请求与响应的数据;

TCPMon 相当于一个“ 拦截器”,所有我们向目标服务器发送的数据包和服务器返回的数据包都要经过这个拦截器(也可以叫作代理服务器),进而拦截到请求和响应的数据包;
在这里插入图片描述
如上图,如果不使用监控工具,我们是通过 http://xxx.xxx.xxx:8080 访问服务端的服务;如果使用监控工具,则通过访问监控工具,由监控工具请求服务端的,服务,然后再把结果返回给我们,则访问请求变为:http://xxx.xxx.xxx:9000
需要访问9000重新生成WDSL,并替换掉之前的WDSL,然后重新发起请求。

8 webservice 在Tomcat中发布

1、添加相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ws</groupId>
    <artifactId>03-ws-web-server</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.2.10</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
123456789101112131415161718192021222324252627282930313233343536373839

2、编写服务接口

public interface UserService {

    public String sayHi(String name);

    public String work(String work);

    public User getUser(User user);

}

3、添加服务实现类,并标注@webservice注解

/**
 * 标注了该@WebService注解的类的方法就变为webservice方法
 */
@WebService
public class UserServiceImpl implements UserService {

    @Override
    public String sayHi(String name) {
        return "Hi, " + name;
    }

    @Override
    public String work (String work) {
        return "He is working " + work;
    }

    @Override
    public User getUser (User user) {
        user.setName(user.getName() + "-service");
        return user;
    }
}
12345678910111213141516171819202122

4、在WEB-INF文件夹下创建webservice配置文件

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">

    <!-- 服务路径http://网站路径/ws/userService -->
    <endpoint name="userService"
              implementation="com.ws.service.impl.UserServiceImpl"
              url-pattern="/ws/userService" />

</endpoints>

5、在web,xml中添加WSServlet,servlet3.0也可以不添加如下配置

<?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">

    <!-- Servlet 3.0或者以上不需要配置 -->
    <servlet>
        <servlet-name>jaxws</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jaxws</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>

</web-app>
123456789101112131415161718

调用和之前一样

9 在Spring中使用webservice

1、导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ws</groupId>
    <artifactId>05-ws-spring-web-server</artifactId>
    <version>1.0.0</version>

    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.13.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.jvnet.jax-ws-commons.spring</groupId>
            <artifactId>jaxws-spring</artifactId>
            <version>1.9</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
12345678910111213141516171819202122232425262728293031323334353637383940

2、编写服务接口
3、编写接口的实现类,并添加@webservice注解,需要让spring将该类加载为一个bean,所以需要加上@servcice或者@Component注解

/**
 * 标注了该@WebService注解的类的方法就变为webservice方法
 */
@Component
@WebService
public class UserServiceImpl implements UserService {

    @Override
    public String sayHi(String name) {
        return "Hi, " + name;
    }

    @Override
    public String work (String work) {
        return "He is working " + work;
    }

    @Override
    public User getUser (User user) {
        user.setName(user.getName() + "-service");
        return user;
    }
}
1234567891011121314151617181920212223

4、添加spring配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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.xsd">

    <import resource="applicationContext-jaxws.xml"/>

</beans>

5、配置spring的jax-ws配置文件

<?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:ws="http://jax-ws.dev.java.net/spring/core"
       xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsd
        http://jax-ws.dev.java.net/spring/servlet http://jax-ws.dev.java.net/spring/servlet.xsd">

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

    <!-- 绑定webservice地址,需要与web.xml的地址对应 -->
     <!-- 访问:http://localhost:8080/webservice-server-spring-web//ws/userService"?wsdl -->
    <!--alt + enter-->
    <wss:binding url="/ws/userService">
        <wss:service>
            <ws:service bean="#userServiceImpl" />
        </wss:service>
    </wss:binding>

</beans>
1234567891011121314151617181920212223

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">

    <!-- needed for ContextLoaderListener -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!-- Bootstraps the root web application context before servlet initialization -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- 用于配置地址栏请求路径 -->
    <servlet>
        <servlet-name>JaxWsServlet</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSSpringServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>JaxWsServlet</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>

</web-app>
12345678910111213141516171819202122232425262728

调用和之前一样

转自https://blog.csdn.net/qq_43842093/article/details/123079151

分类
未分类

服务器意外断电MySQL/Mariadb无法启动日志解决办法

错误信息:2022-04-10 9:58:30 0 [ERROR] InnoDB: Missing FILE_CHECKPOINT at 80579362363 between the checkpoint 80579362363 and the end 80579362304

解决办法:

mv ib_logfile0 ib_logfile0.bak

摘自http://www.22vd.com/70779.html