1、在web-info目录下新建目录wsdl

2、在1步的目录下

新建文件user.wsdl

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://service.zttc.edu.cn"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
name="UserService"
targetNamespace="http://service.zttc.edu.cn"> <!-- wrappered推荐使用的方式 -->
<wsdl:types>
<xsd:schema targetNamespace="http://service.zttc.edu.cn">
<xsd:include schemaLocation="user.xsd"></xsd:include>
</xsd:schema>
</wsdl:types> <wsdl:message name="licenceInfo">
<wsdl:part name="licenceInfo" element="tns:licenceInfo"></wsdl:part>
</wsdl:message> <wsdl:message name="UserException">
<wsdl:part name="fault" element="tns:UserException"></wsdl:part>
</wsdl:message> <wsdl:message name="add">
<wsdl:part element="tns:add" name="parameters"/>
</wsdl:message>
<wsdl:message name="addResponse">
<wsdl:part element="tns:addResponse" name="parameters"/>
</wsdl:message> <wsdl:message name="delete">
<wsdl:part element="tns:delete" name="parameters"/>
</wsdl:message>
<wsdl:message name="deleteResponse">
<wsdl:part element="tns:deleteResponse" name="parameters"/>
</wsdl:message> <wsdl:message name="list">
<wsdl:part element="tns:list" name="parameters"/>
</wsdl:message>
<wsdl:message name="listResponse">
<wsdl:part element="tns:listResponse" name="parameters"/>
</wsdl:message> <wsdl:message name="login">
<wsdl:part element="tns:login" name="parameters"/>
</wsdl:message>
<wsdl:message name="loginResponse">
<wsdl:part element="tns:loginResponse" name="parameters"/>
</wsdl:message> <wsdl:message name="upload">
<wsdl:part element="tns:upload" name="parameters"/>
</wsdl:message>
<wsdl:message name="uploadResponse">
<wsdl:part element="tns:uploadResponse" name="parameters"/>
</wsdl:message> <wsdl:portType name="IUserService">
<wsdl:operation name="add">
<wsdl:input message="tns:add"/>
<wsdl:output message="tns:addResponse"/>
<wsdl:fault name="UserException" message="tns:UserException"></wsdl:fault>
</wsdl:operation> <wsdl:operation name="delete">
<wsdl:input message="tns:delete"/>
<wsdl:output message="tns:deleteResponse"/>
<wsdl:fault name="UserException" message="tns:UserException"></wsdl:fault>
</wsdl:operation> <wsdl:operation name="list">
<wsdl:input message="tns:list"/>
<wsdl:output message="tns:listResponse"/>
</wsdl:operation> <wsdl:operation name="login">
<wsdl:input message="tns:login"/>
<wsdl:output message="tns:loginResponse"/>
<wsdl:fault name="UserException" message="tns:UserException"></wsdl:fault>
</wsdl:operation> <wsdl:operation name="upload">
<wsdl:input message="tns:upload"/>
<wsdl:output message="tns:uploadResponse"/>
<wsdl:fault name="UserException" message="tns:UserException"></wsdl:fault>
</wsdl:operation>
</wsdl:portType> <wsdl:binding name="userServiceSOAP" type="tns:IUserService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="add">
<wsdl:input>
<soap:body use="literal"/>
<soap:header use="literal" part="licenceInfo" message="tns:licenceInfo"></soap:header>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="UserException">
<soap:fault name="UserException" use="literal"/>
</wsdl:fault>
</wsdl:operation> <wsdl:operation name="delete">
<wsdl:input>
<soap:body use="literal"/>
<soap:header use="literal" part="licenceInfo" message="tns:licenceInfo"></soap:header>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="UserException">
<soap:fault name="UserException" use="literal"/>
</wsdl:fault>
</wsdl:operation> <wsdl:operation name="list">
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation> <wsdl:operation name="login">
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="UserException">
<soap:fault name="UserException" use="literal"/>
</wsdl:fault>
</wsdl:operation> <wsdl:operation name="upload">
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding> <wsdl:service name="UserService">
<wsdl:port binding="tns:userServiceSOAP" name="UserServicePort">
<soap:address location="http://localhost:8080/07_soa/us"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

user.xsd的文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://service.zttc.edu.cn"
xmlns:tns="http://service.zttc.edu.cn"
elementFormDefault="qualified"> <xsd:element name="add" type="tns:add"></xsd:element>
<xsd:element name="addResponse" type="tns:addResponse"></xsd:element>
<xsd:element name="delete" type="tns:delete"></xsd:element>
<xsd:element name="deleteResponse" type="tns:deleteResponse"></xsd:element>
<xsd:element name="list" type="tns:list"></xsd:element>
<xsd:element name="listResponse" type="tns:listResponse"></xsd:element>
<xsd:element name="login" type="tns:login"></xsd:element>
<xsd:element name="loginResponse" type="tns:loginResponse"></xsd:element>
<xsd:element name="UserException" type="tns:UserException"></xsd:element>
<xsd:element name="licenceInfo" type="tns:licenceInfo"></xsd:element>
<xsd:element name="upload" type="tns:upload"></xsd:element>
<xsd:element name="uploadResponse" type="tns:uploadResponse"></xsd:element> <xsd:complexType name="uploadResponse">
<xsd:sequence/>
</xsd:complexType>
<!-- 文件上传的byte类型 -->
<xsd:complexType name="upload">
<xsd:sequence>
<xsd:element name="file" type="xsd:base64Binary"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="licenceInfo">
<xsd:sequence>
<xsd:element name="registerUser" type="tns:user"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="UserException">
<xsd:sequence>
<xsd:element name="message" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType> <xsd:complexType name="add">
<xsd:sequence>
<xsd:element name="user" type="tns:user"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="addResponse">
<xsd:sequence/>
</xsd:complexType> <xsd:complexType name="delete">
<xsd:sequence>
<xsd:element name="username" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="deleteResponse">
<xsd:sequence/>
</xsd:complexType> <xsd:complexType name="list">
<xsd:sequence/>
</xsd:complexType>
<xsd:complexType name="listResponse">
<xsd:sequence minOccurs="1" maxOccurs="unbounded">
<xsd:element name="user" type="tns:user"/>
</xsd:sequence>
</xsd:complexType> <xsd:complexType name="login">
<xsd:sequence>
<xsd:element name="username" type="xsd:string"/>
<xsd:element name="password" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="loginResponse">
<xsd:sequence>
<xsd:element name="user" type="tns:user"/>
</xsd:sequence>
</xsd:complexType> <xsd:complexType name="user">
<xsd:sequence>
<xsd:element name="username" type="xsd:string"/>
<xsd:element name="password" type="xsd:string"/>
<xsd:element name="nickname" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType> </xsd:schema>

3、修改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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<listener>
<listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener> <servlet>
<servlet-name>UserService</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>UserService</servlet-name>
<url-pattern>/us</url-pattern>
</servlet-mapping>
</web-app>

4、在web-info下新建文件sun-jaxws.xml

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint name="UserService"
implementation="cn.edu.zttc.service.UserServiceImpl" url-pattern="/us"/>
</endpoints>

5、使用wsimport命令生成服务端的服务接口类

6、编写服务端接口类

package cn.edu.zttc.service;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List; import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.soap.MTOM; import org.zttc.dao.UserDao;
import org.zttc.dao.UserException;
import org.zttc.vo.User; import com.sun.xml.ws.api.message.Header;
import com.sun.xml.ws.api.message.HeaderList;
import com.sun.xml.ws.developer.JAXWSProperties; @WebService(endpointInterface="cn.edu.zttc.service.IUserService",
wsdlLocation="WEB-INF/wsdl/user.wsdl",
serviceName="UserService",
portName="UserServicePort",
targetNamespace="http://service.zttc.edu.cn")
@MTOM
public class UserServiceImpl implements IUserService {
private UserDao userDao = UserDao.newInstance(); //注入webservice的上下文对象

@Resource
private WebServiceContext ctx; @Override
public void add(User user) throws UserException {
checkRegister();
userDao.add(user);
} private void checkRegister() throws UserException {
try {
HeaderList headers = (HeaderList)ctx.getMessageContext().get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY);
QName qname = new QName("http://service.zttc.edu.cn","licenceInfo");
if(headers==null) throw new UserException("该功能需要进行权限控制");
Header header = headers.get(qname,true);
if(header==null) throw new UserException("该功能需要进行权限控制");
XMLStreamReader xsr = header.readHeader();
User u = x2user(xsr);
User tu = userDao.loadByUsername(u.getUsername());
if(tu==null) throw new UserException("你所使用的用户不是系统的授权用户");
if(!tu.getPassword().equals(u.getPassword()))
throw new UserException("授权用户的密码信息不正确!");
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
private User x2user(XMLStreamReader xsr) throws XMLStreamException {
User u = new User();
while(xsr.hasNext()) {
int event = xsr.next();
if(event==XMLEvent.START_ELEMENT) {
String name = xsr.getName().toString();
if(name.equals("username")) {
u.setUsername(xsr.getElementText());
} else if(name.equals("password")) {
u.setPassword(xsr.getElementText());
} else if(name.equals("nickname")) {
u.setNickname(xsr.getElementText());
}
}
}
return u;
} @Override
public void delete(String username) throws UserException {
checkRegister();
userDao.delete(username);
} @Override
public List<User> list() {
return userDao.list();
} @Override
public User login(String username, String password) throws UserException {
return userDao.login(username, password);
} @Override
public void upload(byte[] file) {
FileOutputStream fos = null;
System.out.println(file);
try {
fos = new FileOutputStream("d:/webservice/1.jpg");
fos.write(file);
fos.flush(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

需要导入的jax-ws的jar包如下:

这里服务端获取header的信息的方法又多了一个,具体看上面的实现类的代码中的方法checkRegister

客户端设置heade的方式还有如下方法:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.ws.soap.MTOMFeature;
import com.sun.xml.ws.api.message.Headers;
import com.sun.xml.ws.developer.WSBindingProvider;

@Test
public void testAdd() {
try {
//1、将一个对象转换为xml通过JAXB
JAXBContext ctx = JAXBContext.newInstance(LicenceInfo.class);
User ru = new User();
ru.setNickname("超级管理");
ru.setUsername("admin");
ru.setPassword("1232323");
LicenceInfo info = new LicenceInfo();
info.setRegisterUser(ru);
QName name = new QName(ns,"licenceInfo");
JAXBElement<LicenceInfo> jele = new JAXBElement<LicenceInfo>(name,LicenceInfo.class,info);
Marshaller mars = ctx.createMarshaller();
mars.setProperty(Marshaller.JAXB_FRAGMENT,true);
mars.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); //2、转换为DOM
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
mars.marshal(jele, doc); //3、通过Headers.create方法完成header的添加
//获取WSBindingProvider
WSBindingProvider wsb = (WSBindingProvider)port;
wsb.setOutboundHeaders(Headers.create(doc.getDocumentElement())); User u = new User();
u.setNickname("张三");
u.setPassword("123");
u.setUsername("zs");
port.add(u);
}catch(Exception e) {
System.out.println(e.getMessage());
} } @Test
public void testUpload() {
try {
byte[] file = FileUtils.readFileToByteArray(new File("d:/kh/img/美女01.jpg"));
port.upload(file);
} catch (IOException e) {
e.printStackTrace();
}
}

关于附件的传输可以参考如下文章:https://www.ibm.com/developerworks/cn/webservices/ws-tip-jaxwsrpc5/

webservice系统学习笔记10-使用jax-ws创建基于tomcat类型的容器的ws服务的更多相关文章

  1. webservice系统学习笔记5-手动构建/发送/解析SOAP消息

    手动拼接SOAP消息调用webservice SOAP消息的组成: 1.创建需要发送的SOAP消息的XML(add方法为例子) /** * 创建访问add方法的SOAP消息的xml */ @Test ...

  2. webservice系统学习笔记1-使用注解创建ws服务

    简单入门之helloword,具体详细的在后面的章节详细介绍. 使用JDK自带的jax-ws创建并发布一个简单的webservice 在本地创建服务,然后本机访问 1.创建服务提供接口 IMyServ ...

  3. webservice系统学习笔记9-使用契约优先的方式的一个服务端demo(隐式传Header信息)

    服务器端: 1.编写wsdl文件 <?xml version="1.0" encoding="UTF-8" standalone="no&quo ...

  4. webservice系统学习笔记7-使用handler实现过滤器/拦截器效果

    handler可以作用于客户端,也可以作用了服务端 handler分为:1.LogicalHandler:只能获取到soap消息的body. 2.SOAPHandler:可以获取SOAPMessage ...

  5. webservice系统学习笔记7-异常处理

    接口类:IMyService.java @WebResult(name="testExceptionResult") public void testException() thr ...

  6. webservice系统学习笔记2-使用jdk的命令生成本地代码

    使用jdk自带的命令wsimport生成远程服务的本地代码 C:\Documents and Settings\Administrator>wsimport -d E:\mhWorkspace\ ...

  7. webservice系统学习笔记8-简单的权限校验

    服务端handler.java package com.ws01; import java.util.Set; import javax.xml.namespace.QName; import jav ...

  8. webservice系统学习笔记6-使用soap的header传递消息

    1.显示的使用soap的header传递消息(不推荐使用,会破坏正常的代码结构,推荐使用handler处理) @WebResult(name="deleteResult") pub ...

  9. webservice系统学习笔记4-使用工具查看SOAP消息

    使用myeclipse的WTP java ee视图里的[web services Explorer]来测试查看webservice传输的SOAP消息 1. 2. 测试getUserByUsername ...

随机推荐

  1. 普天通信JavaEE开发岗面试题

    1 EJB中有几种Bean,叙述有状态Bean和无状态Bean的差别. 答:EJB中有Session Bean,Entity Bean,以及 Message Driven Bean.这两种的 Sess ...

  2. 在EntityFramework6中管理DbContext的正确方式——1考虑的关键点(外文翻译)

    (译者注:使用EF开发应用程序的一个难点就在于对其DbContext的生命周期管理,你的管理策略是否能很好的支持上层服务 使用独立事务,使用嵌套事务,并行执行,异步执行等需求? Mehdi El Gu ...

  3. ARCGIS将WGS84坐标投影到高斯平面

    将WGS84坐标投影到平面,一般採用的是UTM(通用横轴莫卡托投影).该方式多用于美国地区,而我国多用北京54和西安80高斯克吕格投影坐标.假如我们想把影像採用高斯克吕格投影到在平面上,而ARCGIS ...

  4. Oracle rac架构和原理

        Oracle RAC Oracle Real Application Cluster (RAC,实时应用集群)用来在集群环境下实现多机共享数据库,以保证应用的高可用性:同时可以自动实现并行处理 ...

  5. 转: Go -- 单例

    最近在学习Golang,想着可以就以前的知识做一些串通,加上了解到go语言也是面向对象编程语言之后.在最近的开发过程中,我碰到一个问题,要用go语言实现单例模式.本着“天下知识,同根同源”(我瞎掰的~ ...

  6. Kafka开发环境搭建(五)

    如果你要利用代码来跑kafka的应用,那你最好先把官网给出的example先在单机环境和分布式环境下跑通,然后再逐步将原有的consumer.producer和broker替换成自己写的代码.所以在阅 ...

  7. Python3.6学习笔记(五)

    网络编程 网络程序出现的比互联网要早很多,实现方式主要依靠网络上不同主机间进程的通信,通信协议最重要的是TCP/IP协议.在这两个协议基础上还有很多更高级的协议,包括HTTP.SMTP等.要进行两个主 ...

  8. C语言:通过指针函数输出二维数组中每个学生的成绩

    // //  main.c //  Pointer_function // //  Created by ma c on 15/8/2. //  Copyright (c) 2015年 bjsxt. ...

  9. 【IUML】支持向量机SVM[续]

    支持向量机基本上是最好的有监督学习算法了.看很多正统的讲法都是从VC 维理论和结构风险最小原理出发,然后引出SVM什么的,还有些资料上来就讲分类超平面什么的.我们logistic回归出发,引出了SVM ...

  10. C++ 全排列函数 std::next_permutation与std::prev_permutation

    C++ STL中提供了std::next_permutation与std::prev_permutation可以获取数字或者是字符的全排列,其中std::next_permutation提供升序.st ...