1. 程式人生 > >如何搭建一個springboot+thymeleaf+jpa的登陸案例

如何搭建一個springboot+thymeleaf+jpa的登陸案例

一、建立目錄

我使用過的是idea的編輯器

首先新建一個spring專案-》選擇spring initializr -》next

填寫pom的資訊

選擇元件,我選擇的是jpa和thymeleaf,web要選擇web核心元件

選擇目錄和填寫專案名稱-》finish

二、專案搭建

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lili</groupId>
    <artifactId>news</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>news</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

目錄結構

登陸控制器

package com.lili.news.controller;



import com.lili.news.entity.User;
import com.lili.news.result.CommonResult;
import com.lili.news.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Controller
//@RestController
public class Login {

    @Autowired
    private UserService usi;

    /*
    * 登陸頁面
    *
    * */
    @RequestMapping("/login")
    public String login(Map<String,Object> map){

        map.put("test","123456");
        map.put("userinfo" ,new User("lili","123456",22));

        List<User> list = new ArrayList<>();

        for (int i=0 ; i<=5; i++){
            User u = new User("lili","123456",(22+i) );
            list.add(u);
        }
        map.put("userlist",list);


        return "login/login";
    }

    @RequestMapping("/dologin")
    @ResponseBody
    public Object dologin(User user){
        System.out.printf(user.toString());
        CommonResult cr =  usi.checkUser(user.getUsername(),user.getPassword());
        return cr;
    }




}

dao層jpa介面

package com.lili.news.dao;

import com.lili.news.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface UserRepository extends JpaRepository<User,Long> {

    /**
     * 查詢使用者名稱為username,密碼為password的使用者
     * @param username
     * @param password
     * @return
     */
    List<User> findUserByUsernameAndPassword(String username , String password );



}

實體類user

package com.lili.news.entity;





import javax.persistence.*;


@Entity
public class User {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;

        @Column(length = 100)
        private String username;

        @Column(length = 255)
        private String password;

        @Column(length = 10)
        private Integer age;

        public User(String username, String password, Integer age) {
                this.username = username;
                this.password = password;
                this.age = age;
        }

        public User(){

        }

        public long getId() {
                return id;
        }

        public void setId(long 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;
        }

        public Integer getAge() {
                return age;
        }

        public void setAge(Integer age) {
                this.age = age;
        }


        @Override
        public String toString() {
                return "User{" +
                        "id=" + id +
                        ", username='" + username + '\'' +
                        ", password='" + password + '\'' +
                        ", age=" + age +
                        '}';
        }
}

result類返回json使用

package com.lili.news.result;

public class CommonResult {

    private Integer code;

    private String msg;

    private Object jsonObj;


    public CommonResult(Integer code, String msg, Object jsonObj) {
        this.code = code;
        this.msg = msg;
        this.jsonObj = jsonObj;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getJsonObj() {
        return jsonObj;
    }

    public void setJsonObj(Object jsonObj) {
        this.jsonObj = jsonObj;
    }
}

service服務層介面

package com.lili.news.service;

import com.lili.news.entity.User;
import com.lili.news.result.CommonResult;

public interface UserService {

    /*
    * 通過id獲得user資料
    * @param  int  id  主鍵
    * @return User user物件
    * */
    User getUser(Integer id);

    /*
    * 檢查登陸的賬戶資訊是否匹配,使用者名稱和密碼是否存在、正誤
    * @param  string username 使用者名稱
    * @param  string password 密碼
    * @return bool 正確返回true 否則返回false
    * */
    CommonResult checkUser(String username, String password);



}

serviceimpl實現類

package com.lili.news.service.serviceImpl;

import com.lili.news.dao.UserRepository;
import com.lili.news.entity.User;
import com.lili.news.result.CommonResult;
import com.lili.news.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl implements UserService {


    private final UserRepository  ur ;

    @Autowired
    UserServiceImpl(UserRepository ur){
        this.ur = ur;
    }

    @Override
    public User getUser(Integer id) {

        return null;
    }

    @Override
    public CommonResult checkUser(String username, String password) {
        List<User> users = this.ur.findUserByUsernameAndPassword(username,password);
        if(users.isEmpty()){
            return new CommonResult(101,"沒有這個使用者或者使用者名稱字錯誤",null);
        }else {
            return new CommonResult(100,"登陸成功",users);
        }
    }
}

檢視的目錄在resource下面的



<!DOCTYPE html>
<html lang="en" class="no-js">

<head>

    <meta charset="utf-8">
    <title>Fullscreen Login</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">

    <!-- CSS -->
    <link rel="stylesheet" th:href="@{/login/assets/css/reset.css}">
    <link rel="stylesheet" th:href="@{/login/assets/css/supersized.css}">
    <link rel="stylesheet" th:href="@{/login/assets/css/style.css}">

    <!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
    <!--[if lt IE 9]>
    <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

</head>

<body>

<div class="page-container">
    <h1>Login</h1>
    <span th:text="'使用者名稱:' +${userinfo.username}">aaa</span>
    <form action="#" th:action="@{/dologin}" th:object="${userinfo}" method="post">

        <input type="text" name="username" class="username" th:value="*{username}">
        <input type="password" name="password" class="password" th:value="*{password}">
        <span th:text="'使用者名稱:' +*{username}">aaa</span>
        <span th:text="'密碼:' +*{password}">aaa</span>
        <button type="submit">登陸</button>
    </form>

</div>


<!-- Javascript -->
<script th:src="@{/login/assets/js/jquery-1.8.2.min.js}"></script>
<script th:src="@{/login/assets/js/supersized.3.2.7.min.js}"></script>
<script th:src="@{/login/assets/js/supersized-init.js}"></script>
<script th:src="@{/login/assets/js/scripts.js}"></script>

</body>

</html>

thymeleaf的語法連結使用@,普通的變數使用${},或者*{}

靜態資源如圖所示預設在resource下面的static裡面

三、執行

現在在login控制器加一個控制方法,作為跳轉頁面使用

@RequestMapping("/weblogin")
    public String weblogin(Map<String,Object> map, User user){
        System.out.printf(user.toString());
        CommonResult cr =  usi.checkUser(user.getUsername(),user.getPassword());
        if (cr.getCode() == 100 ){
            //登陸成功
            map.put("userinfo",user);
            return "main/main";
        }else {
            return "redirect:login/login";
        }



    }

我也加了一個main頁面

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>layout 後臺大布局 - Layui</title>
    <link rel="stylesheet" th:href="@{/layui/css/layui.css}">
</head>
<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
    <div class="layui-header">
        <div class="layui-logo">layui 後臺佈局</div>
        <!-- 頭部區域(可配合layui已有的水平導航) -->
        <ul class="layui-nav layui-layout-left">
            <li class="layui-nav-item"><a href="">控制檯</a></li>
            <li class="layui-nav-item"><a href="">商品管理</a></li>
            <li class="layui-nav-item"><a href="">使用者</a></li>
            <li class="layui-nav-item">
                <a href="javascript:;">其它系統</a>
                <dl class="layui-nav-child">
                    <dd><a href="">郵件管理</a></dd>
                    <dd><a href="">訊息管理</a></dd>
                    <dd><a href="">授權管理</a></dd>
                </dl>
            </li>
        </ul>
        <ul class="layui-nav layui-layout-right">
            <li class="layui-nav-item">
                <a href="javascript:;">
                    <img src="http://t.cn/RCzsdCq" class="layui-nav-img">
                    <span th:text="${userinfo.username}"></span>
                </a>
                <dl class="layui-nav-child">
                    <dd><a href="">基本資料</a></dd>
                    <dd><a href="">安全設定</a></dd>
                </dl>
            </li>
            <li class="layui-nav-item"><a href="">退了</a></li>
        </ul>
    </div>

    <div class="layui-side layui-bg-black">
        <div class="layui-side-scroll">
            <!-- 左側導航區域(可配合layui已有的垂直導航) -->
            <ul class="layui-nav layui-nav-tree"  lay-filter="test">
                <li class="layui-nav-item layui-nav-itemed">
                    <a class="" href="javascript:;">所有商品</a>
                    <dl class="layui-nav-child">
                        <dd><a href="javascript:;">列表一</a></dd>
                        <dd><a href="javascript:;">列表二</a></dd>
                        <dd><a href="javascript:;">列表三</a></dd>
                        <dd><a href="">超連結</a></dd>
                    </dl>
                </li>
                <li class="layui-nav-item">
                    <a href="javascript:;">解決方案</a>
                    <dl class="layui-nav-child">
                        <dd><a href="javascript:;">列表一</a></dd>
                        <dd><a href="javascript:;">列表二</a></dd>
                        <dd><a href="">超連結</a></dd>
                    </dl>
                </li>
                <li class="layui-nav-item"><a href="">雲市場</a></li>
                <li class="layui-nav-item"><a href="">釋出商品</a></li>
            </ul>
        </div>
    </div>

    <div class="layui-body">
        <!-- 內容主體區域 -->
        <div style="padding: 15px;">內容主體區域</div>
    </div>

    <div class="layui-footer">
        <!-- 底部固定區域 -->
        © layui.com - 底部固定區域
    </div>
</div>
<script th:src="@{/layui/layui.js}"></script>
<script>
    //JavaScript程式碼區域
    layui.use('element', function(){
        var element = layui.element;

    });
</script>
</body>
</html>