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,四個月時間,我的進步還是可觀的,回想大學這一年,發生的事情真的好多。

Tags: