新手学习Axis1过程中的一点理解

本文详细介绍Axis框架下的WebService部署及调用方法,包括DII和Stubs两种方式,并涉及环境变量配置、库引入等内容。

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

本文例子代码来源于网上,感谢代码作者!

 

<一>引入库以及添加环境变量

对于有时只需要将库导入工程,有时又需要将库加入环境变量Classpath中,感到很迷惑,为什么有的只引入工程就可以,有的就需要加入环境变量?

学习过程中稍微理解了一些:

1、当引入jar包到某个工程后,引入的库也只是在这个工程有效

2、将库的路径加入环境变量,这样就成了系统变量,当某些程序需要找寻库文件(例如include <>只去系统目录查找 ,而双引号“”则会先去当前目录找,找不到再去系统目录),如果为这个库设置了环境变量,则可以直接引用,就类似于系统库

 

库加入环境变量后可以直接在DOS调用

 

<二>axis开发webservice

Axis支持三种web service的部署和开发,分别为:
1、Dynamic Invocation Interface ( DII)
2、Stubs方式
3、Dynamic Proxy方式

 

只选择了前面2种方法来操作

 

DII方式

1、编写一个类,例如

public class SayHello{                 

public String say(String name){
                        return " Hello ~~" + name;
                    }
                }

然后将这个类保存成SayHello.JWS,然后放到tomcat的webapps的axis,然后运行tomcat,访问http://localhost:8080/axis/SayHello.jws,这个站点就是服务器端的webservice

 

2、编写客户端访问它

访问客户端webservice也可以有2种创建方式

(1)创建一个Java Project,并在src创建一个类,取名ToClient.java

  import org.apache.axis.client.Call;
          import org.apache.axis.client.Service;
  public class ToClient {
                public static void main(String args[]) throws Exception {
                           String urlname = "
http://localhost:8080/axis/SayHello.jws";
                            //这是wsdl的绝对路径.也可以直接写成如下 ,这个没有区别.
                           Service s = new Service();
                            Call call = (Call)s.createCall();
                          call.setOperationName("say");//注意。这里是要调用的方法名
                          call.setTargetEndpointAddress(urlname);//设置调用的目标url
                           String val = (String)call.invoke(new Object[]{"我是Blue’s Boy!"}); //设置调用方法中的参数
                           System.out.println("这是webservice服务器返回给你的:>>>>"+val);
 
                     }
               }

然后引入库,右键工程build path->add externel archives->然后找到axis下lib内的库

右键工程run as->java application,双击它,Main class里选择Toclient,然后运行就可以看到返回结果

 

(2)创建一个文本文件,将代码写入,保存成ToClient.java,放到任意目录,比如c盘,然后运行cmd,然后到保存ToClient.java的目录,

然后javac ToClient.java编译成类文件ToClient.class,然后执行java ToClient (如果需要端口-p8080),然后就可以看到返回的结果了

 

Stubs方式

1、创建一个web Project,然后将axis的lib复制到工程的lib以及web.xml覆盖工程的web.xml

2、写一个简单的服务器类

public class SayHello { 

     public String say(String name){
                        return " Hello ~~" + name;
                    }
                }

3、新建一个deploy.wsdd文件,内容为

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
           xmlns:java="
http://xml.apache.org/axis/wsdd/providers/java">
<service name="stubs" provider="java:RPC">

<parameter name="className" value="SayHello"/>

<parameter name="allowedMethods" value="*"/>

 

 </service>
</deployment>

注:deploy.wsdd中的service name="stubs"可以换成自己想要的名字,server-config.wsdd这个文件内包含的就是webservice上看到的这些服务,所以如果想去掉某个服务,只要去掉server-config.wsdd中的对应的<service></service>就可以

 

4、然后将这个工程发布到tomcat的webapps下,操作步骤:右键工程->myeclipse->add and remove project deployment->add,然后选择之前配置好的tomcat,然后点ok,工程就发布到了tomcat的webapps下

5、进入cmd,然后进入到tomcat的webapps下的刚新发布的工程文件下的web-inf文件,然后输入

java org.apache.axis.client.AdminClient -l http://localhost:8080/axis_example/services/stubs deploy.wsdd

调用AdminClient这个类将deploy.wsdd的service服务stubs发布到http://localhost:8080/axis_example/services站点

并创建更新axis站点的默认发布文件service-config.wsdd,这个service-config.wsdd就是webservice服务默认读取的发布文件

 

 6.webservice站点服务就发布完成,读取流程为

tomcat是一个jsp/servlet容器,创建web工程,都会有web.xml.此时web.xml只是最基础的web站点配置,将axis的lib以及web.xml拷贝到工程,就相当于引入了axis框架,(添加struts框架也是这样,就是引入struts相关的库以及配置web.xml),这个站点一运行就读取web.xml以及引用需要的库,读取配置创建axis的Servlet,它引用的servlet类是org.apache.axis.transport.http.AxisServlet,设置拦截的类型,当客户访问http://localhost:8080/axis_sample/services,跟struts的.do一样,axis只要访问是/services,*.jws,/servlet/AxisServlet,则Servelet就会拦截下来进行处理,读取service-config.wsdd配置,显示发布的服务的wsdl

