爪哇哇

一个软件分析师的博客

2007年2月9日 #

XFIRE的一个例子,发现左web service真是简单得要命!! 侧面印证了写代码越来越没前途了,哈

接口 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审批间作文件归档的尝试项目

哈,完整的项目代码,就不方便讲了。

posted @ 2007-12-29 14:59 李立波 阅读(2501) | 评论 (2)编辑 收藏

关于 DOMINO LS里面 view的Ftsearch的 "entry is no longer in view"的研究

1:
原因主要是 数据的不唯一性

domino文档数据库的弊病

而且 FTSearch查询起来也不很准确,三字符一下查询,命中率不是十分高,大约 80%-95%

2:
entry is no longer in view错误的避免方法是

用NotesViewEntry.IsValid方法先判断那 Entry是否能调用

如果不是调用里面很多方法 都会报  entry is no longer in view,就算 IsDocument也没用处

但这样,如果是自己手动分页,就会出现 GetNthEntry时候不太准确

但没办法了,两者弊,取其轻

主要是客户体验受点影响了

posted @ 2007-12-29 14:40 李立波 阅读(1563) | 评论 (0)编辑 收藏

近期负责公司的OA改造,接触了ext-js框架,自己动手写了些代码,最有成就感的是 extnd里分页的修改,一下是部分修改心得

一:

分页要自己重写:在 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, "&" , "&amp;")
 strValue = Replace(strValue, "<" , "&lt;")
 strValue = Replace(strValue, ">" , "&gt;")
 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框架,确实很有趣

posted @ 2007-12-29 14:32 李立波 阅读(1926) | 评论 (1)编辑 收藏

JAVA的对LDAP操作代码(以DOMINO为例子)

LdapConnector  连接类

import J2EE技术的爬虫.util.Hashtable;

import javax.naming.Context;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;

public class LdapConnector {
 public final static String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory";
 public final static String HOST_URL = "ldap://128.8.1.8:389";
    public static LdapConnector connector=null;
 
 private DirContext ctx;

 private Hashtable<String,String> env;
   
 public LdapConnector(String principal, String credentials) {
  env = new Hashtable();
  try {
   env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX);
   env.put(Context.PROVIDER_URL, HOST_URL);
   env.put(Context.SECURITY_AUTHENTICATION, "simple");
   env.put(Context.SECURITY_PRINCIPAL, principal);
   env.put(Context.SECURITY_CREDENTIALS, credentials);
   ctx = new InitialDirContext(env);
  } catch (Exception ex) {
   ex.printStackTrace();
  }
  
 }
 
 public  DirContext getDirContext(){
  return ctx;
 }
 
 public static SearchControls getSearchControls(){
  SearchControls constraints;
  constraints = new SearchControls();
  constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
  return constraints;
 }
 
 
 public static LdapConnector  init(){
     synchronized (LdapConnector.class) {
      if(connector==null)
    connector=new LdapConnector("lilb","1"); 
 }  
   return connector;
 }
}

测试类:

import J2EE技术的爬虫.util.ArrayList;

import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchResult;

public class LdapText {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception{
  // TODO Auto-generated method stub
  String cn="";
  String dn="";
  
  String filter="";
  String searchBase="";
  NamingEnumeration<SearchResult> results;
  
  

DirContext ctx =LdapConnector.init().getDirContext();
        //先拿CN值 ================
        searchBase="";
        filter ="(uid=lilb)";
        results =
   ctx.search(searchBase, filter, LdapConnector.getSearchControls());
  while (results != null && results.hasMore()) {
   SearchResult sr2 =  results.next();
   cn=(String)sr2.getAttributes().get("cn").get();
   dn=sr2.getName();
   System.out.println(dn);
  }
        //=======================
       
        J2EE技术的爬虫.util.List<String> uidList=new ArrayList<String>();
  
        filter =
   "(&(objectClass=dominoGroup)(cn=IT事业部))";
       
   results =
   ctx.search(searchBase, filter, LdapConnector.getSearchControls());
  
  while (results != null && results.hasMore()) {
   SearchResult sr =  results.next();
   System.out.println(sr.getName());
   
   Attributes attrs = sr.getAttributes();
   NamingEnumeration attrsEnum=attrs.get("member").getAll();
   System.out.println("组织里的人员有 :"+attrs.get("member"));
   while (attrsEnum != null && attrsEnum.hasMore()) {
    String str=(String)attrsEnum.next();
    System.out.println(str.equalsIgnoreCase(dn));
    NamingEnumeration<SearchResult> resultsPerson =
     ctx.search(str, "(objectClass=*)", LdapConnector.getSearchControls());//根据DN,再重新查找
    while (resultsPerson != null && resultsPerson.hasMore()) { 
     SearchResult srPerson =  resultsPerson.next();
     System.out.println(srPerson.getAttributes().get("cn").get());//里面人的CN
     System.out.println(srPerson.getAttributes().get("uid").get()+"@");//里面人的UID
     uidList.add(srPerson.getAttributes().get("uid").get().toString().toLowerCase());
    }
   }
   System.out.println("本组织是否存在这用户 :"+uidList.contains("lilb"));
   
   
   
  }
 }

}

posted @ 2007-04-10 14:21 李立波 阅读(1639) | 评论 (0)编辑 收藏

我心目中中国队的理想阵容

     我心目中的理想阵容 

     于大宝(韩鹏)

于海   郑智   董方卓
    邵佳一 
         周海宾  
孙详 李伟峰 冯萧庭 孙继海



前提试换了鬼老教练

posted @ 2007-04-10 14:14 李立波 阅读(191) | 评论 (0)编辑 收藏

国奥队又打架了

       又一中国球员没脑袋,没思维,没智慧的佐证
我整天对中国球员的想法就是

技术没问题

身体没问题

速度没问题

就是脑袋有问题

讲了不学,学了不做,做了又做不好

很简单的战术,分边,ONE TWO ,假动作,总是失误,怪谁呢

中国的教练不是没知识,但是是不会教

道理就象一个好的技术人员未必是一个好的老师一样

侯捷老师为何出名,不是因为他的技术(我没贬低他技术的意思),是因为他能把他懂的技术说清楚

加上中国人脑袋思维特别复杂,所以球员战术素养极其底下

哎,没救的中国足球

但为何我还是爱看?

看来我也是没救了

posted @ 2007-02-09 11:40 李立波 阅读(330) | 评论 (4)编辑 收藏

My Links

Blog Stats

News

常用链接

留言簿(5)

随笔分类

随笔档案

文章档案

相册

搜索

最新评论

阅读排行榜

评论排行榜