SSH2框架整合--實現登錄
- 2020 年 2 月 18 日
- 筆記
知識點回顧

開始整合(使用Maven)
使用Maven新建一個項目:(關於Eclipse中使用Maven可參看這篇文章)
新建好一個空的Maven項目結構是這樣的

接下來你需要在pom.xml中配置項目需要的jar包,eclipse會為你下載,以後開發時,你可以(到Maven的官網查找需要的包進行下載)
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com</groupId> <artifactId>SSH2LoginDemo</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>SSH2LoginDemo Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <!-- 導入junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- 導入基本的javax.servlet --> <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <!-- 導入Mysql的連接驅動包 --> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-spring-plugin --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-spring-plugin</artifactId> <version>2.5</version> </dependency> <!-- http://projects.spring.io/spring-framework/ --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.5.RELEASE</version> </dependency> <!-- http://projects.spring.io/spring-framework/ --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.3.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.3.5.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.10</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.9.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/org.javassist/javassist --> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.22.0-CR1</version> </dependency> <!-- druid連接池 --> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.26</version> </dependency> <!-- j2ee的註解 --> <!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api --> <dependency> <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <finalName>SSH2LoginDemo</finalName> </build> </project>
新建四個文件放在src/main/resource中
- applicationContext.xml(配置spring) - jdbc.properties(資料庫連接的屬性文件) - log4j.properties(日誌記錄屬性文件) - struts.xml(struts2的配置文件)
先寫上日誌記錄需要的屬性文件,其他三個文件具體內容在編碼時給出 log4j.properties
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file mylog.log ### log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=D:mylog.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=warn, stdout之後你需要在src/main/webapp/WEB-INF/web.xml中添加Spring的核心監聽器和Struts2的過濾器
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <display-name>SSH2LoginDemo</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- needed for ContextLoaderListener --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- Bootstraps the root web application context before servlet initialization --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置struts2攔截器-核心過濾器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
具體編碼前,我們先創建包和文件結構,結構圖如下:

