jsp访问web服务,axis2(webService),基于注解的完整示例

昨天有网友向我问了一个问题

大概就是说jsp如何访问web服务

我思前想后,大概他的意思是就是远程访问web服务吧

因此,我今天也就专门复习了一下我之前学习的axis2,并且成功在jsp上调用

本例是一个简要的计算器程序,计算器程序在远程的服务器上

使用了axis2来发布webService,关于axis2,您可以在本博客搜索相关的文章


下面我们就开始来一步一步的操作吧

1、创建计算器服务端(接口和实现类)

接口如下

package study.ws.jaxws.calculator;

import javax.jws.WebService;
//接口,定义加减乘除
@WebService
public interface Icalculator extends java.rmi.Remote {
    public String div(float arg0, float arg1);
    public float add(float arg0, float arg1);
    public float sub(float arg0, float arg1);
    public float mul(float arg0, float arg1);
}
实现类如下
/**
 * Calculator.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.
 */

package study.ws.jaxws.calculator;

import javax.jws.WebService;

@WebService(serviceName="calculator",endpointInterface="study.ws.jaxws.calculator.Icalculator")
public class Calculator implements Icalculator{

	@Override
	public String div(float arg0, float arg1) {
		if(arg1 == 0){
			return null;
		}else{
			return String.valueOf(arg0/arg1);
		}
	}

	@Override
	public float add(float arg0, float arg1) {
		// TODO Auto-generated method stub
		return arg0+arg1;
	}

	@Override
	public float sub(float arg0, float arg1) {
		// TODO Auto-generated method stub
		return arg0-arg1;
	}

	@Override
	public float mul(float arg0, float arg1) {
		// TODO Auto-generated method stub
		return arg0*arg1;
	}

}
简要说明下

@WebService注解表示这是一个webServlet

而里面的参数serviceName表示webServlet的名字

endpointInterface应该是远端接口,一般设置为服务器接口,大家请自行去测试

2、打包并发布

右键点击项目选择我们需要打包的包名,打包成jar

然后将这个jar放到tomcat的这个路径下

Tomcat 8.0\webapps\axis2\WEB-INF\servicejars

注意路径一定要正确

3、运行我们的tomcat,并且打开axis2的页面

http://localhost:8080/axis2/  axis2首页

http://localhost:8080/axis2/services/listServices   服务列表页

在服务列表页就可以看到我们刚刚发布的服务


[caption id="attachment_1317" align="alignnone" width="377"]WebService服务列表 WebService服务列表[/caption]

可以看到这个服务有4个方法

我们可以点击calculator这个连接,可以查看wsdl描述

http://localhost:8080/axis2/services/calculator?wsdl

4、创建我们的客户端

这里我们这样创建

首先创建一个web项目

再在web项目处点击右键选择创建一个webservice client


[caption id="attachment_1318" align="alignnone" width="620"]创建webService Client 创建webService Client[/caption]


如上图所示,axis2Calculator是我们后面创建的web项目,我在这里点击的右键的,然后选择的创建webService Client

然后在 Service definition 里面键入我们刚刚的wsdl描述文件的url地址

然后点击下一步

你会发现输出文件夹 output folder  是不可更改,并且这个文件夹就是我们当前web项目的src目录

好了,您直接点完成吧

此时客户端就创建好了

在src目录下就会自动生成一个包 study.ws.jaxws.calculator,包里有一些java文件,这些文件就是我们远程调用的,并且他也在web-inf下面的lib目录里自动为我们保存了所需要的jar包环境

如下图所示


[caption id="attachment_1319" align="alignnone" width="297"]webService 客户端 webService 客户端[/caption]

5、创建我们的工具类,包 study.ws.jaxws.util 下有一个工具类

这个工具类主要是用于获得一个代理对象,代码很简单,代码如下:


import study.ws.jaxws.calculator.Icalculator;
import study.ws.jaxws.calculator.IcalculatorProxy;

public final class Calculator {
	private static Icalculator icalculatorProxy = new IcalculatorProxy();
	