当客户端访问wsdl文件时,知道是以什么协议,什么类型的方法以及参数进行调用,然后就发送合适的soap请求,由axisServlet处理后返回soap消息,客户端根据wsdl来解析

 

soap是simple object access protocol简单对象访问协议,客户需要这个soap协议来调用公共服务

wsdl是web service decription language web服务描述语言,用于一套标准的方法向外界描述它提供的服务

 

7.写一个类来调用测试发布的webservice 服务

import org.apache.axis.client.Call;
          import org.apache.axis.client.Service;
  public class ToClient {
                public static void main(String args[]) throws Exception {
 
                           String urlname = "
http://localhost:8080/axis_simple/services/stubs?wsdl";
                            //这是wsdl的绝对路径.也可以直接写成如下 ,这个没有区别.
//String urlname=”http://localhost:8080/axis/SayHello.jws?wsdl”
                           Service s = new Service();
 
                            Call call = (Call)s.createCall();
 
                          call.setOperationName("say");//注意。这里是要调用的方法名
 
                          call.setTargetEndpointAddress(urlname);//设置调用的目标url
 
                           String val = (String)call.invoke(new Object[]{"我是Blue’s Boy!"});                  //设置调用方法中的参数
 
                           System.out.println("这是webservice服务器返回给你的:>>>>"+val);
 
                     }
               }

 

注:如果使用到javabean,一个自定义的对象当作参数传递,那么需要在deploy.wsdd在发布服务的时添加一个<typeMapping>来映射类型,作用是序列化参数,就在deploy.wsdd加入:

<typeMapping 
  deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encodingStyle=
http://schemas.xmlsoap.org/soap/encoding/
            qname="ns1:user"
       serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        type="java:com.web.test.UserBean"
        xmlns:ns1="urn:BeanService"
 />

cmd调用java org.apache.axis.client.AdminClient -l http://localhost:8080/axis_simple/services/stubs deploy.wsdd后有一点不同,就是service-config.wsdd里的<service>增加了下面这行代码:

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" qname="ns1:user" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" type="java:com.web.test.UserBean" xmlns:ns1="urn:BeanService"/>

站点也发布成功,但是当你测试时,会出错,这是因为服务器端类使用javabean进行了类型序列化的映射后,不允许访问,这就是封装性,为了访问它,需要将webservice的服务类生成可提供调用的接口,进入cmd,进入到工程的web-inf目录,然后:

java org.apache.axis.wsdl.WSDL2Java –p client http://localhost:8080/axis_simple/services/stubs?wsdl

就是将服务映射成接口,并将这些接口类放在client文件夹中,客户需要调用的时候,只需要在将client文件夹复制到工程中就可以。


 

<think>好的,用户需要在一台没有GPU的Windows电脑上使用MobileNet进行图像分类,而且希望数据集小一点。他们打算用Anaconda,但对它不熟悉,所以需要详细的步骤指导,包括各种命令的正确结果。首先,我得理清楚整个流程,确保步骤清晰,适合新手。 首先,安装Anaconda。用户可能已经安装了,但需要确认。如果没有,要指导下载和安装,注意添加到PATH环境变量的问题,可能会遇到问题,需要提醒他们勾选那个选项。然后,创建虚拟环境,这是关键,因为不同项目可能需要不同的包版本,避免冲突。这里要给出具体的命令,比如conda create,然后激活环境。 接下来,安装必要的库。TensorFlow是必须的,但因为没有GPU,所以安装CPU版本。用户可能会疑惑是否要装GPU版,但这里明确说明不需要。然后是Keras,因为MobileNet在Keras中容易调用。还有pillow处理图像,numpy和matplotlib这些基础库。需要给出pip install命令,并说明可能的输出,比如成功安装的提示。 然后处理数据集。用户想要小数据集,CIFAR-10是个不错的选择,但只有60k张32x32的图片,可能不适合MobileNet的输入尺寸。不过Keras内置了,方便加载。可能需要调整图像大小到224x224。这里要解释数据预处理步骤,包括归一化和reshape操作。同时,可能需要提醒用户如果使用自己的数据集,需要如何组织目录结构,比如train和test子目录,每个类别一个文件夹。 构建模型部分,使用Keras的MobileNet模型,include_top=False可以去掉全连接层,然后添加自己的全局平均池化层和全连接层。要解释为什么这么做,即迁移学习,利用预训练权重,但适应自己的分类任务。编译模型时,选择Adam优化器和稀疏分类交叉熵损失函数,适合多分类问题。 训练模型时,因为数据集小,epochs可能不需要太多,比如10个周期。要提到batch_size根据内存调整,如果内存不足,可以调小。训练过程中会显示loss和accuracy的变化,正常情况loss应该逐渐下降,accuracy上升。如果出现波动或过拟合,可能需要调整学习率或增加数据增强。 评估模型部分,用测试集评估,输出准确率。然后保存模型,方便后续使用。预测部分,演示如何加载模型并对单张图片进行预测,需要预处理步骤,如调整尺寸、归一化等。这里要给出示例代码,并解释每个步骤的作用。 可能遇到的问题:安装包时网络问题导致下载慢或失败,建议换源。训练时内存不足,需要调整batch_size或减小图像尺寸。MobileNet输入尺寸是224x224,必须保持一致。如果用户想用自己的数据,需要指导如何组织数据集,可能用到ImageDataGenerator和flow_from_directory方法。 需要确保所有命令和步骤都是正确的,适合Windows环境,路径的反斜杠要注意转义。同时,解释每个步骤的目的,帮助用户理解为什么这么做,而不仅仅是按步骤操作。例如,虚拟环境的作用,迁移学习的优势,预处理的重要性等。 最后,检查整个流程是否完整,从环境搭建到训练、评估、保存和预测,覆盖整个项目流程。确保用户即使没有GPU也能顺利运行,可能需要提醒训练时间可能较长,但数据集小的话应该可以接受。如果有任何步骤可能出错,提前给出解决方案,比如安装失败的处理办法,或者常见错误提示的应对方法。</think>以下是在Windows系统使用Anaconda搭建MobileNet图像分类模型的详细步骤: --- ### 一、安装Anaconda 1. 下载安装包: 访问[Anaconda官网](https://www.anaconda.com/download),选择Python 3.9版本的Windows 64位安装包 2. 安装过程注意: ✅ 勾选"Add Anaconda3 to my PATH environment variable"(需管理员权限) ✅ 安装完成后重启CMD/PowerShell验证: ```bash conda --version # 正确输出:conda 23.11.0(版本号可能不同) ``` --- ### 二、创建虚拟环境 ```bash conda create -n mobilenet python=3.9 conda activate mobilenet # 成功提示:(mobilenet) C:\Users\YourName> ``` --- ### 三、安装依赖库 ```bash pip install tensorflow-cpu==2.10.0 keras pillow numpy matplotlib # 预期看到 Successfully installed 相关包信息 ``` --- ### 四、准备数据集(以CIFAR-10为例) ```python from tensorflow.keras.datasets import cifar10 import numpy as np # 加载数据 (train_images, train_labels), (test_images, test_labels) = cifar10.load_data() # 调整尺寸为MobileNet要求的224x224 def resize_images(images): return np.array([tf.image.resize(img, (224,224)) for img in images]) train_images = resize_images(train_images).astype('float32') / 255.0 test_images = resize_images(test_images).astype('float32') / 255.0 print(train_images.shape) # 应输出 (50000, 224, 224, 3) ``` --- ### 五、构建MobileNet模型 ```python from tensorflow.keras.applications import MobileNet from tensorflow.keras.layers import Dense, GlobalAveragePooling2D from tensorflow.keras.models import Model # 加载预训练模型(不包含顶层) base_model = MobileNet(weights='imagenet', include_top=False, input_shape=(224,224,3)) # 添加自定义层 x = base_model.output x = GlobalAveragePooling2D()(x) x = Dense(128, activation='relu')(x) predictions = Dense(10, activation='softmax')(x) # CIFAR-10有10类 model = Model(inputs=base_model.input, outputs=predictions) # 冻结预训练层 for layer in base_model.layers: layer.trainable = False model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.summary() # 查看模型结构 ``` --- ### 六、训练模型 ```python history = model.fit(train_images, train_labels, epochs=10, batch_size=32, validation_split=0.2) # 正常训练输出示例: # Epoch 1/10 # 1250/1250 [==============================] - 215s 170ms/step - loss: 1.6924 - accuracy: 0.3948 - val_loss: 1.4623 - val_accuracy: 0.4852 ``` --- ### 七、评估与保存 ```python # 评估测试集 test_loss, test_acc = model.evaluate(test_images, test_labels) print(f'Test accuracy: {test_acc:.4f}') # 保存模型 model.save('mobilenet_cifar10.h5') ``` --- ### 八、使用模型预测(示例) ```python from tensorflow.keras.preprocessing import image import numpy as np img_path = 'test_image.jpg' img = image.load_img(img_path, target_size=(224,224)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) x = x / 255.0 preds = model.predict(x) print(f'预测结果:{np.argmax(preds)}') ``` --- ### 常见问题解决 1. **安装缓慢**:使用清华镜像源 ```bash pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名 ``` 2. **内存不足**: - 减小`batch_size`(可尝试16或8) - 在`MobileNet`初始化时添加`alpha=0.5`参数缩小模型 3. **自定义数据集**: 按以下结构组织文件夹: ``` dataset/ train/ class1/ class2/ ... test/ class1/ class2/ ... ``` 使用`ImageDataGenerator`加载: ```python from tensorflow.keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( 'dataset/train', target_size=(224,224), batch_size=32, class_mode='sparse') ``` --- 通过上述步骤,您可以在约30分钟内完成基础训练(CIFAR-10)。实际准确率可能在60-70%左右,如需提升可尝试: 1. 解冻部分卷积层进行微调 2. 增加数据增强(旋转/翻转等) 3. 增加训练轮次到20-30个epochs
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值