使用代理向JavaScript通信,可以分为用代理写出JavaScript程序和用代理设置JavaScript参数。 [一]用代理写出JavaScript程序。 我们可以使用代理中的print系统函数,在窗口打印信息。这些信息为浏览器认做HTML语句来解释。这样我们就可以用print函数在代理中写JavaScript程序。 例如以下代码片段: If dc.count=0 then ‘dc为在前面程序里使用database.search得到的DocumentCollection Print "" End if 该段代码执行如下功能,判断如果当前搜索得到的文档集为空,就在浏览器端显示出错信息,然后将窗口路径指向某视图。
再看一个代码片段:
flag =curdoc.save(True,False) If flag Then Print "" Print "" Print "
个人选项保存成功。
" End If 该段代码执行如下功能,判断如果当前文档保存成功,就在浏览器端显示确认信息,随即关闭窗口。
我如何在页面上建立一个热点,让它打开一个文档? 答: 在页面上写一段文字,然后选上这段文字,然后点菜单”创建” –热点--操作热 点.然后选LotusScript ,举个例子,比如打开ID 为NT00000C62的文档: Sub Click(Source As Button) Dim uiworkspace As New notesuiworkspace Dim curdatabase As notesuidatabase Dim database As notesdatabase Dim doc As notesdocument Set curdatabase = uiworkspace.currentdatabase Set database = curdatabase.database Set doc = database.getdocumentbyid("00000C62") Call uiworkspace.EditDocument(True,doc,False ) End Sub 我如何实现归档,比如我如何把当前视图中所有被选中的文档归入文件夹 fold 中? 答: 用Script象如下这样实现: Sub AddDocToFold(fold As String) Dim uiworkspace As New notesuiworkspace Dim uiview As notesuiview Dim doc As NotesDocument Dim docList As String Set uiview = uiworkspace.currentview For j = 1 To uiview.Documents.Count Set doc = uiview.Documents.GetNthDocument(j) Call doc.PutInFolder( fold ) Next End Sub 我如何实现把某文件夹视图中的被选择的文档从该文件夹中清除,但却不能删除他们? 答: 用Script 实现如下: Sub RemoveDocFromFold( fold As String,all As Integer) '功能: ' 把文档从某个文件夹中移走,但并不删除此文档 '参数: ' fold: 文件夹 ' all : 0表示仅移走当前选择的文档,1表示移走该文件夹中所有文档 Dim uiworkspace As New notesuiworkspace Dim uiview As notesuiview Dim doc As NotesDocument Dim view As notesview Set uiview = uiworkspace.currentview Set view = uiview.view If all = 0 Then '移去所选文档 For j = 1 To uiview.Documents.Count Set doc = uiview.Documents.GetNthDocument(j) Call doc.RemoveFromFolder( fold ) Next Else If all=1 Then '移去全部文档 Set doc = view.GetFirstDocument '遍列该视图的所有文档,获取所有满足条件的纪录数 While Not(doc Is Nothing) Call doc.RemoveFromFolder( fold ) Set doc = view.GetNextDocument(doc) Wend End If End If 'Evaluate("@Command([ViewRefreshFields])") End Sub 我如何把当前视图中的所有的被选择的文档的某个域的值替换掉? 答: 用Script 实现如下: Sub SelectedDocFieldReplace( Field As String,repval As String) '功能: ' 把所选文档中的每个 Field 域的值 改为 repval '参数: ' Field 要更改的域的名称 ' repval 修改后的域值 Dim uiworkspace As New notesuiworkspace Dim uiview As notesuiview Dim doc As NotesDocument Dim order_num As String 'order_num = Inputbox$("请输入批次") Set uiview = uiworkspace.currentview For j = 1 To uiview.Documents.Count Set doc = uiview.Documents.GetNthDocument(j) On Error Goto lable1 Call doc.replaceitemvalue(Field,repval) Call doc.save(True,False) Next Exit Sub lable1: Msgbox("错误!,所选文档没有指定的域,这个错误发生在没有给 selectedDocFieldReplace() 函数传递正确的参数") Exit Sub End Sub 我如何创建某个程序运行结果的日志文档? 答: 首先新建一个日志文档的表单,并把该表单设置成数据库的默认表单,然后 就用Script创建文档,并填写该文档中某些域的值,最后存盘,例子程序片段如下: '写传真日志 Dim faxerdoc as notesdocument ‘faxerr_receiver,faxerr_docnum,faxerr_content是表单form_faxerr的三个域名 ‘ Set faxerrdoc = New NotesDocument( db ) faxerrdoc.Form = "form_faxerr" Call faxerrdoc.replaceitemvalue("faxerr_receiver",Cstr(peoplecount) ) Call faxerrdoc.replaceitemvalue("faxerr_docnum",strsucssnding ) Call faxerrdoc.replaceitemvalue("faxerr_content",faxerrmsg ) success = faxerrdoc.ComputeWithForm( False, False ) If success Then Call faxerrdoc.Save( True, False ) Else Msgbox("无法写入传真日志....") End If 'Msgbox(faxerrmsg) Exit Sub 我要从当前视图中选择一批文档,并让程序从这些文档中提取信息,在嵌入在表单中的OLE对象Word文档中建立一张表,要求是选择了几篇文档就在这张表中画几行,这张表的每个列的信息都中文档中的域中提取,换句话说,就是要把被选文档以Word文档表格的形式表示出来,能否给我一个这方面的例子程序? 答: 可以,下面就是这样的一个例子: Sub inputgroupplan(source As notesuidocument,doccollection As notesdocumentcollection) '功能: 自动生成出团计划表。 ' 详细描述: ' 从 文档集合 doccollection 中提取各个域值,并把提取的信息以一定 ' 的表格形式送入当前文档的 body 域中的 OLE 对象--Word 文档中. '参数: ' source: 当前文档 ' doccollection :文档集(比如文档的选择集)
Dim session As New NotesSession '当前会话 Dim counter As Integer '计数器 Dim doccustom As NotesDocument 'notes 文档对象 Dim thisdoc As Variant 'Word 文档对象 Dim thisrange As Variant 'Word 开发中的 range 对象 Dim thispicture As Variant '嵌入Word 文档的图象对象 Dim thistable As Variant '嵌入Word 文档的表格对象 Dim pagehead As String '嵌入Word 标题 '获取嵌入文档的句丙 If source.EditMode Then Set thisdoc = source.getobject("oleobject") '插入一幅图 Set thispicture = thisdoc.shapes.Addpicture("c:\学习\cassiatb.jpg") '设置图像属性 With thispicture.wrapformat '环绕方式 .type = wdwrappicture '类型为picture .side = wdwrapright '文字右环绕 End With '设置该文档的页面设置的左边距为20个单位(象素) With thisdoc.pagesetup .leftmargin = 20 .rightmargin = 20 End With counter=0 pagehead = Inputbox$("请输入标题") pagehead = Chr(10) & pagehead & Chr(10) & Chr(10) & Chr(10) 'Call source.FieldSetText ( "Namelist_Group_Num", group_num ) 'groupstring = "Namelist" & " " & group_num & Chr(10) Set thisrange = thisdoc.range(1,1) thisrange.InsertBefore (pagehead) Set thisrange = thisdoc.range(2,Len(pagehead)) With thisrange .bold = True '加粗 .ParagraphFormat.Alignment = 1'wdAlignParagraphCenter 行居中 .font.size = 20 '字体大小为20 End With Set doccustom = doccollection.GetFirstDocument '遍列文档集的所有文档,获取所有满足条件的纪录数 While Not(doccustom Is Nothing) counter=counter+1 Set doccustom = doccollection.GetNextDocument(doccustom) Wend '动态分配纪录数组 'Redim record(counter,6) As String '插入一张表 Set thisrange = thisdoc.range(Len(pagehead)+1,Len(pagehead)+1) Set thistable = thisdoc.tables.Add(thisrange, counter+1, 8) 'thistable.autoformat(False) '写表头 thistable.rows(1).cells(1).range.insertbefore("前往国家") thistable.rows(1).cells(2).range.insertbefore("国家数") thistable.rows(1).cells(3).range.insertbefore("天数") thistable.rows(1).cells(4).range.insertbefore("出境城市") thistable.rows(1).cells(5).range.insertbefore("入境城市") thistable.rows(1).cells(6).range.insertbefore("出发日期") thistable.rows(1).cells(7).range.insertbefore("同行价") thistable.rows(1).cells(8).range.insertbefore("市场指导价") '恢复计数器 counter = 0 '写表内容 Set doccustom = doccollection.GetFirstDocument While Not(doccustom Is Nothing) counter = counter+1 thistable.rows(counter+1).cells(1).range.insertbefore(doccustom.plan_country(0)) thistable.rows(counter+1).cells(2).range.insertbefore(doccustom.plan_country_num(0)) thistable.rows(counter+1).cells(3).range.insertbefore(doccustom.plan_day(0)) thistable.rows(counter+1).cells(4).range.insertbefore(doccustom.plan_out_city(0)) thistable.rows(counter+1).cells(5).range.insertbefore(doccustom.plan_in_city(0)) thistable.rows(counter+1).cells(6).range.insertbefore(doccustom.plan_date(0)) thistable.rows(counter+1).cells(7).range.insertbefore(doccustom.plan_whole_price(0)) thistable.rows(counter+1).cells(8).range.insertbefore(doccustom.plan_mart_price(0)) Set doccustom = doccollection.GetNextDocument(doccustom) Wend End If End Sub 如何实现表单上的内容根据用户的输入动态变化? 答: 一般可以用notes的隐藏属性功能来控制,使用当公式为真是隐藏,然后靠公式来控制具体怎样隐藏.比如可以在对话筐上放一个对话筐列表,里面放十个选项,当用户选择了其中的某几个选项时,响应的在下面的表单部分显示几行.这可以画一个表格,这个表格的属性中设置边框的线条粗细为零.然后对应十个选项分为十行,每行填入和选项响应的内容,然后选定某一行的所有文本,编辑其隐藏属性,选当公式为真时隐藏,这个公式您就可以写成当选项的被选中条目中不包含本行文字时隐藏就可以了,这样这一行就会在响应的选项被选中时才会显示. notes没有应用程序级的公共变量,那么我如果要弹出一个对话筐,并从这个对话筐中返回很多用户输入,我该怎么办? 答: 你首先要确定你要在哪个表单上弹出这个对话筐,一般的的做法是利用notes 的域值传递功能,即如果对话筐中的表单上的域和弹出这个对话筐的母表单的域相同,则对话筐中的值会被自动传到母表单的相应的域中的.你可以将放在对话筐中的表单作成子表单,同时把它放入对话筐中和母表单中,这样你就可以接受到所有的用户输入了. 在b/s下从通讯录中选人一例在parentform母表单上建一个域reader(多值),另建一表单(childform),上建两个对话框域rylb(通讯录中人员的姓名),reader(用于添加或删除人员),在母表单上建一按钮,js代码如下:window.open('/xxxy/xxx.nsf/childform?openform',null,'width=450,height=200,status=no,resizable=no,top=200,left=200,scrollbars=no');在childform表单的js head 中写入以下代码,var fieldfunction AddClick(field){var fieldEntryList=document.all["rylb"]if(fieldEntryList.selectedIndex != -1){for (var i=0; i < fieldEntryList.options.length; ++i){if (fieldEntryList.options.selected)field.options[field.options.length] = new Option(fieldEntryList.options.text);}}}function RemoveClick(field){if (field.length != 0){if (field.selectedIndex != -1){for(var i=0;i”按钮,代码如下:AddClick(reader),“移除<-”按钮,代码如下:RemoveClick(reader),“确定”按钮,代码如下:var fieldEntryList=document.all["reader"]if (fieldEntryList.options.length=="0"){window.opener.document.forms[0].reader.value=""}else{window.opener.document.forms[0].reader.value="";for (var i=0; i < fieldEntryList.options.length; ++i){if(window.opener.document.forms[0].reader.value==""){window.opener.document.forms[0].reader.value=fieldEntryList.options.text}else{window.opener.document.forms[0].reader.value=window.opener.document.forms[0].reader.value+";"+fieldEntryList.options.text}}}alert("操作成功,请保存原文档!")window.close()“取消”按钮,代码如下:window.close()这样就可以对parentform母表单域中的值进行添加、移除等自如地操作。
Servlet在Cookie,Session和上传文件上的应用
Servlet可以被认为是服务端的applet,它被WEB服务器加载和执行,前端可以显示页面和获得页面数据,后台可以操纵数据库,能完成JavaBean的很多功能。在这里我较为详细的说说Servlet在Cookie,Session和上传文件上的应用,在说明时我给出一些能编绎运行的小例子,最后给出一个文件上传例子以加深印象。 我们先来看看SERVLET程序的基本构架: 式1: package test; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class test extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int f =1; switch(f){ case 1:firstMothed(request,respponse);break; } } public void firstMothed(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream()); PrintWriter out = new PrintWriter (response.getOutputStream()); out.println("< html>"); out.println("< head>< title>Servlet1< /title>< /head>"); out.println("< body>你好!"); out.println("< /body>< /html>"); out.close(); } } 式2: package test; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class test extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream()); PrintWriter out = new PrintWriter (response.getOutputStream()); out.println("< html>"); out.println("< head>< title>Servlet1< /title>< /head>"); out.println("< body>你好!"); out.println("< /body>< /html>"); out.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream()); PrintWriter out = new PrintWriter (response.getOutputStream()); out.println("< html>"); out.println("< head>< title>Servlet1< /title>< /head>"); out.println("< body>你好!"); out.println("< /body>< /html>"); out.close(); } } 式1适合于作总控模块,此SERVLET作中间调度,根据不同的f值调用不同的SERVLET或方法。 式2适合于对html的get和post有不同要求的情况。 但这并不是绝对的,式2就完全可以代替式1,只要在doGet()方法中写上doPost就与式1完全一样。 在init方法中执行的语句,只要这个servlet被启动了就一直有效,比如,我们在init()中new了一个对象,那么这个对象的内存空间就永远存在,除非显式地把这个对象赋为null,或重启服务。 HttpServletRequest和HttpServletResponse两个对象实现http请求,它们有很多有用的方法,在下面的cookie和session管理中会细加描述。 1, cookie管理 cookie用于在客户端保存个人所特有的信息,它采取在客户机写临时文件的机制。 package test; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class test extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //写cookie String CookieName ="js79"; //若是汉字则需编码 String CookieValue = "yesky";//若是汉字则需编码 Cookie cookie = new Cookie(CookieName,CookieValue); cookie.setMaxAge(age); // age = Integer.MAX_VALUE 永不过期 cookie.setPath("/"); //读cookie String value = null; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (int i=0; i< cookies.length; i++) { if (cookies.getName().equals(CookieName)) value = cookies.getValue(); break; } } } response.setContentType("text/html"); OutputStreamWriter osw = new OutputStreamWriter(response.getOutputStream()); PrintWriter out = new PrintWriter (response.getOutputStream()); out.println("< html>"); out.println("< head>< title>test< /title>< /head>"); out.println("cookie键:"+CookieName+"< br>"); out.println("cookie值: "+value); out.println("< /body>< /html>"); out.close(); } } 2,session管理 Session在Servlet中是很有用的,它比cookie安全可靠灵活,但是管理起来有点麻烦,用得不好会造成服务器的开销很大,浪费资源。下面是一个基于Session管理一个对象的简单例子。 一个简单的bean对象TestObject package test; public class TestObject extends Object { int id = 0; public String cur=""; } package test; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class TestMan extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int f = 1; if(request.getParameter("f")!=null) f = Integer.parseInt(request.getParameter("f")); switch(f){ case 1: this.getResult(request,response); break; case 2: this.setSession(request,response); break; } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } public void getResult(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { TestObject testObject = null; testObject = getStatus(request,response); String html = testObject.id; doWrite( response,html); } public void setSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); TestObject testObject = null; testObject = getStatus(request,response); String tmp = null; tmp = request.getParameter("id"); if(tmp != null) testObject.id = tmp; session.putValue("testObject ",article); getResult(request,response); } private TestObject getStatus(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); TestObject testObject = null; if(session!=null){ if(session.getValue("testObject ")!=null){ testObject = (TestObject)session.getValue("testObject "); } else{ testObject = new TestObject (); } } else{ testObject = new TestObject (); } return testObject; } private void doWrite(HttpServletResponse response,String html) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println(html); out.close(); } / } 若能轻松搞定上面的例子,相信读者对SERVLET已有了较为深刻的理解。 下面再介绍一个上传文件例子,其中汲及到了下载的免费JavaBean (如有感兴趣的朋友,可来函索要免费JavaBean源代码,Email:[email protected]) 上传基本原理:由页面发出一个http请求,服务端得到请求后,解析多媒体协议,读出文件内容,写文件内容到服务器,所有的这些功能都封装到JavaBean中。 上传文件的必需条件:Browser端< form>表单的ENCTYPE属性值必须为 multipart/form-data,它告诉我们传输的数据要用到多媒体传输协议,由于多媒体传输的都是大量的数据,所以规定上传文件必须是post方法,< input>的type属性必须是file。 package upload; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class UpLoadServlet extends HttpServlet { public void init(ServletConfig config) throws ServletException{ super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("< HTML>< HEAD>< TITLE>UpLoad< /TITLE>" +"< meta http-equiv='Content-Type' content='text/html; charset=gb2312'>" +"< /HEAD>" +"< body>"); out.println("< div align='center' valign='top'>" +"< span class='nava'>请你选择上传的文件(请注意文件大小只能在20K之内)< /span>< BR>" +"< form ENCTYPE='multipart/form-data' method=post action=''>" +"< input type='file' name='file'>" +"< input type='submit' value='发送'>" +"< /form>" +"< /div>"); out.println("< /body>< /html>"); out.close(); }
// 保证CDFIELD域长度为偶数 if (CDField.Header.Length % 2) CDField.Header.Length++; ODSWriteMemory( (void far * far *)&pBuffer, _CDFIELD, (void far *)&CDField, 1 );
You can use a Java servlet to pass a 401 exception to the browser to log someone off of TestRealm (in most cases, this is "www.company.com"):
// From Terry Courtneyimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class LogOff extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config) ; } public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String auth ; // get output streem ServletOutputStream out = res.getOutputStream() ; // get authorization from header auth = req.getHeader("Authorization") ;// if (auth == null) { //It's a logic Error,rem by dingxiang if (auth != null) { // force prompt of login res.setContentType("text/html"); res.setHeader("WWW-Authenticate", "WWW-Authenticate: basic realm=\"/TestRealm\"") ; res.setStatus(401, "401 Unauthorized") ; } out.println("Hi") ; } // end doGet} // end class LogOffWhen you call this servlet w/ a URL of http://www.company.com/LogOff, it will send the right HTTP headers back to the browser to trick the browser into thinking that the user did not authenticate with this Realm.
This servlet can also be written as a LotusScript agent. 版权所有2001 首页-->LOTUS文章-->自动切换用户ID Sub Initialize%REM 切换用户ID本程序的作用是:1、从指定的目录中搜索所有ID文件,2、然后提供用户选择3、再从注册用户时保存在names.nsf数据库中的密码进行校对看是否相同。4、再通过用户选择的ID文件更换操作员ID本程序有以下缺陷:1、取得特殊指定目录下的ID文件2、无法判断获得的ID文件是用户ID,还是Server.id,cart.id3、用户密码需要保存在names.nsf中,首先进行密码核对,造成安全泄露。但不这样做,无法截获用户输入密码错误,程序不好处理。4、因此此公式仅适合单机用户。tndahttp://notes.363.net%END REMREM 首先搜索指定目录下的所有ID文件Dim ss As New notessessionxx = ss.UserNameListIDPath = ss.GetEnvironmentString("Directory",True)IDFileAll = IDPath+"\*.id"'没有方法遍历所有目录,所以假定所有ID文件在此目录下fileName = Dir(IDFileAll, 0)num = 0Do While fileName <> ""num = num + 1fileName = Dir()LoopIf num = 0 Then Exit Sub '没有找到ID文件就退出程序Redim ids(1 To num) num = 1fileName = Dir(IDFileAll, 0)Do While fileName <> ""ids(num) = Left(filename,Instr(1,filename,".")-1)num = num + 1fileName = Dir()LoopDim uiw As New notesuiworkspaceIDuser = uiw.Prompt( PROMPT_OKCANCELLIST,"更换操作员","请选择一个操作员:","",ids)If IDuser = "" Then Exit SubREM 从names.nsf中获取密码 Dim ndb As notesdatabaseSet ndb = ss.getdatabase("","names.nsf")Dim nvi As notesviewSet nvi = ndb.getview("People")Dim pdoc As notesdocumentSet pdoc = nvi.getdocumentbykey(IDuser)pass = pdoc.comment(0)For i = 1 To 3IDpass = uiw.Prompt( PROMPT_PASSWORD,"输入密码","请输入您的密码:")If pass = IDpass Then Exit For NextIf pass <> IDpass Then Exit SubDim idfile As Stringidfile = IDPath+"\"+IDuser+".id"Dim newreg As New NotesRegistration Call newreg.SwitchToID( idfile,pass )Messagebox "当前操作员是:"+IDuser,64,"更换成功"Exit SubEnd Sub 版权所有2001 首页-->LOTUS文章-->RTF域全接触 RTF域完全掌握 1、RTF域是Notes中最重要的域,由于它能够保存文本、声音、图片、动画、附件以及按钮操作、链接等多媒体信息资料,是Notes不同于普通关系型数据库的重要特征。2、RTF域的存储容量仅受机器硬盘限制,可以任意大的文件和程序。3、当存储各种类型的RTF域,改变域类型成为文本类型时,仅其中的文本字符能够保存,其他的图片、附件等不能保存在文本类型域中。4、RTF域在编程中,是不能通过公式函数来计算处理的,只能通过LotusScript来对其进行复制操作。5、以下是用LotusScript复制、添加RTF域内容,经测试无误。Sub Click(Source As Button)%REM RTF域复制操作作者:tnda 2000.3.5http://notes.363.net mail:[email protected]域值在程序中编辑修改后,只能调用doc.save(false,true)不能调用uidoc.save,也不能在文档中单击保存按钮,否则后台修改无效。并且其修改的内容当前不能显示,只有不保存退出文档,再打开才能显示。因为RTF域只能通过后台LotusScript修改。%END REM Dim uiw As New notesuiworkspaceDim uidoc As notesuidocumentDim doc As notesdocumentSet uidoc = uiw.currentdocumentSet doc = uidoc.document '获得当前文档Dim rtitem1 As NotesRichTextItemSet rtitem1 = doc.GetFirstItem( "aaaa" )If rtitem1 Is Nothing Then Exit SubIf rtitem1.Type <> RICHTEXT Then Exit Sub'文档没有保存以前,无法发现RTF域Call rtitem1.AppendText( "这是第一个域值内容" ) Dim rtitem2 As NotesRichTextItemSet rtitem2 = rtitem1.CopyItemToDocument( doc,"bbbb")Call rtitem2.AppendText( "这是第二个域新内容" ) Call doc.Save( False, True )End Sub 版权所有2001 首页-->LOTUS文章-->域公式 域公式本节主要介绍域在何处需要使用公式,具体公式编程,下章介绍。可以使用域公式的事件有:域选择公式、域隐含公式、域初始值和计算公式、域校验公式、域刷新公式、域事件公式等。域选择公式:在选择域类型为对话框列表、复选框、单选框、列表框、组合框时,需要输入域可以选择的选项。选择项:对于固定不变的选择项,如:性别、学历等,可以手动输入。对于可能会变化,或者说无法确定的选择项目,如:毕业学校、所学专业等,需要使用公式获得。手动输入的方法为:在选择项目输入框内,输入男|1女|2“|”前面的“男”,为显示内容,即用户可以看见的,“|”后面的“1”,为实际内容,即当用户选择了“男”时,实际上此域保存的内容是“1”。因此,此域在表单中显示为“男”,但在视图中显示为实际值“1”,如果希望显示和保存的内容一致,则放弃使用“|”,即可,如:男女注意:“1”是文本字符,不是数字类型,利用选择项输入的域类型一律是文本类型。一行为一个选择项目,如果选择项内容需要空值,直接回车,在一行中不要输入任何内容即可。公式选择项的方法为:1、从视图读取:需要使用公式:@DbColumn,此公式的作用是从任何服务器上的数据库中,读取指定的视图中的指定的列。@DbColumn( class : "NoCache" ; server : database ; view ; columnNumber )· class:输入空值,或"Notes" · "NoCache":不从缓冲区读取 · server:指定的服务器,本地服务器,可以使用空值"" · database:指定的数据库名称,如果找不到则报错,如果是当前数据库则为空值 · view:指定的视图,可以为隐含视图, · columnNumber:指定视图中的第n列,可以是隐含列,从视图的左数第N个列,包括隐含列。 · 注意:如果视图的第N列有重复内容,则选择项目中也会有重复内容供选择,需要第N列排序分类即可。 如:@DbColumn("";"";"aaaa";1),读取当前数据库的aaaa视图的第1列值。2、从其他文档读取:可以从其他文档读取一个多值域,作为选择项目,如可以将公司的部门输入指定配置属性文档中,供选择。使用公式@DbLookup,此公式的作为是从指定的文档中读取一个域值内容。@DbLookup( class : "NoCache" ; server : database ; view ; key ; fieldName )· key:根据此值,从视图中的第一列选择指定的文档,如果key是多值列表,如:"男":"团员",则视图第一列性别必须排序分类,第二列政治面貌必须排序,依此类推。 · filedName:指定文档中的域名称,函数将返回此域的值。如果输入数字N,则表示读取视图中指定文档的第N列值,建议使用域名称。 · 注意:如果没有找到文档,系统将定位为此视图的第一个文档,如果视图中没有文档,则出错。 如:@DbLookup("";"" ;"aaaa"; "abc" ; "City" ),返回从当前数据库中aaaa视图,根据aaa值定位的文档的City域值。返回内容必须是多值域,如果是单值域,则仅有一个选项。使用视图对话框的方法:选择项目可以使用视图来选择,可以使用函数:@PickList,其作用是显示一个视图对话框,可以从中选择一个或几个文档,并返回指定的域值。@PickList( [Custom] : [Single] ; server : file ; view ; title ; prompt ; column ; categoryname )· [Custom]用户自定义选项 · [Single]:选择此项表示返回单值,否则可以返回多值 · title:对话框标题 · prompt:对话框显示提示 · column:返回第N列域值 · categoryname:5.0新增功能,表示视图仅显示此参数指定的分类文档。 · 此函数功能比较多,具体请参阅帮助数据库 使用地址对话框的方法:显示names.nsf的人员视图供选择使用存取权限框的方法:显示当前数据库存取权限指定的人员供选择如果选择了域属性“可以使用不在列表中的数值”,则可以从选择项目中选择的同时,可以输入新建内容。域隐含公式:域隐含公式必须返回@True或@False,来根据逻辑对或错判断域是否隐含。如:aaa = "",表示域aaa的值为空时隐含域初始值和计算公式:根据公式返回一个指定的值,返回的值类型必须和域类型一致,否则出错。公式位置为:Default Value如:文档创建时间域初始公式可以为,@New,表示返回当前工作站时间域校验公式:判断域值输入是否正确,仅编辑类型可以使用。公式位置为:Input Validation如:数量域值大于0,小于100,其公式为@If(ShuLian > 0 & ShuLiang < 100 ; @Success ; @Failure("数量输入范围是0 ~100"))· @Success:返回正确,表示此域内容符合要求。 · @Failure:返回错误,表示此域内容不符合要求,并显示提示内容,且输入光标会自动进入此域输入框中。。 域刷新公式:当表单刷新时,会根据此公式返回的值改变域值内容,仅编辑类型可以使用。公式位置为:Input Translation如:如果在省份输入的内容是“广东”则自动将其内容转化为“广东省”@If(@Right(ShengFen;1) = "省" ; ShengFen ; ShengFen + "省" )此公式判断ShengFan域内容,最后一个字符是否是“省”,如果不是,则加入,否则返回原值。域事件公式:根据域触发的事件运行一段程序,事件有:· Entering:进入编辑域,即此域获得输入焦点,激活此事件,一般可以设置动态初始值。 · Exiting:退出编辑域,即此域失去输入焦点,激活此事件,一般可以校验域,或根据域内容改变其他域内容。 · Initialize:域调入内存时,激活此事件 · Terminite:域从内存中退出时,激活此事件 版权所有2001 首页-->LOTUS文章-->代理调试方法 在notes编程中,尤其web开发中,代理是很常用的,但是,相对而言,代理的调试也很不方便。下面就我的经验,列出几种常用的方法,欢迎大家指正和补充。(这里讨论的都是lotussript代理) 1.notes端跟踪法 使用notes开发客户端时,对于那些在客户端运行的代理(与服务器端运行相对)可以直接跟踪代理的运行。 方法:选中菜单中“文件-〉工具-〉调试lotusscript”后再运行代理即可。 优点:调试直观,代理可以单步跟踪、设置断点(使用stop语句或者在调试窗口中双击需要加断点的语句)、观察该中断时刻的各种变量和对象的值等。所以使用这种调试方法可以很快地知道问题的所在。 缺点:只适用于客户端运行的代理,而且有些web客户端运行的代理也无法调试。 一些调试技巧: 可以把那些在服务器端运行的代理的核心代码先在客户端调试通过后,再改回服务器端运行,这样有时可以节省很多调试时间。有些web端运行的代理也可照此方法调试。 2.输出调试信息 对于那些在服务器端运行的代理,或在web端运行的代理,可以利用print命令来输出一些关键的信息来帮助你了解问题的所在。 方法:在代理中怀疑有问题的地方或分支点附近加入print命令来打印一些关键信息,从而帮助了解问题的所在。 a.对于处于非调试状态下的notes客户端而言,print的信息将显示在客户端下部的状态条中。 b.对于处于调试状态下的notes客户端而言,print的信息将显示在客户端下部的状态条中和调试窗口的输出窗口中。 c.对于web应用而言,print的信息将直接输出到浏览器中。(但请注意,位于表单的webqueryopen代理中的print输出都将被忽略) d.对于服务器端运行的代理,print的信息将保存在NOTES.LOG文件中 附带说一句,当代理产生错误时,一般都会在domino的命令窗口中产生一个错误信息,说明错误的类型,可能的话,先看看这些信息,了解一下错误的类型,可能会比一上来就盲目地跟踪要好一些。当然,在程序编码的同时,利用on error来建立一些错误报告机制,也有助于更快地分析错误的类型与所在。 3.代理日志 建立一个代理日志,这恐怕是最通用的方法了,但也相对较繁琐。 方法:在代码的头部加入如下代码(xxxx为一随意的日志名,mylog为日志对象的名称,可以自定):dim mylog as new noteslog("xxxx")call mylog.openagentlog在代码需要调试的部分加入下面的语句call mylog.logaction(description$)description$ 是一个字符串常量或变量,内容根据调试的需要而定。这些内容将会写到代理的日志中。 日志的察看方法: a.在designer中打开数据库的代理窗口。 b.在制定的代理上面点击鼠标的右键 c.在弹出的菜单中选择日志即可 注意,代理一旦重新保存,代理日志就会被清空。代理每次运行,新产生的代理日志会覆盖上一次的日志。 版权所有2001 某食堂管理系统,希望根据不同的用户身份,进入相应的页面。下面就是实现这种功能的一段代理的Initialize代码: Sub InitializeOn Error Goto errorsDim session As New notessessionDim note As notesdocumentDim result As VariantDim i As IntegerDim viewname As StringDim querystring As StringDim doc As notesdocumentDim view As notesviewDim normaluserday As VariantDim useridday As Variantnormaluserday=Evaluate("@If(@Weekday(@Today)=1;@Adjust(@Today;0;0;-6;0;0;0);@Adjust(@Today;0;0;2-@Weekday(@Today);0;0;0))")Const notesmcro$=|@ismember("[manager]";@userroles)|'format后的normaluserday是字符串型useridday=Format(normaluserday(0),"yyyy-mm-dd")Set db=session.currentdatabaseSet view=db.getview("vshipu")Set doc=view.getdocumentbykey(useridday)Set note=session.documentcontextresult=Evaluate(notesmcro$)If result(0)=1 Then 'administratorPrint "[/"+getdbpath+"/myview?openform&view=vshipu]"Else 'normal userIf (doc Is Nothing) ThenPrint "本周食谱还未制订,请下次再来,谢谢合作."End IfPrint "[/"+getdbpath+"/vshipu/"+doc.universalid+"?opendocument]"End IfExit Suberrors:Print ErrExit SubEnd Sub 版权所有2001 Notes R5同外部邮件系统路由的设置
我们知道NOTES作为内部邮件系统是非常简单易行的,很受大家欢迎,但习惯于使用 OUTLOOK的用户还是喜欢使用POP3邮件格式,尤其是要和外界的POP3用户交流信息,其实 ,NOTES不仅提供了POP3服务,而且还能通过SMTP(简单邮件传输协议)和其他的POP3邮 件系统进行通讯。本文主要介绍如何和其他POP3邮件系统交换信息。 目标: 1、使NOTES能够同外部邮件系统通讯(包括接收和发送外来和外出邮件); 2、为组织内的非应用用户提供NOTES的邮件服务,这些用户无须安装NOTES客户端软 件,就可以使用NOTES的邮件系统。 配置服务器需要: 1、为服务器 启用"在本地 Internet 网络域外部发送消息时所用的 SMTP" 2、为服务器 启用 SMTP侦听 任务 3、正确设置 DNS 将 DNS服务器 设置为合适的邮件连接服务器。 具体步骤: 一、设置到本地 Internet 网络域外部的 SMTP 路由 必须启用 SMTP 路由在本地 Internet 网络域外部发送消息(如 Internet 或其他 私有网络)。 启用到本地 Internet 网络域外部的 SMTP 路由: 1.确保已准备好发送邮件到 Internet 的系统。 2.确保已经配置了服务器的"配置设置"文档。 3.在 Domino Administrator 中,单击"配置"附签,然后展开"消息处理"区段。 4.选择"配置"。 5.选中"配置设置"文档,然后单击"编辑配置"。 6.在"路由器/SMTP"下的"基本"附签,完成以下域,并保存文档: 域 (在本地 Internet 网络域外部发送消息时所用的 SMTP) 输入 (启用,使用 SMTP 将邮件路由到 Internet) 二、设置服务器接收通过 SMTP 路由发送的邮件 要设置服务器接收 SMTP 路由的消息,必须启用"侦听程序"。然后,服务器则可以 "侦听"TCP/IP 端口(通常端口为 25)上的 SMTP 通信量,并可接收 MAIL.BOX 数据库 中的 SMTP 消息。 注释: 不要将 SMTP 作为任务添加到 Notes .INI 文件中的任务列表中,否则此功 能将无法工作。 启用"侦听程序": 1.在 Domino Administrator 中,单击"配置"附签,然后展开"服务器"区段。 2.选择要编辑的"服务器"文档,然后单击"编辑服务器"。 3.在"基本"附签,完成以下域,然后保存文档: 域 (SMTP 侦听 任务) 输入 ("启用",打开侦听程序,以便服务器可以接收通过 SMTP 路由路由的消息) 三、网络域命名服务 (DNS) 和邮件路由 在网络域名服务器上设置Domino邮件服务器的 A记录和MX记录,使得Domino邮件服 务器能够接收外来邮件;在网络域名服务器上设置非Domino邮件服务器的 A记录和MX记 录,使得Domino邮件服务器能够发送外出邮件。 示例: 该示例实现了两个Domino邮件服务器的邮件路由。 1、首先要确认两台服务器能够互相PING通; 2、要确认两台服务器内部邮件收发畅通; 3、对Domino服务器进行上述修改; 4、在网络域名服务器上设置上设置A记录和MX记录。 Domino服务器1的A记录为: apps.salmon.forward.com. IN A 147.25.8.17 Domino服务器1的MX记录为: salmon.forward.com. IN MX apps.salmon.forward.com. Domino服务器2的A记录为: mail.ntserver.nmg.gov.cn. IN A 147.25.8.66 Domino服务器2的MX记录为: ntserver.nmg.gov.cn. IN MX mail.ntserver.nmg.gov.cn. 注: 1、在邮递失败和 Domino 发送无法邮递消息之前,消息在服务器之间所能传送的最 大次数默认是25次。 2、服务器在重试将消息传送到另一台服务器之前应等待的分钟数。如果再次失败, Domino 将增加等待时间。缺省为 15 分钟。 环境介绍: 1、邮件服务器 2、DNS服务器设置 首页-->LOTUS文章-->如何在Notes开发的程序中实现修改留痕 如何在Notes开发的程序中实现修改留痕Notes 的一项很强大的功能是能够实现工作流审批,但是如何能使每个审批人在对原文进行修改后留下他们的修改痕迹呢?本人写了一段程序在Notes中嵌入word 97实现了该功能,希望对网友有所帮助。具体实现如下:首先在表单中创建一个RTF域body,以嵌入word 97,再做一按钮,该按钮实现对修改的留痕。其源程序为:Dim db As New notesdatabase(servername,"jswfw")Dim handle As Variant Dim doc As NotesDocumentSet doc=source.documentDim rtitem As VariantDim object As NotesEmbeddedObject Set rtitem = doc.GetFirstItem( "Body" )Dim session As New NotesSessionDim user As Stringuser = session.commonUserNameIf ( rtitem.Type = RICHTEXT ) ThenSet object = rtitem.GetEmbeddedObject_( "Microsoft Word 文档" )Set handle=object.activate(False)handle.showgrammaticalerrors=Falsehandle.showspellingerrors=Falsehandle.TrackRevisions = Truehandle.PrintRevisions = Truehandle.ShowRevisions = Truehandle.parent.UserName = userhandle.parent.UserInitials = userhandle.parent.UserAddress = ""handle.save End If 起草人在起草了文章后,单击该按钮,以后对该文章的所有修改都将保留痕迹。
---- 1、建立私有文件夹 ---- 所谓私有文件夹,是指文件夹属于一人私有,其他人看不见这个文件夹。可以通过创建一个"启动后私有"文件夹,每个用户使用该文件夹后,系统立即根据这个启动后私有文件夹创建一个新的属于该用户的文件夹。这样,每个用户都有一个结构完全相同而且互相不干扰的文件夹。这种解决方法保证冲突不会产生,但系统为每个用户保存一个文件夹,会导致系统维护上的困难。如果系统的用户太多,情况会更坏。如果用户注销,它的私有文件夹不会自动删除。 ---- 2、改进的视图方法 ---- 视图一般是大家共享的,我们可以通过改进视图的选择条件,将视图作为我们存储查询结果的地方,就能避免文件夹方式产生的问题。我们提出解决问题的思路是:把满足某一用户查询条件的文档作选择标记,创建一个共享视图,用视图选择公式来显示该用户的查询结果,显示或打印完成后,删除选择标记。具体实现方法如下: ---- (1) 在要查询的数据库文档表单上创建一个可编辑多值的隐含?quot;SelectedUserName"用于存放查询该文档的用户名。 ---- (2) 创建一个共享视图vwSelect,视图公式为: ---- SELECT Form = "frmFormName" & ---- @Contains(SelectedUserName;@UserName) ---- 用于显示该用户查到的文档 ---- (3) 创建一个显示视图的导航器"nvgQueryResult",其初始视图为vwSelect。 ---- (4) 用Sript语言,利用FTSearch函数进行组合条件查询,查找满足条件的文档。 编程实现 ---- (1) 查询显示 ---- 功能:完成按关键字条件查询,显示查询结果. Dim session As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocumentDim view As NotesViewSet db = session.CurrentDatabaseitemvalues=item1.valuesCondition=itemvalues(0)For i=Lbound(itemvalues)+1 to Ubound(itemvalues)Condition=Condition+itemvalues(i)'记载用户输入的全部查询条件NextCount=view.FTSearch(Condition,0) '完成全文查找If count〈〉0 ThenMessagebox"本数据库中共有:"+Str(Count) + "个记录满足条件!",0+64,"提示信息" For j=1 To countSet doc=dc.getnthdocument(j)Set item = doc.GetFirstItem( "SelectedUserName" ) Call item.AppendToTextList( session.UserName ) '在域SelectedUserName中Call doc.Save( True, True )'追加用户名NextServerName = session.GetEnvironmentString("ServerName")DirName = session.GetEnvironmentString("DirectionName")DatabaseName=DirName+"DBName.nsf" '打开导航器调用视图,即显示查询结果Call workspace.OpenDatabase ( ServerName,DatabaseName,"nvgQueryResult" )ElseMessagebox "没有满足条件的记录!",0 +48,"提示信息:"End Ifend(2) 退出显示 功能:清除用户的选择标记 Dim session As New NotesSessionDim db As NotesDatabaseDim doc As NotesDocumentDim view As NotesViewSet db = session.CurrentDatabase ' ViewName = session.GetEnvironmentString("envViewNa")Set view = db.GetView(vwSelect)Set doc = view.GetFirstDocumentUserName=session.UserName'取现用户名到变量:UserNameWhile Not (doc Is Nothing ) TempValue=doc.SelectedUserName '清除文档域"SelectedUserName"中doc.SelectedUserName=""'自己的用户名;Call doc.save(True,False) '同时保留其他用户的用户名.Set item=doc.getfirstitem("SelectedUserName") Forall x In TempValue If x〈〉 UserName Then Call item.AppendToTextList(x ) Call doc.save(True,False) End If End Forall Set doc = view.GetFirstDocument Wend end
Open Source Obfuscators
ProGuard
http://java-source.net/open-source/obfuscators/proguardProGuard is a free Java class file shrinker and obfuscator. It can detect and remove unused classes, fields, m
Maven简介
是什么?
Is a software project management and comprehension tool.项目管理工具
是基于POM概念(工程对象模型)
[设计重复、编码重复、文档重复、构建重复,maven最大化消除了构建的重复]
[与XP:简单、交流与反馈;测试驱动开发、十分钟构建、持续集成、富有信息的工作区]
功能:
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
前面3步应该没有问题,主要的问题是执行make的时候,出现了异常。
异常一:
make[2]: cc: Command not found
异常原因:没有安装g
nimbus结点配置(storm.yaml)信息:
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional inf