我正在通过操作按钮上的JS代码创建一个新数据库,然后我将一组XPages,Custom Controls等复制到新数据库中。虽然我这样做,但我想将xsp.properties的内容设置为一组已知的属性。我不确定如何从js访问xsp.properties文件。 我已经创建了所有设计元素的Notes视图,并且可以看到WEB-INF / xsp.properties下列出的三个或四个元素,但不确定要从哪个元素中读取。我真正想做的是让新数据库中的xsp.properties与我复制的数据库相同。
由于
答案 0 :(得分:2)
您可以通过Java NAPI执行此操作。为此,您必须创建一个新的Java类:
package ch.hasselba.xpages.util;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Properties;
import com.ibm.designer.domino.napi.NotesAPIException;
import com.ibm.designer.domino.napi.NotesDatabase;
import com.ibm.designer.domino.napi.NotesNote;
import com.ibm.designer.domino.napi.NotesSession;
import com.ibm.designer.domino.napi.design.FileAccess;
public class Toolbox {
/**
* loads the properties from a file
*
* @param dbPath full path of the database
* @param fileName name of the file to load
* @return the properties object
*/
public Properties loadProperties(final String dbPath, final String fileName) {
try {
// load the file
InputStream inStream = getFile( dbPath, fileName );
// if file exists, init a properties object
if (inStream != null) {
Properties props = new Properties();
props.load( inStream );
return props;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* saves a property file to a database
*
* @author Sven Hasselbach
*
* @param dbPath full path of the database
* @param fileName name of the file to load
* @param props the properties object
*/
public void saveProperties(final String dbPath, final String fileName, final Properties props) {
try {
// init Notes objects
NotesSession nSession = new NotesSession();
NotesDatabase nDB = nSession.getDatabaseByPath(dbPath);
nDB.open();
// store properties in byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
props.store(bos, "My XSP Properties");
// save the property file
NotesNote nFile = FileAccess.getFileByPath(nDB, fileName);
FileAccess.saveData(nFile, fileName, bos.toByteArray() );
// recycle the objects
nFile.recycle();
nDB.recycle();
nSession.recycle();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* loads a property file from a database
*
* @author Sven Hasselbach
* @param dbPath full path of the database
* @param fileName name of the file to load
* @return InputStream content of the file
*/
private InputStream getFile(final String dbPath, final String fileName) {
try {
// init Notes objects
NotesSession nSession = new NotesSession();
NotesDatabase nDB = nSession.getDatabaseByPath(dbPath);
nDB.open();
// get the file
NotesNote nNote = FileAccess.getFileByPath(nDB, fileName);
InputStream inStream = FileAccess.readFileContentAsInputStream(nNote);
// recycle the objects
nNote.recycle();
nDB.recycle();
nSession.recycle();
return inStream;
} catch (NotesAPIException apiEx) {
apiEx.printStackTrace();
}
return null;
}
}
要编译此类,您必须将Jar lwpd.domino.napi.jar 添加到构建路径。
现在您可以创建一个这样的按钮:
<xp:button
value="Add property"
id="button1">
<xp:eventHandler
event="onclick"
submit="true"
refreshMode="complete">
<xp:this.action>
<![CDATA[#{javascript:
importPackage( ch.hasselba.xpages.util );
var toolbox:ch.hasselba.xpages.utils.Toolbox = new Toolbox();
var props:java.util.Properties = toolbox.loadProperties( database.getFilePath(), "WEB-INF/xsp.properties" );
props.put( "Test", "123" );
toolbox.saveProperties( database.getFilePath(), "WEB-INF/xsp.properties", props );
}]]>
</xp:this.action>
</xp:eventHandler>
</xp:button>
答案 1 :(得分:1)
最简单的方法是不复制设计元素,而是从模板创建数据库。创建一个模板,其中包含您创建的所有数据库中应该相同的所有内容。给它一个模板名称并根据模板创建数据库(那里有一个调用)
答案 2 :(得分:0)
用Java眼睛看它。
属性文件是J2EE应用程序的标准资源,其own API。因此,根据this,您只需在Java / SSJS中读取和写入属性:
public void saveParamChanges() {
try {
Properties props = new Properties();
props.setProperty("ServerAddress", serverAddr);
props.setProperty("ServerPort", ""+serverPort);
props.setProperty("ThreadCount", ""+threadCnt);
File f = new File("server.properties");
OutputStream out = new FileOutputStream( f );
props.store(out, "This is an optional header comment string");
}
catch (Exception e ) {
e.printStackTrace();
}
}
this snippet似乎也在起作用。
我几乎肯定你需要调整安全策略......