背景
在Java桌面应用开发中,特别是使用Eclipse RCP框架构建的企业级应用中,经常需要集成数据库管理功能以方便开发者或管理员进行数据查看和维护操作。传统的数据库管理需要单独启动数据库管理工具或打开浏览器访问管理页面,操作流程繁琐且不利于应用集成。
目标
- 嵌入式数据库管理:在Java桌面应用中直接嵌入H2数据库的Web管理控制台,实现数据库操作的无缝集成
- 自动登录认证:通过JavaScript自动填充登录表单,实现一键登录数据库管理界面
- 图形化数据库操作:提供完整的H2数据库Web管理功能,包括SQL执行、表结构查看、数据编辑等
- 简化开发流程:减少开发者在数据库管理和应用开发之间的切换,提升开发效率
实现
基于 Eclipse RCP 技术框架开发,企业级应用的技术。并使用基于 SWT Browser 组件和 JavaScript 自动化技术,实现H2数据库管理界面的自动登录和集成。
嵌入式数据库管理
代码
java
package com.antzou.business.system;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import com.antzou.jpa.common.JPAUtil;
public class DbaComposite extends Composite {
private Browser browser;
private boolean credentialsFilled = false;
public DbaComposite(Composite parent, int style) {
super(parent, style);
createContent();
}
private void createContent() {
setLayout(new GridLayout(1, false));
browser = new Browser(this, SWT.NONE | SWT.WEBKIT);
browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
browser.addProgressListener(new ProgressListener() {
@Override
public void completed(ProgressEvent event) {
if (!credentialsFilled && browser.getUrl().contains("login.jsp")) {
fillCredentials();
credentialsFilled = true;
}
}
@Override
public void changed(ProgressEvent event) {
}
});
browser.setUrl("http://localhost:" + JPAUtil.H2_WEB_PORT + "?language=zh_CN");
}
private void fillCredentials() {
// 执行JavaScript来自动填充登录表单
String script = String.format("var userField = document.querySelector('input[name=\"user\"]');"
+ "var passwordField = document.querySelector('input[name=\"password\"]');"
+ "var urlField = document.querySelector('input[name=\"url\"]');"
+ "if (userField && passwordField && urlField) {"
+ " userField.value = '%s';"
+ " passwordField.value = '%s';"
+ " urlField.value = '%s';"
+ " document.querySelector('input[type=\"submit\"]').click();" + "}", "antrcp", "antrcp", "jdbc:h2:file:~/.antrcp/assistant");
browser.execute(script);
}
}