開始編碼:
一. 視圖層(登錄:login.jsp ,登錄成功:loginSuccess.jsp ,登錄失敗:回到login.jsp)
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登錄</title> </head> <body> <!-- 如果登錄失敗,顯示登錄失敗資訊 --> <h1><s:property value="fieldErrors.loginFail"/></h1> <form action="user_login" method="post"> 用戶名:<input type="text" name="username"> 密碼:<input type="password" name="password"> <input type="submit" value="登錄"> </form> </body> </html>
loginSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>登錄成功</title> </head> <body> <!-- 歡迎消息,顯示登陸用戶的用戶名 --> <h1>歡迎你:<s:property value="username"/></h1> <s:debug></s:debug> </body> </html>
二.控制層(UserAction),通過Struts.xml配置請求的Action
Struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> <struts> <!-- 開發模式 --> <constant name="struts.devMode" value="true"></constant> <!-- action的配置 --> <package name="ssh" namespace="/" extends="struts-default"> <!-- 為了安全起見,Struts2對Action中可執行的方法進行了聲明,此處聲明為全部 --> <global-allowed-methods>regex:.*</global-allowed-methods> <!-- 匹配方法,Action交給了Spring管理,所以class屬性這樣寫 --> <action name="user_*" class="userAction" method="{1}"> <!-- 成功跳轉到登錄成功頁面 --> <result name="success">/loginSuccess.jsp</result> <!-- 失敗回到登錄頁面 --> <result name="error">/login.jsp</result> </action> </package> </struts>UserAction.java
package com.action; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.domain.User; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.service.UserService; /** * 控制層繼承ActionSupport,實現模型驅動 * @author 何軍 * */ @Controller // 該註解告訴Spring這是一個控制器類型的Component @Scope("prototype") // 把Action交給Spring管理,默認是單例的,該註解指定為Action多例 public class UserAction extends ActionSupport implements ModelDriven<User>{ // 實現模型驅動需要new一個實體類的對象,通過getModel返回 private User user = new User(); // 自動裝載UserService對象 @Autowired private UserService userService; // 返回模型user對象 public User getModel() { return user; } // 登錄方法 public String login() { // 調用Service層的方法得到用戶 User existUser = userService.login(user); // 如果沒有得到用戶 if (existUser == null) { // 加入錯誤提示資訊 this.addFieldError("loginFail", "用戶名或者密碼錯誤"); return ERROR; } else { // 登錄成功,將用戶資訊壓入棧中 ActionContext.getContext().getValueStack().push(existUser); return SUCCESS; } } }三.業務邏輯層(UserService),UserServiceImpl實現UserService中的方法
UserService.java
package com.service; import com.domain.User; public interface UserService { User login(User user); }UserServiceImpl.java
package com.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.dao.UserDao; import com.domain.User; import com.service.UserService; // 該註解說明這是一個Service類型的Commpent @Service public class UserServiceImpl implements UserService{ // 自動裝載UserDao @Autowired private UserDao userDao; public User login(User user) { // 通過用戶名和密碼查找用戶 User existUser = userDao.findUserByUsernamAndPassword(user); return existUse; } }四.資料庫操作層(UserDao),UserDaoImpl實現UserDao中的方法
UserDao.java
package com.dao; import com.domain.User; public interface UserDao { User findUserByUsernamAndPassword(User user); }UserDaoImpl.java
package com.dao.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate5.HibernateTemplate; import org.springframework.stereotype.Repository; import com.dao.UserDao; import com.domain.User; // Dao層 @Repository public class UserDaoImpl implements UserDao{ // 自動裝配hibernateTemplate,這個Bean需要在applicationContext.xml中註冊 @Autowired private HibernateTemplate hibernateTemplate; public User findUserByUsernamAndPassword(User user) { // hql語句 String hql = "from User where username=? and password=?"; // 查找對象 List<User> users = (List<User>) hibernateTemplate.find(hql, user.getUsername(), user.getPassword()); if (users.size() > 0) { // 查找到的對象用戶名和密碼唯一,所以如果找到的話,List中的第一個對象就是要找的對象 return users.get(0); } return null; } }五.實體層(User)
User.java
package com.domain; import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; // 聲明實體類映射 @Entity @Table(name="User") public class User implements Serializable{ private Integer id; // id private String username; // 用戶名 private String password; // 密碼 // 主鍵 @Id @GeneratedValue(strategy=GenerationType.AUTO) // 主鍵生成策略 public Integer getId() { return id; } public void setId(Integer 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; } }六.建立資料庫關聯
在資料庫中創建一個名字為_ssh的資料庫 jjdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver #u5B9Au4E49u8FDEu63A5u7684URLu5730u5740uFF0Cu8BBEu7F6Eu7F16u7801u96C6uFF0Cu65F6u95F4u57DFuFF0Cu5141u8BB8u591Au6761SQLu8BEDu53E5u64CDu4F5Cu0153 jdbc.url=jdbc:mysql://localhost:3306/_ssh?characterEncoding=utf-8&serverTimezone=UTC&allowMultiQueries=true #jdbc:mysql://localhost:3306/thcardb?characterEncoding=utf-8&serverTimezone=UTC&allowMultiQueries=true jdbc.username=root #jdbc.password=asd123asd jdbc.password=123 #u5B9Au4E49u521Du59CBu8FDEu63A5u6570 initialSize=0 #u5B9Au4E49u6700u5927u8FDEu63A5u6570 maxActive=20 #u5B9Au4E49u6700u5927u7A7Au95F2 maxIdle=20 #u5B9Au4E49u6700u5C0Fu7A7Au95F2 minIdle=1 #u5B9Au4E49u6700u957Fu7B49u5F85u65F6u95F4 maxWait=60000
將資料庫相關的全部配置作為Bean交給Spring處理,applicationContext.xml
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> <!-- 自動掃描包下面的Bean --> <context:component-scan base-package="com"/> <!-- 載入jdbc的屬性文件 --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties" /> </bean> <!-- druid配置數據源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!-- 初始化連接大小 --> <property name="initialSize" value="${initialSize}"></property> <!-- 連接池最大數量 --> <property name="maxActive" value="${maxActive}"></property> <!-- 連接池最大空閑 --> <!-- <property name="maxIdle" value="${maxIdle}"></property> --> <!-- 連接池最小空閑 --> <property name="minIdle" value="${minIdle}"></property> <!-- 獲取連接最大等待時間 --> <property name="maxWait" value="${maxWait}"></property> </bean> <!-- 配置SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 配置數據源 --> <property name="dataSource" ref="dataSource" /> <!-- 其它hibernate配置 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="javax.persistence.validation.mode">none</prop> </props> </property> <property name="packagesToScan" value="com.domain"/> </bean> <!-- 註冊hibernateTemplate這個Bean --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory" /> </bean> </beans>測試:
- 啟動,自動生成了表

- 在資料庫中加一條數據

- 輸入錯誤的用戶名密碼測試

- 輸入正確的用戶名密碼測試

總結:
MVC思想是貫穿WEB開發的,回想自己當初剛剛接觸WEB開發時,學習thinkphp5框架一臉懵。當時剛剛大一結束,對編程的接觸就是用C語言完成了一個通訊錄管理程式。用C語言實現了簡單的增刪改查。接觸WEB開發,先學html+css,學得不怎麼樣,連盒子模型都沒有理解透,就開始接觸Boostrap框架。後來隔了一個寒假,回去開始學習thinkphp5,連框架的概念都沒有的我每天學習十分得痛苦。現在,離我離開實驗室應該是4個月。我自己從零開始接觸了java,四個月時間,我的進步還是可觀的,回想大學這一年,發生的事情真的好多。