You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:10:16