我创建了一个Java脚本库,它有一个包含一些jdbc代码的java类。
它有一个从数据库(mysql)获取值的方法。
现在我需要在重复控件中访问它,例如<xp:repeat value = ?? >
但是我找不到在那里访问它的方法。
如果是javascript库,则该方法将以<xp:repeat value="#{javascript:getSQLData()}"
如何实现呢?当我们在代码部分(在应用程序视图中的脚本库下面)中有一个名为Java的独立应用程序时,它是否是在脚本库中使用java的正确方法。
我的java代码是:
package com.db;
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List;
公共类Db {
Connection con;
Statement st;
ResultSet rs;
public Db(){
this.connect("localhost", "3306", "vijay", "root", "");
try {
this.query("select * from prodet;");
} catch (SQLException e) {
// TODO Auto-generated catch block
System.out.println("///////////////query///////////////////////////////////////////");
e.printStackTrace();
}
}
public void connect(String server, String port, String db, String user, String pwd){
try {
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager
.getConnection("jdbc:mysql://localhost:3306/vijay","root", "");
//con=DriverManager.getConnection("\"jdbc:mysql://"+server+":"+port+"/"+db+"\""+","+"\""+user+"\""+","+"\""+pwd+"\"");
st=con.createStatement();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
List arr = new ArrayList();
@SuppressWarnings("unchecked")
public void query(String q) throws SQLException{
rs=st.executeQuery(q);
while(rs.next()){
arr.add(rs.getString(2));
arr.add(rs.getInt(3));
}
}
public String getData(){
String arra = arr.toString();
return arra;
}
public String doAllDb(){
return this.getData();
}
public static void main(String a[]){
Db d = new Db();
System.out.println(d.getData());
}
}
访问该方法的ssj是:
importPackage(com.db);
var v = new com.db.Db(); v.doAllDb();
这个ssjs是使用ssjs在Bind数据下编写的。
<xp:repeat id="repeat1" rows="30">
<xp:this.value><![CDATA[#{javascript:importPackage(com.db);
var v = new com.db.Db(); v.doAllDb();}]]&GT;
预览xpage时,它为空白。没有显示任何价值。但我测试了java代码。它工作正常。
答案 0 :(得分:2)
我一直使用托管bean来做到这一点: - )
<xp:repeat rows="10" var="row" value="#{User.rowClubs}">
“用户”是我的托管bean。它必须是一个实现可序列化接口的Java bean,具有不带参数的构造函数,并具有用于访问属性的公共getter / setter。在我的例子中,User bean实现了方法getRowClubs(),它返回一个表示俱乐部行的对象列表(来自我今天早上工作的应用程序)。
如果您需要有关托管bean的更多帮助,请告诉我们?根据你的问题,我猜你需要有关如何在bean中引用方法的帮助。
修改强>
我刚看到你的bean的其余部分(在可滚动的视图中)。使用你的bean你会使用类似的东西:
<xp:repeat id="repeat1" rows="30" value="Db.data" var="row">
假设您已在faces-config.xml中定义了bean,例如:
<managed-bean>
<managed-bean-name>Db</managed-bean-name>
<managed-bean-class>com.db.Db</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
我还建议您从bean中删除“main”方法。如果你需要从普通的Java程序中测试它,那么创建一个带有“main”的测试类来实例化并运行你的bean。
/约翰