	public final static Icalculator getCalculator(){
		return icalculatorProxy;
	}
}
6,创建一个servlet,包名是 study.ws.jaxws.servlet


servlet用于接收参数,并计算,代码如下


package study.ws.jaxws.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import study.ws.jaxws.util.Calculator;

public class ServletCalculator extends HttpServlet{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
		doPost(request,response);
	}
	public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException{
		float arg0 = Float.parseFloat(request.getParameter("arg0"));
		String iden = request.getParameter("iden");
		float arg1 = Float.parseFloat(request.getParameter("arg1"));
		PrintWriter pw =  response.getWriter();
		if(iden.equals("+")){
			pw.print(Calculator.getCalculator().add(arg0, arg1));
		}
		if(iden.equals("-")){
			pw.print(Calculator.getCalculator().sub(arg0, arg1));
		}
		if(iden.equals("*")){
			pw.print(Calculator.getCalculator().mul(arg0, arg1));
		}
		if(iden.equals("/")){
			pw.print(Calculator.getCalculator().div(arg0, arg1));
		}
	}
}
servlet一共需要获得三个参数,两个float型的数。和一个字符串类型的数


然后通过工具类获得代理对象,通过代理对象执行相应的加减乘除方法

7、简单的配置我们的web.xml


<?xml version="1.0" encoding="UTF-8" ?>
<web-app version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLScbema-instance"
	xsi:xchemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	<!-- 配置calculator -->
	<servlet>
		<servlet-name>calculator</servlet-name>
		<servlet-class>study.ws.jaxws.servlet.ServletCalculator</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>calculator</servlet-name>
		<url-pattern>/calculator</url-pattern>
	</servlet-mapping>
</web-app>
8、创建我们的index.jsp文件,完整的代码如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>简要计算器</title>
<script type="text/javascript" src='js/jquery-1.11.3.js'></script>
<style type="text/css">
input {
	width:70px;
}
</style>
<script type="text/javascript">
	$(function (){
		
	$("#jg").click(function() {
			if ($("#arg0").val() == "" || $("arg1").val() == "") {
				alert("抱歉,参数不能为空");
			} else if(isNaN($("#arg0").val()) || isNaN($("#arg1").val())){
				alert("抱歉,参数必须为数字");
			}else {
				alert($("#iden option:selected").val());
				$.post("/axis2Calculator/calculator", {
					"arg0" : $("#arg0").val(),
					"iden" : $("#iden option:selected").val(),
					"arg1" : $("#arg1").val()
				}, function(data) {
					$("#jg").val(data);
				})
			}
		})
		$("#arg0").click(function(){
			$("#jg").val("点击计算");
		});
		$("#arg0").click(function(){
			$("#jg").val("点击计算");
		});
		$("#iden").click(function(){
			$("#jg").val("点击计算");
		});
	});
	function gaibian(v){
		$("#jg").val("点击计算");
	}
</script>
</head>
<body>
<input name="arg0" id="arg0" type="text">
<select name="iden" id="iden" onChange="gaibian(this)">
	<option value="+">+</option>
	<option value="-">-</option>
	<option value="*">*</option>
	<option value="/">/</option>
</select>
<input name="arg1" id="arg1" type="text"> =
<input name="jg" id="jg" type="button" value="点击计算">
</body>
</html>
9,将这个项目部署到tomcat中,然后运行tomcat

为什么要部署到tomcat,而不直接在eclipse中运行呢

主要是我们的服务端和本地端都在同一台电脑上,eclipse用tomcat是8080对端,会和tomcat本身的8080端口冲突

这个可能有办法处理,不过我这里不是重点

所以将我们这个计算器项目部署到tomcat中

此时我们运行tomcat,就运行了以下3个服务

第一个是,我们的计算器项目

第二个是,axis2项目

第三个是,部署到axis2中的计算器服务端项目

10、测试

打开我们的项目地址,然后输入参数点击计算即可


[caption id="attachment_1320" align="alignnone" width="372"]简要计算器webService 简要计算器webService[/caption]

爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img