首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JSF + Hibernate + Spring 三層架構實現用戶登錄完整示例

     編輯:Java 相關知識

技術棧與環境

  • JSF 1.2_04、Hibernate 3.2.2.ga、Spring 2.0.5
  • JDK 1.5、MyEclipse 6.0、MySQL 5.0

三層架構劃分

層次技術職責
數據訪問層HibernateORM 映射、CRUD 操作
業務邏輯層Spring事務管理、服務編排、IoC 容器
表示層JSF頁面綁定、導航、組件模型

數據庫設計

CREATE DATABASE logon DEFAULT CHARSET utf8;
USE logon;
CREATE TABLE userinfo (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(100) NOT NULL,
    password VARCHAR(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO userinfo (username, password) VALUES ('admin', 'admin');

數據訪問層實現

實體類

public class Userinfo implements Serializable {
    private Integer id;
    private String username;
    private String password;
    // getter/setter 省略
}

Hibernate 映射文件

<hibernate-mapping>
    <class name="com.it168.logon.model.businessobject.Userinfo" table="userinfo">
        <id name="id"><generator class="increment"/></id>
        <property name="username" length="100" not-null="true"/>
        <property name="password" length="100" not-null="true"/>
    </class>
</hibernate-mapping>

DAO 接口與實現

public interface IUserDAO {
    Userinfo getUser(String username);
}

public class UserDAO extends HibernateDaoSupport implements IUserDAO {
    @SuppressWarnings("unchecked")
    public Userinfo getUser(String username) {
        List list = getHibernateTemplate().findByNamedParam(
            "from Userinfo u where u.username = :username", "username", username);
        return (list != null && !list.isEmpty()) ? (Userinfo) list.get(0) : null;
    }
}

業務邏輯層實現

服務接口與實現

public interface IUserService {
    Userinfo login(String username, String password);
}

public class UserService implements IUserService {
    private UserDAO userDAO;
    public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; }

    public Userinfo login(String username, String password) {
        Userinfo user = userDAO.getUser(username);
        if (user != null && !user.getPassword().equals(password)) user = null;
        return user;
    }
}

Spring 配置(applicationContext.xml 片段)

<!-- 數據源 (C3P0) -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/logon"/>
    <property name="user" value="root"/>
    <property name="password" value="123456"/>
    <property name="minPoolSize" value="5"/>
    <property name="maxPoolSize" value="20"/>
</bean>

<!-- Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingResources">
        <list><value>com/it168/logon/model/businessobject/Userinfo.hbm.xml</value></list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<!-- DAO & Service -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="userDAO" class="com.it168.logon.model.dao.impl.UserDAO">
    <property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<bean id="userService" class="com.it168.logon.model.service.impl.UserService">
    <property name="userDAO" ref="userDAO"/>
</bean>

表示層實現

ServiceLocator 獲取 Spring Bean

public class ServiceLocatorBean implements IServiceLocator {
    private static final String USER_SERVICE = "userService";
    private ApplicationContext appContext;
    private UserService userService;

    public ServiceLocatorBean() {
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance()
            .getExternalContext().getContext();
        appContext = WebApplicationContextUtils.getRequiredWebApplicationContext(ctx);
        userService = (UserService) lookupService(USER_SERVICE);
    }
    public IUserService getUserService() { return userService; }
    public Object lookupService(String name) { return appContext.getBean(name); }
}

JSF Managed Bean

public class UserBean {
    private String username, password, errorMessage;
    private boolean loggedIn;
    private ServiceLocatorBean serviceLocator;

    public String verify() {
        Userinfo user = serviceLocator.getUserService().login(username, password);
        if (user == null) {
            errorMessage = "登錄失敗"; loggedIn = false; return "failure";
        } else { loggedIn = true; return "success"; }
    }
    // getter/setter 省略
}

faces-config.xml 配置

<managed-bean>
    <managed-bean-name>serviceLocatorBean</managed-bean-name>
    <managed-bean-class>com.it168.logon.view.bean.ServiceLocatorBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>userBean</managed-bean-name>
    <managed-bean-class>com.it168.logon.view.bean.UserBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>serviceLocator</property-name>
        <value>#{serviceLocatorBean}</value>
    </managed-property>
</managed-bean>

<navigation-rule>
    <from-view-id>/pages/login.jsp</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/pages/welcome.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>failure</from-outcome>
        <to-view-id>/pages/login.jsp</to-view-id>
    </navigation-case>
</navigation-rule>

登錄頁面

<f:view>
<h:form>
    <div align="center"><h:outputText value="#{userBean.errorMessage}" escape="false"/></div>
    <div align="center">
        <h:outputText value="用戶名: "/>
        <h:inputText id="username" required="true" value="#{userBean.username}"/>
        <h:message for="username"/><br/>
    </div>
    <div align="center">
        <h:outputText value="密碼: "/>
        <h:inputSecret id="password" required="true" value="#{userBean.password}"/>
        <h:message for="password"/><br/>
    </div>
    <div align="center">
        <h:commandButton value="登錄" action="#{userBean.verify}"/>
    </div>
</h:form>
</f:view>

運行效果

  • 訪問 https://localhost:8080/Logon/pages/login.jsp
  • 輸入 admin/admin → 導向 welcome.jsp 顯示登錄成功
  • 錯誤密碯 → 留在 login.jsp 顯示「登錄失敗」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved