接口 interface
import J2EE技术的爬虫.util.Collection;
import J2EE技术的爬虫.util.List;
public interface IMathService {
/**
* 加
* @param a
* @param b
* @return
*/
public int add(int a,int b);
/**
* 减
* @param a
* @param b
* @return
*/
public int sub(int a,int b);
/**
上传二进制文件
*/
public String sendFile(String fileName,byte[] file );
}
实现 implements
import J2EE技术的爬虫.io.File;
import J2EE技术的爬虫.io.FileOutputStream;
import J2EE技术的爬虫.sql.Connection;
import J2EE技术的爬虫.sql.ResultSet;
import J2EE技术的爬虫.sql.Statement;
import J2EE技术的爬虫.util.ArrayList;
import J2EE技术的爬虫.util.Collection;
import J2EE技术的爬虫.util.List;
import com.newsoft.oa.bean.User;
import com.newsoft.oa.uitl.Connector;
import com.thoughtworks.xstream.XStream;
public class MathServiceImpl implements IMathService{
public int add(int a,int b){
return a+b;
}
public int sub(int a,int b){
return a-b;
}
public String getWelComeStr(String name){
return "hi "+name+"! 欢迎你";
}
public List getUsers(){
List l=new ArrayList();
l.add("name");
l.add("password");
l.add("sex");
return l;
}
public String sendFile(String fileName, byte[] filebytes) {
try{
String path="";
if(filebytes!=null&&filebytes.length>0){
File file=new File("/"+fileName);
file.createNewFile();
FileOutputStream fos=new FileOutputStream(file);
fos.write(filebytes);
fos.close();
path=file.getAbsolutePath();
System.out.println(path);
file=null;
}
return path;
}catch(Exception ex){
return "false";
}
}
}
配置文件
放在 Classes/META-INF/xfire/service.xml;里面
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>MathService</name>
<namespace>newsoft/oa/MathService</namespace>
<serviceClass>
com.newsoft.oa.services.IMathService
</serviceClass>
<implementationClass>
com.newsoft.oa.services.MathServiceImpl
</implementationClass>
</service>
</beans>
其实是借鉴了Spring的写法,用过Spring不会对着陌生,(Application-context.xml)
WEB-XML加上
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>
org.codehaus.xfire.transport.http.XFireConfigurableServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
最后就是客户端了
/ /Create a metadata of the service
Service serviceModel = new ObjectServiceFactory().create(IMathService.class);
// Create a proxy for the deployed service
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String serviceUrl = "http://localhost:8080/ws/services/MathService";
client = null;
try {
client = (IMathService) factory.create(serviceModel, serviceUrl);
File file=new File("c:\\SUPERMAP 白皮书.pdf");
FileInputStream fis=new FileInputStream(file);
byte[] b=new byte[fis.available()];
fis.read(b);
System.out.println(client.sendFile(file.getName(), b));
} catch (Exception ex) {
ex.printStackTrace();
} //Invoke the service
int serviceResponse = 0;
int a=10,b=20;
就是
Service serviceModel = new ObjectServiceFactory().create(IMathService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String serviceUrl = http://localhost:8080/ws/services/MathService;
三行字建立连接请求,
太轻松了
传输文件速度也可以,二进制,2M多的文件,也能轻松传递
用.net和delphi平台测试,兼容性没问题(按道理 soap,也不应该有问题)
这是为客户搭建的在 档案系统和OA审批间作文件归档的尝试项目
哈,完整的项目代码,就不方便讲了。
1:
原因主要是 数据的不唯一性
domino文档数据库的弊病
而且 FTSearch查询起来也不很准确,三字符一下查询,命中率不是十分高,大约 80%-95%
2:
entry is no longer in view错误的避免方法是
用NotesViewEntry.IsValid方法先判断那 Entry是否能调用
如果不是调用里面很多方法 都会报 entry is no longer in view,就算 IsDocument也没用处
但这样,如果是自己手动分页,就会出现 GetNthEntry时候不太准确
但没办法了,两者弊,取其轻
主要是客户体验受点影响了
一:
分页要自己重写:在 extnd-all-debug重写拿取数据部分
//自己重写分页拿数据的方法,这样数据行数会正确现实
var ds = new Ext.nd.data.DominoViewStore({
proxy: new Ext.data.HttpProxy({
url: Ext.nd.extndUrl+'GetView?OpenAgent',
method: "GET"
}),
baseParams: {db: "/"+Ext.nd.Session.CurrentDatabase.FilePath, vw: this.viewName },
reader: viewEntryReader,
remoteSort: true
});
。。。。。。。。。。。。。。。
getView的ls代理如下
'GetView:
Option Public
Option Explicit
Sub Initialize
%REM
This agent can be called from the web to search any view and return results in the
same format as the ?ReadViewEntries command. This was created for use with the
NotesView2 class v1.3 and above.
%END REM
On Error Goto ErrorHandler
Dim session As New NotesSession
Dim dbSearch As NotesDatabase
Dim colEntries As NotesViewEntryCollection
Dim vwSearch As NotesView
Dim entryResult As NotesViewEntry
Dim docCurrent As NotesDocument
Dim docResult As NotesDocument
Dim col As NotesViewColumn
Dim strQuery As String
Dim strDb As String
Dim strView As String
Dim strCategory As String
Dim intMax As Integer
Dim lngCount As Long, i As Long
Dim lngStart As Long, lngEnd As Long
Dim strParameters As String
Dim lngResults As Long
Dim x,n As Integer
Dim xmlStr,resortdescending ,resortascending As String
Dim nav As NotesViewNavigator
'start the xml document
Print "Content-Type:text/xml;"
Print "<?xml version=""1.0"" encoding=""gb2312""?>"
'first we get the search parameters out of the querystring
'db, vw, query, searchmax, count, and start
Set docCurrent = session.DocumentContext
strParameters = docCurrent.GetItemValue("Query_String")(0)
'Msgbox strParameters
strDb = GetParameter("db",strParameters)
strDb = Replace(Strright(strDb,"/"),"/","\")
strView = GetParameter("vw",strParameters)
strQuery = GetParameter("query",strParameters)
strCategory= GetParameter("RestrictToCategory",strParameters)
resortdescending=GetParameter("resortdescending",strParameters)
resortascending=GetParameter("resortascending",strParameters)
intMax = 0
If Isnumeric(GetParameter("searchmax",strParameters)) Then intMax = Cint(GetParameter("searchmax",strParameters))
lngCount = 20
If Isnumeric(GetParameter("count",strParameters)) Then lngCount = Clng(GetParameter("count",strParameters))
lngStart = 1
If Isnumeric(GetParameter("start",strParameters)) Then lngStart = Clng(GetParameter("start",strParameters))
'now we get the view to search
Set dbSearch = session.GetDatabase("",strDb,False)
Set vwSearch = dbSearch.GetView(strView)
'Msgbox resortdescending +" && "+resortascending
'now we run the search
If strCategory="" Then
Set colEntries = vwSearch.AllEntries
Else
Set colEntries = vwSearch.GetAllEntriesByKey(strCategory)
End If
lngResults=colEntries.Count
'now we spit out the results
Print "<viewentries toplevelentries=""" & Cstr(lngResults) & """>"
'set the starting point for the loop
If lngStart > lngResults Then lngStart = lngResults
'set the ending point for the loop
lngEnd = lngStart + lngCount - 1
If lngEnd > lngResults Then lngEnd = lngResults
'now loop through the appropriate subset of results and print out a viewentry tag for each one
i = lngStart
While i <= lngEnd
If i = lngStart Then
Set entryResult = colEntries.GetNthEntry(i)
Else
Set entryResult = colEntries.GetNextEntry(entryResult)
End If
If Not entryResult Is Nothing Then
'If Not entryResult Is Nothing And entryResult.IsValid Then
'If entryResult.IsDocument Then
Set docResult = entryResult.Document
Print "<viewentry position=""" & Cstr(i) & """ unid=""" & Cstr(docResult.universalID) & """ noteid=""" & Cstr(docResult.NoteID) & """ siblings=""" & Cstr(entryResult.SiblingCount) & """>"
x = 0
n=0
Forall value In entryResult.ColumnValues
Set col=vwSearch.Columns(x)
If Not col.isCategory And Not col.IsHidden Then
Print "<entrydata columnnumber=""" & Cstr(n) & """ name=""" & col.itemName & """>"
Print "<text>" & XMLEscape(GetValue(value,Cstr(docResult.universalID))) & "</text>"
Print "</entrydata>"
n=n+1
End If
x = x + 1
End Forall
Print "</viewentry>"
'End If
End If
i = i + 1
Wend
AtEnd:
Print "</viewentries>"
''''Msgbox xmlStr
Print xmlStr
vwSearch.Clear
Set dbSearch=Nothing
Set vwSearch=Nothing
Exit Sub
ErrorHandler:
Msgbox "<error>" & "Error in ($Ext.nd.SearchView): " & Error & "---at " & Erl & "</error>"
Print "<error>" & "Error in ($Ext.nd.SearchView): " & Error & "---at " & Erl & "</error>"
Resume AtEnd
End Sub
Function GetParameter(strParamName As String, strQuery As String) As String
'this gets a parameter out of a querystring
Dim i As Integer
Dim s As String
Dim v As Variant
GetParameter = ""
i = Instr(Ucase(strQuery),"&" & Ucase(strParamName) & "=")
If i <> 0 Then
s = Strright(Mid(strQuery, i),"=")
If Instr(s, "&") Then
s = Strleft(s, "&")
End If
v = Evaluate("@UrlDecode(""Domino""; """ & s & """)")
GetParameter = Cstr(v(0))
End If
End Function
Function XMLEscape(strValue As String) As String
'this escapes a string so it can be printed out to xml safely
strValue = Replace(strValue, "&" , "&")
strValue = Replace(strValue, "<" , "<")
strValue = Replace(strValue, ">" , ">")
XMLEscape = strValue
End Function
Function GetValue(strValue As Variant,id As String) As String
On Error Goto sErr
'Forall vs In strValue
' Msgbox "vs=" & Cstr(vs)
'End Forall
GetValue=Cstr(strValue)
Exit Function
sErr:
GetValue="文档" & id
Exit Function
End Function
有兴趣可以研究下 ext-js的AJAX框架,确实很有趣