• Spring小练习之宝宝淘项目


    数据库准备

    # 1 表结构
    CREATE TABLE `t01_user` (
      `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
      `user_name` varchar(20) DEFAULT NULL COMMENT '姓名',
      `credits` varchar(11) DEFAULT NULL COMMENT '积分',
      `password` varchar(11) DEFAULT NULL COMMENT '密码',
      `last_visit` datetime DEFAULT NULL COMMENT '最后一次登陆时间',
      `last_ip` varchar(11) DEFAULT NULL COMMENT '最后一次登陆ip',
      PRIMARY KEY (`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='t01模块的用户表'
    ;
    CREATE TABLE `t01_login_log` (
      `login_log_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `user_id` int(11) NOT NULL COMMENT 't01_user 用户表主键',
      `ip` varchar(20) NOT NULL COMMENT 'ip',
      `login_datetime` datetime NOT NULL COMMENT '登陆时间',
      PRIMARY KEY (`login_log_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    ;
    # 2 表数据
    INSERT INTO t01_user (user_name,password)
    VALUES('admin','123456')
    ;

    依赖准备

    group 'bbt'
    version '1.0-SNAPSHOT'
    apply plugin: 'java'
    apply plugin: 'jetty'
    sourceCompatibility = 1.8
    repositories {
        mavenCentral()
    }
    dependencies {
        // https://mvnrepository.com/artifact/org.springframework/spring-core
        compile group: 'org.springframework', name: 'spring-core', version: '3.2.17.RELEASE'
        // https://mvnrepository.com/artifact/org.springframework/spring-context
        compile group: 'org.springframework', name: 'spring-context', version: '3.2.17.RELEASE'
        // https://mvnrepository.com/artifact/org.springframework/spring-test
        compile group: 'org.springframework', name: 'spring-test', version: '3.2.17.RELEASE'
        // https://mvnrepository.com/artifact/org.springframework/spring-web
        compile group: 'org.springframework', name: 'spring-web', version: '3.2.17.RELEASE'
        // https://mvnrepository.com/artifact/org.springframework/spring-webmvc
        compile group: 'org.springframework', name: 'spring-webmvc', version: '3.2.17.RELEASE'
        // https://mvnrepository.com/artifact/org.springframework/spring-jdbc
        compile group: 'org.springframework', name: 'spring-jdbc', version: '3.2.17.RELEASE'
        // https://mvnrepository.com/artifact/org.springframework/spring-aop
        compile group: 'org.springframework', name: 'spring-aop', version: '3.2.17.RELEASE'
        // https://mvnrepository.com/artifact/mysql/mysql-connector-java
        compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.39'
        // https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp
        compile group: 'commons-dbcp', name: 'commons-dbcp', version: '1.4'
        // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
        compile group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.0-b01'
        // https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
        compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.4'
        // https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
        compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.2'
        // https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils
        compile group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.2'
        // https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core
        compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.1'
        // https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api
        compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.1'
        // https://mvnrepository.com/artifact/jstl/jstl
        compile group: 'jstl', name: 'jstl', version: '1.2'
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }

    日志:log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration status="OFF">
        <!--appenders配置输出到什么地方-->
        <appenders>
            <!--Console:控制台-->
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            </Console>
        </appenders>
        <loggers>
            <!--additivity默认为true,为输出两遍日志-->
            <logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG" additivity="false">
                <appender-ref ref="Console"/>
            </logger>
            <!--建立一个默认的root的logger-->
            <root level="trace">
                <appender-ref ref="Console"/>
            </root>
        </loggers>
    </configuration>

    领域对象

    package org.zln.bbt.domain;
    import org.apache.commons.lang3.builder.ToStringBuilder;
    import java.util.Date;
    /**
     * Created by sherry on 16/7/1.
     * 用户领域对象
     */
    public class User {
        private int userId;
        private String userName;
        private String password;
        //当前积分
        private int credits;
        //最后一次登陆用户的ip
        private String lastIp;
        //最后一次登陆的时间
        private Date lastVisit;
        @Override
        public String toString() {
            return new ToStringBuilder(this)
                    .append("userId", userId)
                    .append("userName", userName)
                    .append("password", password)
                    .append("credits", credits)
                    .append("lastIp", lastIp)
                    .append("lastVisit", lastVisit)
                    .toString();
        }
        public int getUserId() {
            return userId;
        }
        public void setUserId(int userId) {
            this.userId = userId;
        }
        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;
        }
        public int getCredits() {
            return credits;
        }
        public void setCredits(int credits) {
            this.credits = credits;
        }
        public String getLastIp() {
            return lastIp;
        }
        public void setLastIp(String lastIp) {
            this.lastIp = lastIp;
        }
        public Date getLastVisit() {
            return lastVisit;
        }
        public void setLastVisit(Date lastVisit) {
            this.lastVisit = lastVisit;
        }
    }
    package org.zln.bbt.domain;
    import org.apache.commons.lang3.builder.ToStringBuilder;
    import java.util.Date;
    /**
     * Created by sherry on 16/7/1.
     * 登陆日志领域对象
     */
    public class LoginLog {
        //登陆日志主键
        private int loginLogId;
        //登陆用户主键
        private int userId;
        //登陆用户ip
        private String ip;
        //登陆时间
        private Date loginDate;
        @Override
        public String toString() {
            return new ToStringBuilder(this)
                    .append("loginLogId", loginLogId)
                    .append("userId", userId)
                    .append("ip", ip)
                    .append("loginDate", loginDate)
                    .toString();
        }
        public int getLoginLogId() {
            return loginLogId;
        }
        public void setLoginLogId(int loginLogId) {
            this.loginLogId = loginLogId;
        }
        public int getUserId() {
            return userId;
        }
        public void setUserId(int userId) {
            this.userId = userId;
        }
        public String getIp() {
            return ip;
        }
        public void setIp(String ip) {
            this.ip = ip;
        }
        public Date getLoginDate() {
            return loginDate;
        }
        public void setLoginDate(Date loginDate) {
            this.loginDate = loginDate;
        }
    }

    Dao代码

    package org.zln.bbt.dao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowCallbackHandler;
    import org.springframework.stereotype.Repository;
    import org.zln.bbt.domain.User;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import static java.sql.Types.VARCHAR;
    /**
     * Created by sherry on 16/7/1.
     * 用户Dao类
     */
    @Repository("userDao")
    public class UserDao {
        @Autowired
        @Qualifier("jdbcTemplate")
        private JdbcTemplate jdbcTemplate;
        /**
         * 获取匹配的记录数
         * @param username 用户名
         * @param password 密码
         * @return 记录数
         */
        public int getMatchCount(String username,String password){
            final String sqlStr = " SELECT count(1) FROM t_user WHERE user_name = ? AND password = ? ";
            int count = jdbcTemplate.queryForInt(sqlStr,new Object[]{username,password},new int[]{VARCHAR, VARCHAR});
            return count;
        }
        /**
         * 根据用户名查找用户
         * @param username 用户名
         * @return 用户
         */
        public User findUserByUserName(final String username){
            final String sqlStr = " SELECT user_id,user_name,credits FROM t_user WHERE user_name = ? ";
            final User user = new User();
            jdbcTemplate.query(sqlStr, new Object[]{user}, new RowCallbackHandler() {
                @Override
                public void processRow(ResultSet rs) throws SQLException {
                    user.setUserId(rs.getInt("user_id"));
                    user.setUserName(rs.getString("user_name"));
                    user.setCredits(rs.getInt("credits"));
                }
            });
            return user;
        }
        /**
         * 更新用户信息
         * @param user
         */
        public void updateLoginInfo(User user){
            final String sqlStr = " UPDATE t_user SET last_visit = ?,last_ip = ?,credits = ? WHERE user_id = ? ";
            jdbcTemplate.update(sqlStr,new Object[]{user.getLastVisit(),user.getLastIp(),user.getCredits(),user.getUserId()});
        }
    }
    package org.zln.bbt.dao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.zln.bbt.domain.LoginLog;
    /**
     * Created by sherry on 16/7/1.
     * 登陆日志Dao类
     */
    public class LoginLogDao {
        @Autowired
        @Qualifier("jdbcTemplate")
        private JdbcTemplate jdbcTemplate;
        /**
         * 新增登陆日志
         * @param loginLog 日志对象
         */
        public void insertLoginLog(LoginLog loginLog){
            final String sqlStr = " INSERT INTO t_login_log (user_id,ip,login_datetime) VALUES (?,?,?) ";
            jdbcTemplate.update(sqlStr,new Object[]{loginLog.getUserId(),loginLog.getIp(),loginLog.getLoginDate()});
        }
    }

    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:context="http://www.springframework.org/schema/context"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:p="http://www.springframework.org/schema/p"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.2.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
        <!--这个包下的,所有加过特殊注解的类,都被Spring管理-->
        <context:component-scan base-package="org.zln.bbt"/>
        <!--开启注解注入-->
        <context:annotation-config/>
        <!--配置数据源-->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
              p:driverClassName="com.mysql.jdbc.Driver"
              p:url="jdbc:mysql://localhost:3306/zln?useSSL=false"
              p:username="root"
              p:password="123456"/>
        <!--JDBC模板类-->
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
              p:dataSource-ref="dataSource"/>
        <!--事务管理器-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
              p:dataSource-ref="dataSource"/>
        <!--使用注解配置事务-->
        <tx:annotation-driven transaction-manager="transactionManager"/>
    </beans>

    Service

    package org.zln.bbt.service;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.zln.bbt.dao.LoginLogDao;
    import org.zln.bbt.dao.UserDao;
    import org.zln.bbt.domain.LoginLog;
    import org.zln.bbt.domain.User;
    /**
     * Created by sherry on 16/7/1.
     * 用户业务层
     */
    @Service("userService")
    public class UserService {
        @Autowired
        private UserDao userDao;
        @Autowired
        private LoginLogDao loginLogDao;
        public boolean hasMatchUser(String username,String password){
            return userDao.getMatchCount(username,password)>0;
        }
        public User findUserByUserName(String username){
            return userDao.findUserByUserName(username);
        }
        public void loginSuccess(User user){
            user.setCredits(user.getCredits()+5);
            LoginLog loginLog = new LoginLog();
            loginLog.setIp(user.getLastIp());
            loginLog.setLoginDate(user.getLastVisit());
            userDao.updateLoginInfo(user);
            loginLogDao.insertLoginLog(loginLog);
        }
    }

    测试

    package org.zln.bbt.service;
    import org.junit.Test;
    import org.apache.logging.log4j.Level;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.zln.bbt.domain.User;
    import java.util.Date;
    import static org.junit.Assert.*;
    /**
     * Created by sherry on 16/7/1.
     */
    @RunWith(SpringJUnit4ClassRunner.class)//基于Junit4的Spring测试框架
    @ContextConfiguration(locations = {"/applicationContext.xml"})
    public class UserServiceTest {
        private Logger logger = LogManager.getLogger(UserServiceTest.class);
        @Autowired
        private UserService userService;
        @Test
        public void testHasMatchUser() throws Exception {
            boolean b1 = userService.hasMatchUser("admin","123456");
            boolean b2 = userService.hasMatchUser("admin","111");
            logger.info(b1);
            logger.info(b2);
            assertTrue(b1);
            assertTrue(!b2);
        }
        @Test
        public void testFindUserByUserName() throws Exception {
            User user = userService.findUserByUserName("admin");
            assertEquals("admin",user.getUserName());
        }
        @Test
        public void testLoginSuccess() throws Exception {
            User user = userService.findUserByUserName("admin");
            user.setLastVisit(new Date());
            userService.loginSuccess(user);
        }
    }

    Action

    package org.zln.bbt.controller;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    import org.zln.bbt.command.LoginCommand;
    import org.zln.bbt.domain.User;
    import org.zln.bbt.service.UserService;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Date;
    /**
     * Created by sherry on 16/7/4.
     */
    @Controller
    public class LoginController {
        @Autowired
        @Qualifier("userService")
        private UserService userService;
        @RequestMapping(value = "/index.html")
        public String loginPage(){
            return "login";
        }
        @RequestMapping(value = "/loginCheck.html")
        public ModelAndView loginCheck(HttpServletRequest request,LoginCommand loginCommand){
            boolean isValidUser = userService.hasMatchUser(loginCommand.getUserName(),loginCommand.getPassword());
            if (!isValidUser){
                return new ModelAndView("login","error","用户名或密码错误");
            }else {
                User user = userService.findUserByUserName(loginCommand.getUserName());
                user.setLastIp(request.getRemoteAddr());
                user.setLastVisit(new Date());
                userService.loginSuccess(user);
                request.getSession().setAttribute("user",user);
                return new ModelAndView("main");
            }
        }
    }

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
             version="3.1">
        <!--① 启动Spring-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:applicationContext.xml</param-value>
        </context-param>
        <!--② 启动Spring容器的监听,引用①处的上下文参数获取Spring配置文件地址-->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <!--③ 配置Spring MVC地址映射-->
        <servlet>
            <servlet-name>bbt</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>2</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>bbt</servlet-name>
            <url-pattern>*.html</url-pattern>
        </servlet-mapping>
    </web-app>

    bbt-servlet.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:context="http://www.springframework.org/schema/context"
           xmlns:p="http://www.springframework.org/schema/p"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.2.xsd">
        <!--这个包下的,所有加过特殊注解的类,都被Spring管理-->
        <context:component-scan base-package="org.zln" resource-pattern="**/*Controller.class"/>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              p:viewClass="org.springframework.web.servlet.view.JstlView"
              p:prefix="/WEB-INF/jsp/"
              p:suffix=".jsp"/>
    </beans>

    WEB-INF/jsp/login.jsp

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
    <%
        String homePage = request.getContextPath();
    %>
    <html>
    <head>
        <title>宝宝淘论坛登陆</title>
    </head>
    <body>
    <c:if test="${!empty error}">
        <font color="red"><c:out value="${error}"/></font>
    </c:if>
    <form action="<%=homePage%>/loginCheck.html" method="post">
        <table>
            <tr>
                <td>用户名</td>
                <td>
                    <input type="text" name="userName">
                </td>
            </tr>
            <tr>
                <td>密码</td>
                <td>
                    <input type="password" name="password">
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="登陆">
                    <input type="submit" value="重置">
                </td>
            </tr>
        </table>
    </form>
    </body>
    </html>

    WEB-INF/jsp/main.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
    <%
        String homePage = request.getContextPath();
    %>
    <html>
    <head>
        <title>宝宝淘论坛</title>
    </head>
    <body>
    ${user.userName},欢迎登陆,当前积分:${user.credits}<br/>
    </body>
    </html>
  • 相关阅读:
    你可能不知道的 transition 技巧与细节
    CSS奇思妙想 -- 使用 CSS 创造艺术
    生僻标签 fieldset 与 legend 的妙用
    CSS 奇思妙想边框动画
    (转)linux命令-- pstack命令(跟踪进程栈)
    (转)PostgreSQL 数据库错误代码解释
    postgresql灾备切换
    (转)postgresql配置参数和概念解释
    (转)PostgreSQL跨库操作Oracle利器-Oracle_fdw
    (转)PG运维常用知识点小结
  • 原文地址:https://www.cnblogs.com/sherrykid/p/5954527.html
Copyright © 2020-2023  润新知