CRM客户关系管理系统开发第二讲——实现用户的注册和登录功能
實現用戶注冊功能
創(chuàng)建用戶表
首先創(chuàng)建一個數據庫(例如crm),并在該數據庫下新建一張用戶表,筆者這里使用的數據庫是MySQL。
create database crm; use crm;CREATE TABLE `sys_user` (`user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用戶id',`user_code` varchar(32) NOT NULL COMMENT '用戶賬號',`user_name` varchar(64) NOT NULL COMMENT '用戶名稱',`user_password` varchar(32) NOT NULL COMMENT '用戶密碼',`user_state` char(1) NOT NULL COMMENT '1:正常,0:暫停',PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;創(chuàng)建User實體類及其對應的映射配置文件
在com.meimeixia.crm.domain包下創(chuàng)建一個User實體類及其相對應的映射配置文件。
-
User實體類
package com.meimeixia.crm.domain;/*** 用戶的實體* @author liayun**/ public class User {private Long user_id;private String user_code;//用戶名private String user_name;//真實姓名private String user_password;private String user_state;public Long getUser_id() {return user_id;}public void setUser_id(Long user_id) {this.user_id = user_id;}public String getUser_code() {return user_code;}public void setUser_code(String user_code) {this.user_code = user_code;}public String getUser_name() {return user_name;}public void setUser_name(String user_name) {this.user_name = user_name;}public String getUser_password() {return user_password;}public void setUser_password(String user_password) {this.user_password = user_password;}public String getUser_state() {return user_state;}public void setUser_state(String user_state) {this.user_state = user_state;}} -
User.hbm.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.meimeixia.crm.domain.User" table="sys_user"><id name="user_id" column="user_id"><generator class="native"></generator></id><property name="user_code" column="user_code" /><property name="user_name" column="user_name" /><property name="user_password" column="user_password" /><property name="user_state" column="user_state" /></class> </hibernate-mapping>
編寫web層
首先,在com.meimeixia.crm.web.action包下創(chuàng)建一個UserAction類,并在里面寫一個用戶注冊的方法。
package com.meimeixia.crm.web.action;import com.meimeixia.crm.domain.User; import com.meimeixia.crm.service.UserService; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven;/*** 用戶管理的Action類* @author liayun**/ public class UserAction extends ActionSupport implements ModelDriven<User> {//模型驅動使用的對象private User user = new User();@Overridepublic User getModel() {return user;}//注入serviceprivate UserService userService;public void setUserService(UserService userService) {this.userService = userService;}/** 用戶注冊的方法(regist)*/public String regist() {userService.regist(user);return LOGIN;}}在UserAction類中,我們注入了service。然后,將UserAction交給Spring來管理。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 引入外部屬性文件 --><context:property-placeholder location="classpath:jdbc.properties" /><!-- 配置C3P0連接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClass}" /><property name="jdbcUrl" value="${jdbc.url}" /><property name="user" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></bean><!-- 配置UserAction --><bean id="userAction" class="com.meimeixia.crm.web.action.UserAction" scope="prototype"><property name="userService" ref="userService"></property></bean></beans>配置UserAction時,需要注意兩個地方,一是該Action需要配置為多例的,二是需要自己手動注入service。
最后,我們還要記得在Struts2配置文件中(即struts.xml)對UserAction進行配置,就像下面這樣:
編寫service層
首先,在com.meimeixia.crm.service包下創(chuàng)建一個UserService接口,在該接口中添加一個用戶注冊的方法聲明,如下:
package com.meimeixia.crm.service;import com.meimeixia.crm.domain.User;/*** 用戶管理的業(yè)務層的接口* @author liayun**/ public interface UserService {void regist(User user);}然后,在com.meimeixia.crm.service.impl包下編寫以上接口的一個實現類——UserServiceImpl.java。
package com.meimeixia.crm.service.impl;import com.meimeixia.crm.dao.UserDao; import com.meimeixia.crm.domain.User; import com.meimeixia.crm.service.UserService; import com.meimeixia.crm.utils.MD5Utils;/*** 用戶管理的業(yè)務層的實現類* @author liayun**/ public class UserServiceImpl implements UserService {//注入daoprivate UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}//業(yè)務層注冊用戶的方法@Overridepublic void regist(User user) {//對密碼進行加密的處理user.setUser_password(MD5Utils.md5(user.getUser_password()));user.setUser_state("1");//1代表正常狀態(tài)//調用daouserDao.save(user);}}在以上實現類中,我們注入了dao,并且對密碼進行了簡單的加密處理。其中,MD5Utils工具類的具體代碼如下:
package com.meimeixia.crm.utils;import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException;/*** 用的是比較簡單的一個加密算法(md5加密算法)* @author liayun**/ public class MD5Utils {/*** 使用md5的算法進行加密*/public static String md5(String plainText) {byte[] secretBytes = null;try {secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());} catch (NoSuchAlgorithmException e) {throw new RuntimeException("沒有md5這個算法!");}String md5code = new BigInteger(1, secretBytes).toString(16);// 16進制數字// 如果生成數字未滿32位,需要前面補0for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}public static void main(String[] args) {System.out.println(md5("123"));}}像這樣的工具類,公司一般都會提供的,我們直接拿過來用就可以了,但有時候,我們難免要自己去編寫一些工具類。
最后,將以上實現類交給Spring來管理。
編寫dao層
Spring整合Hibernate框架的時候,雖然可以不用創(chuàng)建Hibernate的核心配置文件,但還是要把Hibernate核心配置文件中的基本信息配置和映射文件的引入放到Spring配置文件中進行配置。所以,這時Spring配置文件的內容就應修改為下面這個樣子。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- Spring整合Hibernate~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --><!-- 引入Hibernate的配置信息。Spring通過加載這些Hibernate的配置信息,幫我們生成SessionFactory --><bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><!-- 注入連接池 --><property name="dataSource" ref="dataSource" /><!-- 配置Hibernate的相關屬性 --><property name="hibernateProperties"><props><!-- 配置Hibernate的方言 --><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><!-- 打印sql語句 --><prop key="hibernate.show_sql">true</prop><!-- 格式化sql語句 --><prop key="hibernate.format_sql">true</prop><!-- 自動創(chuàng)建表 --><prop key="hibernate.hbm2ddl.auto">update</prop></props></property><!-- 引入映射文件 --><property name="mappingResources"><list><value>com/meimeixia/crm/domain/User.hbm.xml</value></list></property></bean><!-- 引入外部屬性文件 --><context:property-placeholder location="classpath:jdbc.properties" /><!-- 配置C3P0連接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClass}" /><property name="jdbcUrl" value="${jdbc.url}" /><property name="user" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></bean><!-- 配置UserAction --><bean id="userAction" class="com.meimeixia.crm.web.action.UserAction" scope="prototype"><property name="userService" ref="userService"></property></bean><!-- 配置service --><bean id="userService" class="com.meimeixia.crm.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"></property></bean></beans>然后,在com.meimeixia.crm.dao包下創(chuàng)建一個UserDao接口,并在該接口中添加一個用戶注冊的方法聲明,如下:
package com.meimeixia.crm.dao;import com.meimeixia.crm.domain.User;/*** 用戶管理的dao的接口* @author liayun**/ public interface UserDao {void save(User user);}接著,在com.meimeixia.crm.dao.impl包下編寫以上接口的一個實現類(UserDaoImpl.java)。
package com.meimeixia.crm.dao.impl;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;import com.meimeixia.crm.dao.UserDao; import com.meimeixia.crm.domain.User;/*** 用戶管理的dao的實現類* @author liayun**/ public class UserDaoImpl extends HibernateDaoSupport implements UserDao {//dao中保存用戶的方法@Overridepublic void save(User user) {this.getHibernateTemplate().save(user);}}從以上UserDaoImpl實現類的代碼中,我們可以看出它繼承了HibernateDaoSupport類,繼承該類有什么好處呢?查看該類的源代碼,可以發(fā)現在它的源代碼里面,提供了一個setSessionFactory(SessionFactory sessionFactory)方法,如果你給它注入了一個SessionFactory對象的話,那么它便會使用這個SessionFactory對象幫你創(chuàng)建一個Hibernate模板類的對象。所以,在將以上UserDaoImpl實現類交給Spring來管理時,應該使用property標簽注入sessionFactory屬性。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- Spring整合Hibernate~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --><!-- 引入Hibernate的配置信息。Spring通過加載這些Hibernate的配置信息,幫我們生成SessionFactory --><bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"><!-- 注入連接池 --><property name="dataSource" ref="dataSource" /><!-- 配置Hibernate的相關屬性 --><property name="hibernateProperties"><props><!-- 配置Hibernate的方言 --><prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop><!-- 打印sql語句 --><prop key="hibernate.show_sql">true</prop><!-- 格式化sql語句 --><prop key="hibernate.format_sql">true</prop><!-- 自動創(chuàng)建表 --><prop key="hibernate.hbm2ddl.auto">update</prop></props></property><!-- 引入映射文件 --><property name="mappingResources"><list><value>com/meimeixia/crm/domain/User.hbm.xml</value></list></property></bean><!-- 引入外部屬性文件 --><context:property-placeholder location="classpath:jdbc.properties" /><!-- 配置C3P0連接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${jdbc.driverClass}" /><property name="jdbcUrl" value="${jdbc.url}" /><property name="user" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></bean><!-- 配置UserAction --><bean id="userAction" class="com.meimeixia.crm.web.action.UserAction" scope="prototype"><property name="userService" ref="userService"></property></bean><!-- 配置service --><bean id="userService" class="com.meimeixia.crm.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"></property></bean><!-- 配置dao --><bean id="userDao" class="com.meimeixia.crm.dao.impl.UserDaoImpl"><property name="sessionFactory" ref="sessionFactory"></property></bean></beans>配置Spring的事務管理
這里,我們會使用Spring基于注解方式的聲明式事務管理,因為寫起來更加簡單。
- 第一步,配置事務管理器。
- 第二步,開啟事務注解。
- 第三步,在業(yè)務層中的實現類(UserDaoImpl)上添加@Transactional注解。
至此,用戶注冊功能就算是開發(fā)好了,接下來,便來測試開發(fā)好的用戶注冊功能。
測試用戶注冊功能
發(fā)布我們的項目到Tomcat服務器并啟動,然后訪問該項目的登錄頁面,點擊注冊按鈕,跳轉到用戶注冊頁面,緊接著填寫完相關用戶注冊信息,點擊注冊系統(tǒng)按鈕即可完成用戶的注冊。
實現用戶登錄功能
在登錄頁面(login.jsp)中修改提交路徑
編寫web層
首先,在UserAction類里面編寫一個用戶登錄的方法。
package com.meimeixia.crm.web.action;import com.meimeixia.crm.domain.User; import com.meimeixia.crm.service.UserService; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven;/*** 用戶管理的Action類* @author liayun**/ public class UserAction extends ActionSupport implements ModelDriven<User> {//模型驅動使用的對象private User user = new User();@Overridepublic User getModel() {return user;}//注入Serviceprivate UserService userService;public void setUserService(UserService userService) {this.userService = userService;}/** 用戶注冊的方法(regist)*/public String regist() {userService.regist(user);return LOGIN;}/** 用戶登錄的方法(login)*/public String login() {//調用業(yè)務層查詢用戶User existUser = userService.login(user);if (existUser == null) {//登錄失敗//添加錯誤信息this.addActionError("用戶名或密碼錯誤!");return LOGIN;} else {//登錄成功 // ServletActionContext.getRequest().getSession().setAttribute("existUser", existUser);//或者寫成下面這樣:ActionContext.getContext().getSession().put("existUser", existUser);return SUCCESS;}}}然后,我們還得在Struts2配置文件中(即struts.xml)對UserAction進行如下的配置,即配置頁面的跳轉:當用戶登錄成功之后,重定向到項目的首頁,而當用戶登錄失敗后,還是跳轉回登錄頁面。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><!-- 配置Strust2的一些常量 --><constant name="struts.action.extension" value="action" /><package name="crm" extends="struts-default" namespace="/"><action name="user_*" class="userAction" method="{1}"><result name="login">/login.jsp</result><result name="success" type="redirect">/index.jsp</result></action></package></struts>編寫service層
首先,在UserService接口中添加一個用戶登錄的方法聲明,如下:
package com.meimeixia.crm.service;import com.meimeixia.crm.domain.User;/*** 用戶管理的業(yè)務層的接口* @author liayun**/ public interface UserService {void regist(User user);User login(User user);}然后,在以上接口的一個實現類(UserServiceImpl.java)中去實現用戶登錄的方法。
package com.meimeixia.crm.service.impl;import org.springframework.transaction.annotation.Transactional;import com.meimeixia.crm.dao.UserDao; import com.meimeixia.crm.domain.User; import com.meimeixia.crm.service.UserService; import com.meimeixia.crm.utils.MD5Utils;/*** 用戶管理的業(yè)務層的實現類* @author liayun**/ @Transactional public class UserServiceImpl implements UserService {//注入daoprivate UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}//業(yè)務層注冊用戶的方法@Overridepublic void regist(User user) {//對密碼進行加密的處理user.setUser_password(MD5Utils.md5(user.getUser_password()));user.setUser_state("1");//1代表正常狀態(tài)//調用daouserDao.save(user);}//業(yè)務層用戶登錄的方法@Overridepublic User login(User user) {user.setUser_password(MD5Utils.md5(user.getUser_password()));//調用daoreturn userDao.login(user);}}編寫dao層
首先,在UserDao接口中添加一個用戶登錄的方法聲明,如下:
package com.meimeixia.crm.dao;import com.meimeixia.crm.domain.User;/*** 用戶管理的dao的接口* @author liayun**/ public interface UserDao {void save(User user);User login(User user);}然后,在以上接口的一個實現類(UserDaoImpl.java)中去實現用戶登錄的方法。
package com.meimeixia.crm.dao.impl;import java.util.List;import org.springframework.orm.hibernate5.support.HibernateDaoSupport;import com.meimeixia.crm.dao.UserDao; import com.meimeixia.crm.domain.User;/*** 用戶管理的dao的實現類* @author liayun**/ public class UserDaoImpl extends HibernateDaoSupport implements UserDao {//dao中保存用戶的方法@Overridepublic void save(User user) {this.getHibernateTemplate().save(user);}//dao中根據用戶名和密碼進行查詢的方法@Overridepublic User login(User user) {List<User> list = (List<User>) this.getHibernateTemplate().find("from User where user_code = ? and user_password = ?", user.getUser_code(), user.getUser_password());//判斷一下if (list.size() > 0) {return list.get(0);}return null;}}在頁面中顯示數據
用戶登錄成功之后,在首頁顯示用戶信息
當用戶登錄成功之后,我們要在首頁(也即top.jsp頁面)上顯示其用戶信息。
用戶登錄失敗之后,在登錄頁面上顯示錯誤信息
當用戶登錄失敗之后,我們要在登錄頁面上顯示錯誤信息。
至此,用戶登錄的功能,我們就已經實現了,至于測試的話,我就不再這里測試了(偷懶了),反正是好使的!
總結
以上是生活随笔為你收集整理的CRM客户关系管理系统开发第二讲——实现用户的注册和登录功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿尔法测试与贝塔测试
- 下一篇: 学生信息管理系统-错误总结