使用SSM框架搭建Web服務器實現登錄功能(Spring+SpringMVC+Mybatis)


寫在前面

初學Java EE,雖然知道使用框架會使開發更加便捷高效,但是對於初學者來說,感到使用框架比較迷惑,尤其是各種jar包的引用、各種框架的配置、注解的使用等等。

最好的學習方法就是實踐,於是下載了一個現成的DEMO,通過簡單的修改先成功在自己電腦上跑起來,然后再逐個文件進行分析學習,最終才能從總體的高度上掌握框架的運行機制和配置方法,這樣才能在實際運用中靈活配置,不會再局限於示例框架中。


SSM框架搭建流程

SSM框架Web程序的流程  http://www.linuxidc.com/Linux/2016-08/134273.htm

上面鏈接總結的流程很好,但是該流程沒有加入DAO這一層,經過分析本項目源碼,流程應該是這樣的:

database–>Entity.java–>mapper.xml–>Mapper.java–>Dao.java–>DaoImpl.java–>Service.java–>ServiceImpl.java–>Controller.java–>login.jsp

  • 根據需要建立數據庫、數據表、字段;
  • 根據表中字段建立實體類;
  • 在Mapper中實現對數據庫的增刪改查操作;
  • 設計DAO(data access object)數據操作對象接口;
  • 設計Service,通過DAO獲取對象,然后進行業務邏輯實現;
  • 設計控制層Controller,用於從頁面獲取請求,調用Service處理並將處理結果返回給頁面。

根據上面所列,下面就按照這個流程進行設計。


數據庫設計

使用MySQL數據庫:

  • 建立數據庫 DB_TEST
CREATE DATABASE DB_TEST;
  • 建立用戶表 T_USER
CREATE TABLE T_USER ( ID INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL, USERNAME VARCHAR(16) NOT NULL, PASSWORD VARCHAR(16) NOT NULL );
  • 插入一條用戶信息
INSERT INTO T_USER (USERNAME,PASSWORD) VALUES ("admin","123");

建立USER實體類

public class User { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }

Mapper實現增刪改查


  • UserMapper接口,定義通過用戶名獲取用戶對象的方法
public interface UserMapper { public User getUserByName(String username); }

  • usermapper.xml,用於操作數據庫,實現接口中的方法
  <mapper namespace="com.crm.mapper.UserMapper"> <resultMap type="com.crm.entity.User" id="userMap"> <id property="id" column="id" /> <result property="username" column="username" /> <result property="password" column="password" /> </resultMap> <!-- 此處select標簽的id值對應Mapper類中方法名 --> <select id="getUserByName" parameterType="string" resultMap="userMap"> <!-- 此處寫sql語句,#{Mapper類傳入的參數} --> select * from T_USER where username = #{username} </select> </mapper>

DAO 數據操作對象


  • DAO接口 UserDao.java
public interface UserDao { //接口方法,通過用戶名得到User對象 public User findUserByName(String username); }

  • DAO接口實現 UserDaoImpl.java

@Repository對應數據訪問層Bean

@Repository(value=”userDao”)注解是告訴Spring,讓Spring創建一個名字叫“userDao”的UserDaoImpl實例。

當Service需要使用Spring創建的名為“userDao”的UserDaoImpl實例時, 
就可以使用@Resource(name =”userDao”)注解告訴Spring,Spring把創建好的userDao注入給Service即可。

@Repository("userDao") public class UserDaoImpl implements UserDao { //注解引用Mapper類資源 @Resource(name = "userMapper") private UserMapper userMapper; /* 根據用戶名查找用戶對象 */ public User findUserByName(String username) { //調用Mapper類從數據庫中得到User對象 return userMapper.getUserByName(username); } }

業務層 Service


  • 業務層接口 UserService.java
public interface UserService { // 通過用戶名及密碼核查用戶登錄 public User checkLogin(String username, String password); }

  • 業務層接口實現類 UserServiceImpl.java

@Service對應的是業務層Bean

這樣當Action需要使用UserServiceImpl的的實例時,就可以由Spring創建好的”userService”注入給Action:在Action只需要聲明一個名字叫“userService”的變量來接收由Spring注入的”userService”即可

@Service("userService") public class UserServiceImpl implements UserService { @Resource private UserDao userDao; /* 登陸驗證 */ public User checkLogin(String username, String password) { //根據用戶名實例化用戶對象 User user = userDao.findUserByName(username); if (user != null && user.getPassword().equals(password)) { return user; } return null; } }

控制層 Controller


@Controller對應表現層的Bean,也就是Action

注意:如果@Controller不指定其value【@Controller】,則默認的bean名字為這個類的類名首字母小寫,如果指定value【@Controller(value=”UserAction”)】或者【@Controller(“UserAction”)】,則使用value作為bean的名字。


@Scope(“prototype”)表示將Action的范圍聲明為原型

可以利用容器的scope=”prototype”來保證每一個請求有一個單獨的Action來處理,避免struts中Action的線程安全問題。

spring 默認scope 是單例模式(scope=”singleton”),這樣只會創建一個Action對象,每次訪問都是同一Action對象,數據不安全。

struts2 是要求每次次訪問都對應不同的Action,scope=”prototype” 可以保證當有請求的時候都創建一個Action對象


@RequestMapping(“/user”)

RequestMapping是一個用來處理請求地址映射的注解,可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。


本項目中,該Controller類RequestMapping(”user”) 
該Controller類的login方法RequestMapping(”login”) 
所以登錄頁面中用戶登錄的 action=”/ssm/user/login”


@Controller @Scope(value="prototype") @RequestMapping("/user") public class UserController { @Resource private UserService userService; @RequestMapping(value="/login",method=RequestMethod.POST) public String login(User user,Model model) throws Exception { user=userService.checkLogin(user.getUsername(), user.getPassword()); if(user!=null){ model.addAttribute(user); return "welcome";// 路徑 WEB-INF/pages/welcome.jsp } return "fail"; } }

頁面 JSP


<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>用戶登錄</title> </head> <body> <form action="/ssm/user/login" method="post" id="myform"> <input type="text" id="username" name="username"/> <input type="password" id="password" name="password"/> <input type="submit" value="提交" id="login" /> </form> </body> </html>

DEMO工程中的所有配置文件


applicationContext.xml

這個文件是Spring公共配置文件,下面分塊進行解析。

  • 數據庫配置文件database.properties的引入
    <bean id="property" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <!-- classpath 即src根目錄 --> <value>classpath:database.properties</value> </list> </property> </bean>

  • 數據庫連接池的配置

數據庫連接池可以讓服務器預先與數據庫建立部分連接,存入內存中,以減少連接數據庫的耗時操作。 
此處定義使用C3P0連接池的數據源。

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <!-- 指定連接數據庫的JDBC驅動 --> <property name="driverClass"> <value>${mysql.driver_class}</value> </property> <!-- 連接數據庫所用的URL --> <property name="jdbcUrl"> <value>${mysql.connection.url}</value> </property> <!-- 連接數據庫的用戶名 --> <property name="user"> <value>${mysql.connection.username}</value> </property> <!-- 連接數據庫的密碼 --> <property name="password"> <value>${mysql.connection.password}</value> </property> <!-- 設置數據庫連接池的最大連接數 --> <property name="maxPoolSize"> <value>30</value> </property> <!-- 設置數據庫連接池的最小連接數 --> <property name="minPoolSize"> <value>2</value> </property> <!-- 設置數據庫連接池的初始化連接數 --> <property name="initialPoolSize"> <value>2</value> </property> <!-- 設置數據庫連接池的連接的最大空閑時間,單位為秒 --> <property name="maxIdleTime"> <value>10</value> </property> </bean>

  • 自動掃描配置

使用< context:component-scan>標簽后,spring可以自動去掃描base-pack下面或者子包下面的java文件,如果掃描到有@Component @Controller@Service等這些注解的類,則把這些類注冊為bean

    <context:component-scan base-package="com.crm.*"> <!-- 不掃描注解為controller的類型 --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>

