Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разработка веб-сервисов, Часть 2 
:(
    Опции темы
tux
Дата 15.9.2005, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Предлагаю альтернативный способ разработки веб-сервисов в сравнении с тем, что предлагал Domestic Cat в статье Веб-сервис на Java.
1. Что нужно для работы
Нужен Axis (у меня версия 1.2.1), Xerces (2.4.0), Jakarta Ant, какой-нибудь веб-контейнер. Изначальная цель – сделать все удобным для разработки, поэтому организуем весь код аккуратно по каталогам, пишем скрипт для Ant, который выполняет всю работу от компиляции до сборки приложения.
2. Создаем структуру каталогов
У меня весь проект организован таким образом:
  • bin – каталог, куда будут складывать откомпилированные классы
  • generate/wsdl – каталог, куда будут складываться файлы описания веб-сервиса (wsdl)
  • lib – нужные библиотеки
  • src/java – исходный код веб-сервиса
  • src/xml – xml-файлы, необходимые для развертывания приложения
  • target – каталог, куда будет собираться war веб-приложения
В каталог lib копируем нужные библиотеки из lib дистрибутива axis. У меня каталог lib выглядит следующим образом:
Код

bash-3.00$ ls -l
итого 3244
-rw-r--r-- 1 dan users 33506   2005-06-15 11:28  axis-ant.jar
-rw-r--r-- 1 dan users 1604162 2005-06-15 11:44  axis.jar
-rw-r--r-- 1 dan users 71442   2005-06-15 11:28  commons-discovery-0.2.jar
-rw-r--r-- 1 dan users 38015   2005-06-15 11:28  commons-logging-1.0.4.jar
-rw-r--r-- 1 dan users 32071   2005-06-15 11:28  jaxrpc.jar
-rw-r--r-- 1 dan users 352668  2005-06-15 11:28  log4j-1.2.8.jar
-rw-r--r-- 1 dan users 941     2005-06-15 11:28  log4j.properties
-rw-r--r-- 1 dan users 19427   2005-06-15 11:28  saaj.jar
-rw-r--r-- 1 dan users 126771  2005-06-15 11:28  wsdl4j-1.5.1.jar
-rw-r--r-- 1 dan users 895813  2004-09-06 08:06  xerces-2.4.0.jar
-rw-r--r-- 1 dan users 123705  2004-09-06 08:06  xml-apis.jar

3. Написание сборщика проекта
В корневом каталоге проекта создаем файл build.xml для Jakarta Ant, который и будет заниматься сборкой проекта. У меня файл имеет следующий вид:
Код

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="all" name="WebService">

    <target name="init">
        <property environment="env"/>
        <property file="ant.properties"/>
        <property name="wsdl.generate.dir" value="generate/wsdl" />
        <property name="java.generate.dir" value="src/java" />
        <property name="class.dir" value="./bin" />
        <property name="java.src.dir" value="interfaces/java" />
        <property name="xml.src.dir" value="src/xml" />
        <property name="target.dir" value="target" />
        <property name="war.name" value="testing-remote.war" />
        <property name="war.target" value="${target.dir}/${war.name}" />
        <property name="java.home" value="${env.JAVA_HOME}" />
        <property name="lib.dir" value="lib" />

        <path id="webservices.path">
            <fileset dir="${lib.dir}">
                <include name="*.jar" />
            </fileset>
            <pathelement path="${class.dir}"/>
        </path>

        <mkdir dir="${class.dir}"/>
        <mkdir dir="${target.dir}"/>
    </target>

    <target name="define-tasks" depends="init">
        <taskdef resource="axis-tasks.properties" classpathref="webservices.path" />
    </target>

    <target name="compile" depends="init">
        <javac destdir="${class.dir}" classpathref="webservices.path" debug="on">
            <src path="${java.generate.dir}"/>
            <include name="**/*.java"/>
        </javac>
    </target>

    <target name="generate-wsdd" depends="init, define-tasks">
        <antcall target="compile"/>

        <!-- Интерфейс TestWorker -->
        <property name="test.worker.service" value="TestWorker" />
        <axis-java2wsdl 
            classname="ru.esstu.testing.remote.TestWorker"
            classpathref="webservices.path"
            location="http://localhost:8080/${webapp.name}/services/${test.worker.service}"
            namespace="urn:${test.worker.service}"
            output="${wsdl.generate.dir}/${test.worker.service}.wsdl"
        />

        <axis-wsdl2java 
                output="${java.generate.dir}"
                verbose="on" 
                skeletondeploy="on" 
                serverside="on" 
                helpergen="on" 
                url="${wsdl.generate.dir}/${test.worker.service}.wsdl"
                implementationclassname="ru.esstu.testing.remote.TestWorker">
            <mapping
                  namespace="urn:${test.worker.service}"
                  package="ru.esstu.testing.remote.worker.stub" />
        </axis-wsdl2java>

        <echo message="Generating server deployer..." />

        <java classname="org.apache.axis.utils.Admin" 
            fork="true" dir="."
            classpathref="webservices.path">
            <arg value="server" />
            <arg
                value="${java.generate.dir}/ru/esstu/testing/remote/worker/stub/deploy.wsdd"
            />
        </java>
    </target>

    <target name="clean" depends="init">
        <delete file="${war.target}"/>
        <delete dir="${class.dir}"/>
    </target>

    <target name="pack-it" depends="init, generate-wsdd">
        <antcall target="compile"/>
        <delete file="${war.target}"/>
        <war destfile="${war.target}" webxml="${xml.src.dir}/web.xml">
            <lib dir="${lib.dir}">
                <include name="*.jar" />
            </lib>
            <classes dir="${class.dir}"/>
            <webinf dir=".">
                <include name="*.wsdd" />
            </webinf>
        </war>
        <delete file="server-config.wsdd"/>
    </target>

    <target name="release">
        <antcall target="clean" />
        <antcall target="compile-non-debug"/>
        <antcall target="pack-it"/>
    </target>

    <target depends="pack-it"name="all">
    </target>

</project>

Здесь цель init определяет набор используемых свойств. Цель define-tasks определяет тэги Axis, которые можно использовать внутри скриптов Ant, для того чтобы они работали нужна библиотека axis-ant.jar, входящая в состав Axis. В результате выполнения taskdef определятся три тэга – axis-java2wsdl, axis-wsdl2java и axis-admin, которые можно использовать для генерации разных нужных файликов. Цель compile используется для компиляции исходных и сгенерированных классов. Цель pack-it собирает все, что сгенерировано и написано в веб-приложение.
4. Процедура разработки веб-сервиса
Для того, чтобы было понятно что происходит в цели generate-wsdd опишу выбранную процедуру разработки. Описана она в документации по Axis и включает в себя следующие этапы:
  • пишем класс, который нужно будет сделать веб-сервисом. Сигнатуры публичных методов будут определять интерфейс веб-сервиса
  • из класса генерируем wsdl-документ, описывающий веб-сервис
  • из wsdl-документа генерируем серверные и клиентские заглушки и интерфейсы, а также дескрипторы развертывания веб-сервиса
  • генерируем из полученных дескрипторов серверный дескриптор развертывания веб-сервисов
  • собираем веб-приложение и деплоим его на веб-контейнере
Пункты 2-5 здесь выполняются build.xml.
Тэг axis-java2wsdl генерирует документ WSDL. В тэге определены такие атрибуты: classname – класс, для которого генерируется WSDL, classpathref – ссылка на переменную описания class-path в цели init, location – местоположение веб-сервиса, namespace – пространство имен, в котором находится веб-сервис и, наконец, output – файл WSDL, который должен получиться. Для генерации тэг испольет откомпилированный класс, поэтому компиляция в проекте вызывается дважды – перед генерацией WSDL (генерация должна основываться на актуальной информации) и перед сборкой веб-приложения.
Тэг axis-wsdl2java генерирует заглушки, интерфейсы и дескрипторы развертывания. Атрибуты означают следующее: output – каталог, куда будут генерироваться файлы, skeletondeploy, serverside, helpergen определяют что имеенно будет сгенерировано, url – ссылка на WSDL-файл, используемые для генерации, implementationclassname – имя класса реализации вебсервиса. На последнем остановлюсь подробнее. Если задать этот атрибут, Axis не будет перегенерировать класс реализации, соответственно, в противном случае ситуация чревата потерей изменений в классе. Тэг mapping внутри axis-wsdl2java определяет как пространства имен отражены на пакеты Java и, следовательно, то, в каком пакете окажутся сгенерированные файлы.
Далее запускается класс org.apache.axis.utils.Admin, который использует дескриптор развертывания deploy.wsdd для создания серверного дескриптора и который по какой-то причине не описан в документации. Ему передаются следующие параметры: «server» говорит о необходимости генерации серверного дескриптора, следующий далее дескриптор веб-сервиса используется для регистрации веб-сервиса. Если приложение включает в себя несколько веб-сервисов, то в существующий серверный дескриптор сведения о новых веб-сервисах будут добавлены.
К сожалению, поскольку классы вебсервисов нельзя указать пачкой, придется конструкцию в цели generate-wsdd выполнять для каждого класса реализации веб-сервиса.
5. Выполняем всё вместе
Пишем класс, который и будет веб-сервисом. Начнем с простого класса, который определяет интерфейс веб-сервиса. В дальнейшем методы в класс можно безболезненно добавлять.
Код

package ru.esstu.testing.remote;
public class TestWorker {

    public java.lang.String[] getTestNameList() {
        return null;
    }

}

Запускаем Jakarta Ant в корневом каталоге проекта. В результате получаем в пакете ru.esstu.testing.remote.worker.stub такой набор файлов:
Код

bash-3.00$ ls -l 
итого 40
-rw-r--r--  1 dan users 1621 2005-09-15 18:58 deploy.wsdd
-rw-r--r--  1 dan users  331 2005-09-15 18:58 TestWorker.java
-rw-r--r--  1 dan users  574 2005-09-15 18:58 TestWorkerService.java
-rw-r--r--  1 dan users 5337 2005-09-15 18:58 TestWorkerServiceLocator.java
-rw-r--r--  1 dan users 2296 2005-09-15 18:58 TestWorkerSoapBindingSkeleton.java
-rw-r--r--  1 dan users 8494 2005-09-15 18:58 TestWorkerSoapBindingStub.java
-rw-r--r--  1 dan users  670 2005-09-15 18:58 undeploy.wsdd

В каталоге generate/wsdl файл RemoteWorker.wsdl, в каталоге target веб-приложение в файле testing-remote.war, которое можно развернуть на веб-контейнере. Однако, пока у нас нет реализации вебсервиса. В процессе выполнения build.xml Axis сгенерировал в том числе и новый класс реализации. Пишем в нем, например, следующее:
Код

package ru.esstu.testing.remote;
public class TestWorker implements ru.esstu.testing.remote.worker.stub.TestWorker{

    public java.lang.String[] getTestNameList() throws java.rmi.RemoteException {
        return new String[] { "Hello", "I'm the walrus" };
    }

}

и пересобираем проект. Теперь веб-приложение действительно можно развернуть куда надо.
Теперь пишем клиент чтобы проверить как работает конструкция.
Код

package ru.esstu.testing.remote.client;

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;

import ru.esstu.testing.remote.worker.stub.TestWorker;

public class TestWorkerClient {

    public static void main(String[] args) throws Exception {
        URL urlWsdl = new URL("http://localhost:8080/testing-remote/services/TestWorker?wsdl");
        String nameSpaceUri = "urn:TestWorker";
        String serviceName = "TestWorkerService";
        String portName = "TestWorker";
        
        ServiceFactory factory =ServiceFactory.newInstance();
        Service service = factory.createService(urlWsdl, new QName(nameSpaceUri, serviceName));
        TestWorker twService = 
            (TestWorker) service.getPort(
                    new QName(nameSpaceUri, portName),TestWorker.class);
        String[] strList = twService.getTestNameList();
        for (int i=0; i<strList.length; i++) {
            System.out.println(strList[i]);
        }
    }
}

Результатом работы клиента должна быть пара нужных строк на экране.
Несмотря на относительную сложность, IMHO, способ обладает большей гибкостью в сравнении со способом, предложенным уважаемым Domestic Cat.

Это сообщение отредактировал(а) tux - 24.1.2006, 03:42
PM MAIL Skype GTalk Jabber YIM   Вверх
smbd
Дата 23.1.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 23.1.2006

Репутация: нет
Всего: нет



Гм, немного припозднился...

Тут пара вопрсоов появилась.

1) откуда берутся файлы web.xml (прежде всего! без него war не выполняется), server-config.wsdd (тоже непонятно). Просто web.xml у меня нет в принципе, а server-config.wsdd создаётся, но непонятно, кем, и главное, зачем.

2) вызов Wsdl2java создаёт кучу "заглушек". В том числе и интерфейс, который основан на моём классе, переданном Java2wsdl, и класс реализации web сервиса, наследующий от этого интерфейса. Нельзя ли как-то автоматизировать это дело так, чтоб мой изначальный класс (по которому строится) .wsdl файл, и был тем, кто реализует web сервис? Хотя с другой стороны, он должен наследовать интерфес, который ещё не сгенерирован. Криво как-то получается. Или всё же я недопонимаю?

Спасибо заранее!

P.S. если имеет значение, Axis у меня 1.3

Это сообщение отредактировал(а) smbd - 23.1.2006, 16:05
PM MAIL   Вверх
tux
Дата 24.1.2006, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(smbd @ 23.1.2006, 19:28 Найти цитируемый пост)

Гм, немного припозднился...

Действительно smile И я уже многое забыл поскольку постоянно с веб-сервисами не работаю.

Ну, значится, по порядку.

1. web.xml придется написать ручками. В общем-то для Axis от приложения к приложению мало изменяется, я его приводить не стал. Должен быть примерно таким:
Код

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
    <display-name>Apache-Axis</display-name>

    <listener>
        <listener-class>
            org.apache.axis.transport.http.AxisHTTPSessionListener
        </listener-class>
    </listener>
    
    <servlet>
        <servlet-name>AxisServlet</servlet-name>
        <display-name>Apache-Axis Servlet</display-name>
        <servlet-class>
            org.apache.axis.transport.http.AxisServlet
        </servlet-class>
    </servlet>

    <servlet>
        <servlet-name>AdminServlet</servlet-name>
        <display-name>Axis Admin Servlet</display-name>
        <servlet-class>
            org.apache.axis.transport.http.AdminServlet
        </servlet-class>
        <load-on-startup>100</load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>SOAPMonitorService</servlet-name>
        <display-name>SOAPMonitorService</display-name>
        <servlet-class>
            org.apache.axis.monitor.SOAPMonitorService
        </servlet-class>
        <init-param>
            <param-name>SOAPMonitorPort</param-name>
            <param-value>5001</param-value>
        </init-param>
        <load-on-startup>100</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/servlet/AxisServlet</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>*.jws</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>SOAPMonitorService</servlet-name>
        <url-pattern>/SOAPMonitor</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>AdminServlet</servlet-name>
        <url-pattern>/servlet/AdminServlet</url-pattern>
    </servlet-mapping>

    <session-config>
        <!-- Default to 5 minute session timeouts -->
        <session-timeout>5</session-timeout>
    </session-config>

    <mime-mapping>
        <extension>wsdl</extension>
        <mime-type>text/xml</mime-type>
    </mime-mapping>

    <mime-mapping>
        <extension>xsd</extension>
        <mime-type>text/xml</mime-type>
    </mime-mapping>

    <welcome-file-list id="WelcomeFileList">
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.jws</welcome-file>
    </welcome-file-list>

</web-app>


2. server-config.wsdd генерится вызовом класса org.apache.axis.utils.Admin. А потом удаляется в цели pack-it после того, как упаковывается в war. Поэтому наверное и не понятно откуда он берется. smile

3. Насчет возможности использования исходного класса как реализации веб-сервиса. Согласен, довольно криво получается, но когда я веб-сервисами занимался, другого способа не нашел. Возможно он есть, а может быть и нет, ничего точно утверждать не могу. Что навскидку приходит в голову - использовать паттерн Delegate. С другой стороны, интерфейс веб-сервиса ведь проектируется один раз и генерация класса реализации не должна быть проблемой.

Это сообщение отредактировал(а) tux - 5.4.2006, 11:59
PM MAIL Skype GTalk Jabber YIM   Вверх
YuG
Дата 20.2.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 20.2.2006

Репутация: 3
Всего: 4



2tux:
Огромное спасибо за такую подробную инструкцию!
Просто мега-спасибо!!!
PM WWW ICQ Skype   Вверх
Codename
Дата 5.4.2006, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.4.2006

Репутация: 1
Всего: 1



Да действительно классная инструкция. Только вот у меня почему-то war-файл из Tomcat не запускается с чем это может быть связано?
PM MAIL   Вверх
tux
Дата 5.4.2006, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Что Tomcat при этом сообщает?
PM MAIL Skype GTalk Jabber YIM   Вверх
Codename
Дата 5.4.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.4.2006

Репутация: 1
Всего: 1



Сую war файл в weapps, захожу через менеджер и получаю

HTTP Status 404 - /testing-remote/
type Status report
message /testing-remote/
description The requested resource (/testing-remote/) is not available.
Apache Tomcat/5.0.28


PM MAIL   Вверх
tux
Дата 5.4.2006, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Codename @ 5.4.2006, 14:05 Найти цитируемый пост)
Сую war файл в weapps, захожу через менеджер и получаю

HTTP Status 404 - /testing-remote/
type Status report
message /testing-remote/
description The requested resource (/testing-remote/) is not available.
Apache Tomcat/5.0.28

Это-то понятно, это уже следствие - приложение не развернулось. А что Tomcat выдает в консоль или логи касательно testing-remote?
PM MAIL Skype GTalk Jabber YIM   Вверх
Codename
Дата 5.4.2006, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.4.2006

Репутация: 1
Всего: 1



War-файл он распечатывает, а логах пишет следующее:

- Installing web application at context path /testing-remote from URL file:C:/Program Files/Apache Software Foundation/Tomcat 5.0/webapps/testing-remote
- End event threw exception
java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor46.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:216)
at org.apache.commons.digester.CallMethodRule.end(CallMethodRule.java:505)
at org.apache.commons.digester.Rule.end(Rule.java:276)
at org.apache.commons.digester.Digester.endElement(Digester.java:1058)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endNamespaceScope(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleEndElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse(Digester.java:1548)
at org.apache.catalina.startup.ContextConfig.applicationConfig(ContextConfig.java:263)
at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:624)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:216)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4290)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:823)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:807)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:595)
at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:277)
at org.apache.catalina.core.StandardHost.install(StandardHost.java:832)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:625)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:431)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:983)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:789)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478)
at org.apache.catalina.core.StandardService.start(StandardService.java:480)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313)
at org.apache.catalina.startup.Catalina.start(Catalina.java:556)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.commons.launcher.ChildMain.run(ChildMain.java:269)
Caused by: java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name BasicService
at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:2234)
at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:2214)
... 52 more
- Parse error in application web.xml
java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name BasicService
at org.apache.commons.digester.Digester.createSAXException(Digester.java:2540)
at org.apache.commons.digester.Digester.createSAXException(Digester.java:2566)
at org.apache.commons.digester.Digester.endElement(Digester.java:1061)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endNamespaceScope(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleEndElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.endElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse(Digester.java:1548)
at org.apache.catalina.startup.ContextConfig.applicationConfig(ContextConfig.java:263)
at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:624)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:216)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4290)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:823)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:807)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:595)
at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:277)
at org.apache.catalina.core.StandardHost.install(StandardHost.java:832)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:625)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:431)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:983)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:789)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478)
at org.apache.catalina.core.StandardService.start(StandardService.java:480)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313)
at org.apache.catalina.startup.Catalina.start(Catalina.java:556)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.commons.launcher.ChildMain.run(ChildMain.java:269)
Добавлено @ 10:06
да, еще не дописал

- Occurred at line 46 column 23
- Marking this application unavailable due to previous error(s)
- Error getConfigured
- Context startup failed due to previous errors
PM MAIL   Вверх
tux
Дата 5.4.2006, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Удали из web.xml вот этот фрагмент, все должно заработать.
Код

<servlet-mapping>
    <servlet-name>BasicService</servlet-name>
    <url-pattern>/service/BasicService</url-pattern>
</servlet-mapping>

PM MAIL Skype GTalk Jabber YIM   Вверх
Codename
Дата 5.4.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.4.2006

Репутация: 1
Всего: 1



Да, пошел как надо. А как насчет работы с базами данных. Если у меня скажем есть прога, которая работает с базой через hibernate, то возможно ли ее сделать веб-сервисом, который бы проверял наличие объекта в базе. То бишь реально ли, что бы клиент называл, что хочет найти, а веб-сервис делал всю грязную работу: рылся в базе данных и выводил результат?
Если да, то как засунуть методы создания и поиска объекта?
PM MAIL   Вверх
tux
Дата 5.4.2006, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



Цитата(Codename @ 5.4.2006, 16:50 Найти цитируемый пост)
Да, пошел как надо. А как насчет работы с базами данных. Если у меня скажем есть прога, которая работает с базой через hibernate, то возможно ли ее сделать веб-сервисом, который бы проверял наличие объекта в базе. То бишь реально ли, что бы клиент называл, что хочет найти, а веб-сервис делал всю грязную работу: рылся в базе данных и выводил результат?
Если да, то как засунуть методы создания и поиска объекта?

Реально, конечно. Определяешь методы сервиса какие тебе нужно для создания и поиска объекта, реализуешь класс сервиса, в котором работаешь с hibernate. Вот, собственно, и все. Только учитывай, что в качестве параметров и возвращаемого результата методов могут быть только определенный набор типов данных (подробности в документации к Axis), так просто любой Java-класс передать не удастся. Если нужны все-таки сложные типы данных, то рекомендовал бы Hessian или Burlap (если конечно нет жесткого требования делать на Axis).
PM MAIL Skype GTalk Jabber YIM   Вверх
JUncle
Дата 15.4.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 6.4.2006
Где: Казань, РФ

Репутация: нет
Всего: 1



Прочитал обе части данной темы. Действительно, тема очень важная.
Возник вопрос.
А вот если есть необходимость связать .NET клиента с Java сервером (обмениваются уведомлениями и не очень сложными данными - с легкостью приводимыми, скажем, к текстовому виду).
Причем подключение к серверу скорее всего, только http (в принципе, полагаю, что сервер может подключиться к клиенту и каким то иным способом), а клиента необходимо уведомлять о наступлении событий в сервере в некоторые недетерминированные моменты времени.
Подскажите пожалуйста, возможно ли это, и если да - то какие средства лучше использовать (и если можно, ссылки).
PS: мы бы конечно какой-нибудь велосипед и придумали бы, но хотелось бы все сделать красивым и общепринятым методом.
--------------------
class JUncle extends Man // singleton{/*...*/}
PM MAIL   Вверх
tux
Дата 15.4.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



В MSDN описываются способы взаимодействия .NET и J2EE, может быть поможет - http://msdn.microsoft.com/library/default....g/html/jdni.asp.
PM MAIL Skype GTalk Jabber YIM   Вверх
JUncle
Дата 16.4.2006, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 6.4.2006
Где: Казань, РФ

Репутация: нет
Всего: 1



Благодарю. 
--------------------
class JUncle extends Man // singleton{/*...*/}
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1925 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.