Archive for category Java方面

c#调用带soapHeader的java webservice

服务器端的WebService类,同时也是客户端类(因为有main方法以及测试的代码)

package webservice;

import javax.xml.namespace.QName;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPElement;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.message.SOAPHeader;
import org.apache.axis.message.SOAPHeaderElement;

public class Power
{
	public static String GetMessage()
	{
		return "调用成功!";
	}
	public static void main(String... a) throws Exception
	{
		String endpoint = "http://localhost:9000/hg/services/Power";
		SOAPHeaderElement headerElement = new SOAPHeaderElement("http://schemas.xmlsoap.org/soap/envelope/", "sessionInfo");
		headerElement.setMustUnderstand(false);
		headerElement.addNamespaceDeclaration("soap", "http://schemas.xmlsoap.org/soap/envelope/");
		SOAPElement sid = headerElement.addChildElement("sessionId");
		sid.addTextNode("1234567890ABCDEF1234567890ABCDEF");
		Service service = new Service();
		Call call = (Call) service.createCall();
		call.setTargetEndpointAddress(new java.net.URL(endpoint));
		call.setOperationName(new QName("GetMessage", "GetMessage"));
		// call.addParameter(new QName("http://cn.zuoguodang.service", "name"),
		// org.apache.axis.encoding.XMLType.XSD_STRING, ParameterMode.IN);
		call.setReturnType(XMLType.SOAP_STRING);
		// 设定 Header
		call.addHeader(headerElement);
		System.out.println(call.invoke(new Object[] {}));
	}
}

服务器端的SoapHeader类

package webservice;

import java.util.Iterator;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;

import org.apache.axis.AxisFault;
import org.apache.axis.Message;
import org.apache.axis.MessageContext;
import org.apache.axis.message.MessageElement;
import org.apache.axis.message.SOAPEnvelope;
import org.apache.axis.message.SOAPHeaderElement;

public class Soapheader extends org.apache.axis.handlers.BasicHandler
{
	private String sessionId;

	@Override
	public void invoke(MessageContext msgContext) throws AxisFault
	{
		boolean processedHeader = false;
		String headerName = null;
		try
		{
			// 取得 Request 的 SOAP 信息
			Message msg = msgContext.getRequestMessage();
			SOAPEnvelope envelope = msg.getSOAPEnvelope();
			SOAPHeader header = envelope.getHeader();
			Iterator it = header.examineAllHeaderElements();
			SOAPHeaderElement hel;
			while (it.hasNext())
			{
				hel = (SOAPHeaderElement) it.next();
				headerName = hel.getNodeName();
				if (headerName.equals("sessionInfo"))
				{
					// 对于 mustUnderstand 设为 true 的 Header,必须
					// 利用下列的方式把它设为"已经处理",否则 service
					// 会回传 Did not understand "MustUnderstand"
					hel.setProcessed(true);
					checkUser(hel);
					processedHeader = true;
				}
			}
		}
		catch (SOAPException e)
		{
			throw new AxisFault("无法处理 SOAP Header.", e);
		}
		if (!processedHeader) { throw new AxisFault("接收 SOAP Header 失败"+headerName); }
	}
	private void checkUser(SOAPHeaderElement hel) throws AxisFault
	{
		MessageElement fele = hel.getChildElement(new QName("", "sessionId"));
		if (fele == null) { throw new AxisFault("找不到 sessionId 标签."); }
		sessionId = fele.getValue();
		if (!"12345".equals(sessionId)) { throw new AxisFault("认证失败"); }
	}
}

因为是使用axis2 webservice,所以要修改server-config.wsdd,增加SoapHeader作为handler,放在根节点下面

<handler name="Authenticate" type="java:webservice.Soapheader" />

并在globalConfiguration/requestFlow下面再增加节点:

<handler type="Authenticate"/>

c# 来调用这个服务的话,先生成代理类,然后在生成的代理类里面增加一个属性:

public CredentialSoapHeader SoapHeaderValue;

然后在需要调用的webserice方法上加注释:

[System.Web.Services.Protocols.SoapHeaderAttribute("SoapHeaderValue")]

CredentialSoapHeader类代码如下:

    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "")]
    [System.Xml.Serialization.XmlRootAttribute("sessionInfo", Namespace = "", IsNullable = false)]
    public class CredentialSoapHeader : System.Web.Services.Protocols.SoapHeader
    {
        public string sessionId;
    }

调用webservice并使用soapheader的代码如下:

            PowerService sps = new PowerService();
            CredentialSoapHeader cs = new CredentialSoapHeader();
            cs.sessionId = "12345";
            sps.SoapHeaderValue = cs;
            Response.Write(sps.GetMessage());

免安装版的Tomcat注册为windows服务—解读(转)

在Apache Tomcat的官方网站下载的免安装版tomcat,要把其注册为系统服务,并自启动。
1. 首先检查系统是不是之前有安装过之前的版本的tomcat,如果有的话,请将其删除,删除的办法是,到windows的控制面板—>计算机管理—>服务
在服务列表里查看有没有Apache 或tomcat相关的服务,
如果有的话,请在上面点鼠标右键—>属性,记下此服务的名称,假如为Tomcat6

此时进入windows的命令行,开始菜单—>运行—>cmd

在命令行里输入
sc delete Tomcat6
此时就能删除。上面一行命令行的Tomcat6就是系统服务里的属性名称

2. 注册新服务
在命令行里进入到下载的免安装版的tomcat目录下的bin目录
在此bin目录下运行
service.bat install
此时就能把免安装版的tomcat注册为系统服务,
你再到windows的控制面板—>计算机管理—>服务,在服务列表里就能看到你刚新加的服务

其实上面说了这么多,原理很简单,下面把这个基本原理讲一下,
Tomcat/bin目录下自带了一个service.bat文件,我们执行的就是这个bat文件,
打开service.bat文件,你会发现以下代码,重要代码用红色标记:

set EXECUTABLE=%CATALINA_HOME%\bin\tomcat5.exe

rem Set default Service name
set SERVICE_NAME=Tomcat5
set PR_DISPLAYNAME=Apache Tomcat

if “%1″ == “” goto displayUsage
if “%2″ == “” goto setServiceName
set SERVICE_NAME=%2
set PR_DISPLAYNAME=Apache Tomcat %2
:setServiceName
if %1 == install goto doInstall
if %1 == remove goto doRemove
if %1 == uninstall goto doRemove
echo Unknown parameter “%1″
:displayUsage
echo.
echo Usage: service.bat install/remove [service_name]
goto end

:doRemove
rem Remove the service
“%EXECUTABLE%” //DS//%SERVICE_NAME%
echo The service ‘%SERVICE_NAME%’ has been removed
goto end

:doInstall
rem Install the service
echo Installing the service ‘%SERVICE_NAME%’ …
echo Using CATALINA_HOME:    %CATALINA_HOME%
echo Using CATALINA_BASE:    %CATALINA_BASE%
echo Using JAVA_HOME:        %JAVA_HOME%

1.代码1:
set SERVICE_NAME=Tomcat5
set PR_DISPLAYNAME=Apache Tomcat
如果把tomcat设成服务成功后,就要会系统服务里面看到,服务名就是在这里设的
你如果改一下服务名的话,可以把上面的SERVICE_NAME,PR_DISPLAYNAME的值换掉。

2.代码2:

:doRemove和:doInstall这段代码就相当于这个bat文件有两个方法,一个叫doRemove,一个doInstall,看名字很好理解,doInstall就表示安装服务,doRemove表示删除服务

3.代码3:
if %1 == install goto doInstall
if %1 == remove goto doRemove
if %1 == uninstall goto doRemove

但是我有在cmd命令行里却用的是:
service.bat install
是如何映射的呢?
主要是通过如下代码来实现通过上面可以看到,%1就表示我们在service.bat install输入的第一个参数就是install,也就是%1=install,发现if %1 == install goto doInstall
于是就执行doInstall方法,安装服务到系统,
同样删除服务,一个最简单的方法就是:
service.bat remove

service.bat uninstall

tomcat:Null component Catalina:type=JspMonitor,name=jsp错误的解决方法

不同的jdk版本造成的。
项目中用到的.class或者.jar文件的编译jdk版本与tomcat运行使用的jdk版不一致造成的。通常java是向下兼容的,所有情况就是tomcat使用的是低版本的jdk,而开发的时候使用的是高版本的jdk进行编译,所以导致tomcat启动时报:严重: Null component Catalina:type=JspMonitor,name=jsp。
只需要将开发程序时候的jdk版本与tomcat运行时需要的jdk版本保持一致或者低于tomcat运行时需要的jdk版本就可以了。

jtds连接sqlserver2005

jtds连接sqlserver2005时,经常会报

org.hibernate.exception.JDBCConnectionException: Cannot open connection

错误
解决方法如下:
1、打开配置工具中的“SQL Server 配置管理器”,进入“SQL Server2005网络配置”–“SQLEXPRESS的协议”
2、右键单击启动TCP/IP
3、双击进入属性,把IP地址页签中的IP all中的TCP端口设置为1433
4、重新启动SQL Server 2005服务中的SQLEXPRESS服务器
5、重启SQL Server Browser 服务
java 连接:
hibernate连接串:
hibernate.dialect cn.drategy.pet.system.SqlserverDialect
#hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
hibernate.connection.driver_class net.sourceforge.jtds.jdbc.Driver
hibernate.connection.url jdbc:jtds:sqlserver://localhost:1433;instance=SQLEXPRESS;DatabaseName=pubs;SelectMethod=cursor

或 jdbc:jtds:sqlserver://localhost:1433/pubs;instance=SQLEXPRESS
driverClassName=”net.sourceforge.jtds.jdbc.Driver

解决Unsupported major.minor version 51.0错误

最近新安装使用了jdk7,编译了一些类替换到原来正常运行的项目中,替换之后发生了Unsupported major.minor version 51.0错误。经过网上搜索发现了问题产生的原因:用jdk7编译的class文件放到基于jdk6运行在tomcat之中,就会报这个错。

解决起来也很方便:打开exclipse中项目上的属性—java compiler–选择一个合适的版本后重新编译即可。

指定IP访问tomcat中系统日志

<Context path="/wwwlogs" docBase="D:/Tomcat6/logs/" crossContext="true" debug="0" reloadable="true"  trusted="false" >
<!--限制指定的IP访问此虚拟目录(Context),用逗号隔开-->
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.0.168,127.0.0.1"/>
</Context>

服务器端和客户端编程的十大性能问题

服务器端编程的十大性能问题
Web 2.0应用客户端性能问题十大根源

java.lang.OutOfMemoryError: PermGen space及其解决方法

java.lang.OutOfMemoryError: PermGen space及其解决方法
tomcat reload几次后OutOfMemoryError: PermGen space的解决方法

com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。 java.net.ConnectException: Connection refused: connect

java连接SQL Server2005时出现数据库连接错误的日志如下:

com.microsoft.sqlserver.jdbc.SQLServerException: 到主机  的 TCP/IP 连接失败。 java.net.ConnectException: Connection refused: connect
 at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
 at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(Unknown Source)
 at com.microsoft.sqlserver.jdbc.SQLServerConnection.loginWithoutFailover(Unknown Source)
 at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
 at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)
 at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:68)
 at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:87)
 at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1.acquireResource(C3P0PooledConnectionPool.java:83)
 at com.mchange.v2.resourcepool.BasicResourcePool.assimilateResource(BasicResourcePool.java:884)
 at com.mchange.v2.resourcepool.BasicResourcePool.acquireUntil(BasicResourcePool.java:601)
 at com.mchange.v2.resourcepool.BasicResourcePool.access$400(BasicResourcePool.java:31)
 at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1079)
 at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:354)

上述错误产生的原因有很多种,下面列举了我这几天碰到的三种情况及解决方案

1.SQL  Server2005服务没有启动

2.SQL Server2005安装成本地模式

3.系统即安装了SQL Server2000又安装了SQL Server2005后生成了多个实例,或者多个实例的网络链接

第一个问题的解决方案就是打开SQL Server2005的“配置工具”–>“SQL Server Configuration Manager”中的SQL Server(***)服务启动。

第二个问题的解决方案就是打开SQL Server2005的“配置工具”–>“SQL Server Configuration Manager”–>“SQL Server 2005服务”中的SQL Server(***)服务的属性打开,将“登陆”页签中的内置账户改成“NetWork Service”,然后重新启动服务,那么通过网络IP就可以访问到数据库,而不是只有localhost或者127.0.0.1能访问到该数据库了

第三个问题需要查看TCP/IP协议的开放端口是否是你所连接的端口,因为sql Server2000安装完成后默认使用了1433端口,SQL Server2005 安装上可能会分配动态端口,需要给SQL Server2005或者给SQL Server2000的TCP/IP协议换一个可用端口。具体操作打开SQL Server2005的“配置工具”–>“SQL Server Configuration Manager”–>“SQL Server 2005网络配置”–>***的协议–>TCP/IP,右键属性找到“IP地址”页签换一个可连接的TCP端口。并用第二个问题的操作方法查看服务是否启成网络模式,操作完成后重新启动服务,然后更改连接字串的端口号重新启动java应用服务器。

eclipse获取tfs中的项目

使用eclipse将项目迁入tfs之后,其他同事是要获取该项目的。如何从tfs中获取项目就成为了关键。

其实获取项目也很简单,就是Import-Team-Team Explorer,选择要获取的项目即可,会自己创建项目。

顺便提一下,在向tfs中迁移项目的时候,Project的相关配置文件也要迁进去,否则别人获取到的项目是没有配置结构的。

pagepeel by webpicasso.de