2007年1月31日
#
接口 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框架,確實很有趣
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"));
}
}
}
我心目中的理想陣容
于大寶(韓鵬)
于海 鄭智 董方卓
邵佳一
周海賓
孫詳 李偉峰 馮蕭庭 孫繼海
前提試換了鬼老教練
????? ?又一中國球員沒腦袋,沒思維,沒智慧的佐證
我整天對中國球員的想法就是
技術沒問題
身體沒問題
速度沒問題
就是腦袋有問題
講了不學,學了不做,做了又做不好
很簡單的戰術,分邊,ONE TWO ,假動作,總是失誤,怪誰呢
中國的教練不是沒知識,但是是不會教
道理就象一個好的技術人員未必是一個好的老師一樣
侯捷老師為何出名,不是因為他的技術(我沒貶低他技術的意思),是因為他能把他懂的技術說清楚
加上中國人腦袋思維特別復雜,所以球員戰術素養極其底下
哎,沒救的中國足球
但為何我還是愛看?
看來我也是沒救了
Tomcat5.5.9?
Jdk?1.5.0.1
按照如下的配置成功:
1首先我打開tomcat5.5的SSL
修改Tomcat配置文件server.xml,去掉對于SSL的注釋,即開放8443端口
(注意:不用添加任何東西)
2.生成安全證書
首先在命令行中切換到?%java_home%\jre\lib\security目錄
%java_home%\bin\keytool?-genkey?-alias?tomcat?-keyalg?RSA
密碼是:changeit
姓名是:localhost
其他隨便寫的
之后是
%java_home%\bin\keytool?-export?-alias?tomcat?-file?server.crt
和
%java_home%\bin\keytool?-import?-file?server.crt?-keystore?%java_home%/jre/lib/security/cacerts?
3.將CAS?server3.0.2中target目錄中的CAS.war復制到%tomcat_home%\webapps目錄下.
(或者\cas-server-2.0.12\lib目錄中的CAS.war也可以)
4.將cas-client-2.0.11\java\lib文件復制到%tomcat_home%\webapps\servlets-examples\WEB-INF\lib中(沒有lib文件夾,自己建一個)
5.修改tomcat自帶的servlet-examples的web.xml,?加入cas的過濾器:
<filter>?
????<filter-name>CASFilter</filter-name>
????<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
????<init-param>
????????<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
????????<param-value>https://localhost:8443/cas/login</param-value>
????</init-param>
????<init-param>
????????<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
????????<param-value>https://localhost:8443/cas/proxyValidate</param-value>
????</init-param>
????<init-param>
????????<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
????????<param-value>localhost:8080</param-value>
????</init-param>
</filter>
<filter-mapping>
????<filter-name>CASFilter</filter-name>
????<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
6.啟動tomcat?!,CAS.war文件被自動在webapps下釋放出CAS目錄
進入http://localhost:8080/servlets-examples,隨便點擊一個Execute,系統?被自動轉發到CAS的登陸頁面.
輸入相同的用戶名和密碼,之后跳轉回原來頁面
注意:
在制作一個自簽名的credential了,?在生成keystore文件的時候密碼是:changeit(這是tomcat默認的),你的名字一定要是:localhost,當然這是你需要把CAS?client和CAS?server放在同一臺機器上進行測試用的.