技術棧與環境
- JSF 1.2_04、Hibernate 3.2.2.ga、Spring 2.0.5
- JDK 1.5、MyEclipse 6.0、MySQL 5.0
三層架構劃分
| 層次 | 技術 | 職責 |
| 數據訪問層 | Hibernate | ORM 映射、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 顯示「登錄失敗」