  • 集成Mybatis

SqlSessionFactoryBean是一個工廠bean,它的作用就是解析配置(數據源、別名等)。

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 引用上面已經配置好的數據庫連接池 --> <property name="dataSource" ref="dataSource" /> <!-- Mybatis的配置文件路徑 --> <property name="configLocation" value="classpath:mybatis.xml" /> <!-- mapper配置路徑 --> <property name="mapperLocations"> <list> <value>classpath:com/crm/mapper/*.xml</value> </list> </property> </bean>

  • Mapper掃描配置

dao需要配置,如果數量大不適合一個個配置,需要使用mapper自動掃描來批量進行配置。

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.crm.mapper" /> </bean>

  • Mybatis事務管理配置
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>

數據庫配置文件database.properties

mysql.driver_class=com.mysql.jdbc.Driver
<!-- DB_TEST為新建的數據庫名 --> mysql.connection.url=jdbc:mysql://localhost:3306/DB_TEST <!-- 登錄數據庫的用戶名密碼 --> mysql.connection.username=root mysql.connection.password=root

日志管理文件 log4j.properties

此處省略,入門階段暫不考慮這么高端的日志用法。


Mybatis配置文件

通過使用別名,可以縮短類名的長度,但是只能在配置文件中使用。

<configuration> <!-- 別名 --> <typeAliases> <typeAlias type="com.crm.entity.User" alias="user" /> </typeAliases> </configuration>

web配置文件

此配置文件注釋比較清楚,就不單獨解析了。

    <display-name>crm</display-name> <!--一個server下如果有多個項目,要對webAppRootKey進行配置,讓log能將日志寫到對應項目根目錄下--> <context-param> <param-name>webAppRootKey</param-name> <param-value>crm.root</param-value> </context-param> <!-- 由Sprng載入的Log4j配置文件位置 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>classpath:log4j.properties</param-value> </context-param> <!-- Spring默認刷新Log4j配置文件的間隔,單位為millisecond --> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <!-- Web 項目 Spring 加載 Log4j 的監聽 --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <!-- 設置Spring容器加載配置文件路徑 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:springContext/*Context.xml</param-value> </context-param> <!-- 加載Spring容器配置 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 防止內存泄漏的監聽器 --> <listener> <listener-class> org.springframework.web.util.IntrospectorCleanupListener </listener-class> </listener> <!-- 配置Springmvc核心控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/springmvc.xml</param-value> </init-param> <!-- 立馬啟動servlet --> <load-on-startup>1</load-on-startup> </servlet> <!-- servlet-mapping配置 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 解決工程編碼過濾器 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 設置默認打開頁面列表 --> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>

springmvc配置文件

之前掃描專門忽略了Controller,在此處掃描。

例如在Controller類中常有類似return welcome這樣的語句

其實完整的應該是return WEB-INF/pages/welcome.jsp

    <!-- 注解Controller掃描器 --> <context:component-scan base-package="com.crm.controller"/> <!-- 靜態資源訪問 --> <mvc:resources location="/img/" mapping="/img/**"/> <mvc:resources location="/js/" mapping="/js/**"/> <mvc:resources location="/common/" mapping="/common/**"/> <!-- 注解功能的默認配置,處理器和映射器 --> <bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- 前后綴配置 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"></property> <property name="suffix" value=".jsp"></property> </bean>

至此基本內容已經全部完了,項目可以輕松跑起來了。

但是在學習過程中,發現這些框架真的是太強大了,不知道什么時候才能掌握更多,目前僅僅是會用最基本的皮毛而已。

Spring學習之第一個Spring MVC程序(IDEA開發環境)  http://www.linuxidc.com/Linux/2016-06/132658.htm

SpringMVC總結篇  http://www.linuxidc.com/Linux/2016-06/132659.htm

Spring+SpringMVC企業快速開發架構搭建  http://www.linuxidc.com/Linux/2015-09/122942.htm

SpringMVC的亂碼處理  http://www.linuxidc.com/Linux/2015-07/120542.htm

Spring MVC+Spring3+Hibernate4開發環境搭建 http://www.linuxidc.com/Linux/2013-07/87119.htm 

Spring MVC整合Freemarker基於注解方式 http://www.linuxidc.com/Linux/2013-02/79660.htm 

基於注解的Spring MVC簡單介紹 http://www.linuxidc.com/Linux/2012-02/54896.htm

SpringMVC詳細示例實戰教程 http://www.linuxidc.com/Linux/2015-06/118461.htm

Spring MVC 框架搭建及詳解 http://www.linuxidc.com/Linux/2012-01/52740.htm

SpringMVC 異常處理  http://www.linuxidc.com/Linux/2015-06/119049.htm

本文永久更新鏈接地址http://www.linuxidc.com/Linux/2016-08/134272.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM