如何不使用JSP、Servlet实现Java页面跳转?基于Hibernate纯Java登录页
纯Java实现Hibernate登录后的页面跳转(无JSP/Servlet/HTML)
嘿,我明白你的需求了——用纯Java(完全不用JSP、Servlet、HTML这些Web技术)实现登录后的页面跳转,而且你已经用Hibernate写了登录查询的部分代码。咱们直接用Java桌面GUI框架来搞定这个事儿,比如Swing或者JavaFX,这俩都是纯Java原生支持的,完全符合你的要求。
方案一:基于Swing的实现
Swing是Java自带的桌面UI框架,不需要额外依赖,适合快速实现简单的桌面应用。下面是整合你Hibernate代码的完整示例:
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.query.Query; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; public class LoginApp { // 登录窗口组件 private JFrame loginFrame; private JTextField usernameField; private JPasswordField passwordField; private JButton loginBtn; // Hibernate相关对象 private SessionFactory sessionFactory; public LoginApp() { // 初始化Hibernate(复用你原有的配置代码) initHibernate(); // 初始化登录界面 initLoginUI(); } private void initHibernate() { org.hibernate.cfg.AnnotationConfiguration acfg = new org.hibernate.cfg.AnnotationConfiguration().configure(); sessionFactory = acfg.buildSessionFactory(); } private void initLoginUI() { loginFrame = new JFrame("登录页面"); loginFrame.setSize(300, 200); loginFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); loginFrame.setLayout(new GridLayout(3, 2, 10, 10)); loginFrame.setLocationRelativeTo(null); // 窗口居中 // 添加用户名输入项 loginFrame.add(new JLabel("用户名:")); usernameField = new JTextField(); loginFrame.add(usernameField); // 添加密码输入项 loginFrame.add(new JLabel("密码:")); passwordField = new JPasswordField(); loginFrame.add(passwordField); // 添加登录按钮 loginBtn = new JButton("登录"); loginFrame.add(loginBtn); // 绑定登录按钮点击事件 loginBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { performLogin(); } }); loginFrame.setVisible(true); } private void performLogin() { String username = usernameField.getText().trim(); String password = new String(passwordField.getPassword()).trim(); Session session = sessionFactory.openSession(); try { // 调整查询逻辑:根据用户名密码验证用户(替换成你的实体类字段名) Query query = session.createQuery("from RegistrationPage_DTO where username = :username and password = :password"); query.setParameter("username", username); query.setParameter("password", password); List<?> userList = query.list(); if (!userList.isEmpty()) { // 登录成功:关闭登录窗口,打开主界面 JOptionPane.showMessageDialog(loginFrame, "登录成功!"); loginFrame.dispose(); new MainPage(); } else { JOptionPane.showMessageDialog(loginFrame, "用户名或密码错误!"); } } finally { session.close(); } } // 跳转后的主界面窗口 static class MainPage { public MainPage() { JFrame mainFrame = new JFrame("主界面"); mainFrame.setSize(400, 300); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setLayout(new BorderLayout()); mainFrame.setLocationRelativeTo(null); mainFrame.add(new JLabel("欢迎进入主界面!", JLabel.CENTER), BorderLayout.CENTER); mainFrame.setVisible(true); } } public static void main(String[] args) { // 启动Swing应用(确保UI线程安全) SwingUtilities.invokeLater(LoginApp::new); } }
核心逻辑说明:
- 把你原有的Hibernate查询逻辑整合到登录验证方法中,添加了用户名密码的条件查询(如果你的
RegistrationPage_DTO字段名不是username/password,记得修改对应参数) - 登录成功后,调用
loginFrame.dispose()关闭当前登录窗口,然后实例化MainPage类打开新的主界面窗口,这就实现了“页面跳转”的效果
方案二:基于JavaFX的实现
JavaFX是Java官方推荐的现代桌面UI框架,比Swing更美观、功能更丰富,适合打造更精致的桌面应用:
import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.query.Query; import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.GridPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.util.List; public class LoginFXApp extends Application { private SessionFactory sessionFactory; @Override public void init() { // 初始化Hibernate(复用你原有的配置代码) org.hibernate.cfg.AnnotationConfiguration acfg = new org.hibernate.cfg.AnnotationConfiguration().configure(); sessionFactory = acfg.buildSessionFactory(); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("登录页面"); // 构建登录界面布局 GridPane grid = new GridPane(); grid.setPadding(new Insets(10, 10, 10, 10)); grid.setVgap(8); grid.setHgap(10); Label usernameLabel = new Label("用户名:"); GridPane.setConstraints(usernameLabel, 0, 0); TextField usernameField = new TextField(); GridPane.setConstraints(usernameField, 1, 0); Label passwordLabel = new Label("密码:"); GridPane.setConstraints(passwordLabel, 0, 1); PasswordField passwordField = new PasswordField(); GridPane.setConstraints(passwordField, 1, 1); Button loginBtn = new Button("登录"); GridPane.setConstraints(loginBtn, 1, 2); grid.getChildren().addAll(usernameLabel, usernameField, passwordLabel, passwordField, loginBtn); // 绑定登录按钮点击事件 loginBtn.setOnAction(e -> { String username = usernameField.getText().trim(); String password = passwordField.getText().trim(); Session session = sessionFactory.openSession(); try { // 调整查询逻辑:根据用户名密码验证用户(替换成你的实体类字段名) Query query = session.createQuery("from RegistrationPage_DTO where username = :username and password = :password"); query.setParameter("username", username); query.setParameter("password", password); List<?> userList = query.list(); if (!userList.isEmpty()) { // 登录成功:关闭登录窗口,打开主界面 showMainPage(); primaryStage.close(); } else { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setTitle("登录失败"); alert.setContentText("用户名或密码错误!"); alert.showAndWait(); } } finally { session.close(); } }); Scene scene = new Scene(grid, 300, 200); primaryStage.setScene(scene); primaryStage.show(); } // 跳转后的主界面 private void showMainPage() { Stage mainStage = new Stage(); mainStage.setTitle("主界面"); Label welcomeLabel = new Label("欢迎进入主界面!"); welcomeLabel.setStyle("-fx-font-size: 18px;"); VBox layout = new VBox(20); layout.setPadding(new Insets(20, 20, 20, 20)); layout.getChildren().add(welcomeLabel); Scene scene = new Scene(layout, 400, 300); mainStage.setScene(scene); mainStage.show(); } public static void main(String[] args) { launch(args); } }
核心逻辑说明:
- 整体逻辑和Swing方案一致,只是用JavaFX的组件和API实现UI
- JavaFX的UI更现代化,支持CSS样式定制,适合需要更美观界面的场景
内容的提问来源于stack exchange,提问作者Rohit Verma
相关产品推荐
相关产品推荐

