使用IntelliJ IDEA開發SpringMVC網站(四)用戶管理

轉載請註明出處:Gaussic 。css

注:在閱讀本文前,請先閱讀:html

使用IntelliJ IDEA開發SpringMVC網站(一)開發環境html5

使用IntelliJ IDEA開發SpringMVC網站(二)框架配置java

使用IntelliJ IDEA開發SpringMVC網站(三)數據庫配置jquery

訪問GitHub下載最新源碼:https://github.com/gaussic/SpringMVCDemogit

文章已針對IDEA 15作了必定的更新,部分更新較爲重要,請從新閱讀文章並下載最新源碼。

7、用戶管理

    既然咱們要作一個博客管理系統,固然要首先實現咱們的用戶管理。在上一文中,咱們已經配置好了數據庫。接下來,就要實現網站的一些業務邏輯。github

一、JPA操做定義

    在實現用戶管理操做以前,須要講解一下JPA的開發工做。web

    首先,在com.gaussic.repository包內新建一個UserRepository接口:spring

    讓該接口繼承 JpaRepository:數據庫

package com.gaussic.repository;

import com.gaussic.model.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 * Created by dzkan on 2016/3/8.
 */
@Repository
public interface UserRepository extends JpaRepository<UserEntity, Integer> {
}

    在JpaRepository中,定義了幾個簡化的操做數據庫的方法:

    (1) findAll():查找表中全部記錄;

    (2)findOne(Integer id):按id來查找某一條記錄;

    (3)findByXXX(Object xxx):在這裏XXX是一個字段名,根據該字段的值開查找全部記錄;

    (4)save()和delete():添加一條記錄以及刪除一條記錄。

    除此以外,咱們還能夠在該repository中自定義新的方法,這將在稍後實際開發中說起。

二、後臺管理

    爲了儘量的在省去篇幅的狀況下,在此省去管理員操做的開發。默認在訪問 /admin 時,進入後臺管理。

(1)查看全部用戶

    將MainController補充爲以下形式:

package com.gaussic.controller;

import com.gaussic.model.UserEntity;
import com.gaussic.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

/**
 * Created by dzkan on 2016/3/8.
 */
@Controller
public class MainController {

    // 自動裝配數據庫接口,不須要再寫原始的Connection來操做數據庫
    @Autowired
    UserRepository userRepository;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index() {
        return "index";
    }

    @RequestMapping(value = "/admin/users", method = RequestMethod.GET)
    public String getUsers(ModelMap modelMap) {
        // 查詢user表中全部記錄
        List<UserEntity> userList = userRepository.findAll();

        // 將全部記錄傳遞給要返回的jsp頁面,放在userList當中
        modelMap.addAttribute("userList", userList);

        // 返回pages目錄下的admin/users.jsp頁面
        return "admin/users";
    }
}

    講解:

    1. 自動裝配:至關於數據庫操做的極簡化,只要定義了就能夠直接進行數據庫操做,不用再去管開啓鏈接、關閉鏈接等問題

    2. 找到全部記錄:使用JpaRepository的默認方法findAll()。

    3. modelMap:用於將controller方法裏面的參數傳遞給所需的jsp頁面,以進行相關顯示。

    如今,須要在pages下新建目錄admin,並新建users.jsp頁面,以進行用戶的管理:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3個meta標籤*必須*放在最前面,任何其餘內容都*必須*跟隨其後! -->
 <title>SpringMVC 用戶管理</title>

    <!-- 新 Bootstrap 核心 CSS 文件 -->
 <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>
<body>
<div class="container">
    <h1>SpringMVC 博客系統-用戶管理</h1>
    <hr/>

    <h3>全部用戶 <a href="/admin/users/add" type="button" class="btn btn-primary btn-sm">添加</a></h3>

    <!-- 若是用戶列表爲空 -->
 <c:if test="${empty userList}">
        <div class="alert alert-warning" role="alert">
            <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>User表爲空,請<a href="/admin/users/add" type="button" class="btn btn-primary btn-sm">添加</a>
        </div>
    </c:if>

    <!-- 若是用戶列表非空 -->
 <c:if test="${!empty userList}">
        <table class="table table-bordered table-striped">
            <tr>
                <th>ID</th>
                <th>暱稱</th>
                <th>姓名</th>
                <th>密碼</th>
                <th>操做</th>
            </tr>

            <c:forEach items="${userList}" var="user">
                <tr>
                    <td>${user.id}</td>
                    <td>${user.nickname}</td>
                    <td>${user.firstName} ${user.lastName}</td>
                    <td>${user.password}</td>
                    <td>
                        <a href="/admin/users/show/${user.id}" type="button" class="btn btn-sm btn-success">詳情</a>
                        <a href="/admin/users/update/${user.id}" type="button" class="btn btn-sm btn-warning">修改</a>
                        <a href="/admin/users/delete/${user.id}" type="button" class="btn btn-sm btn-danger">刪除</a>
                    </td>
                </tr>
            </c:forEach>
        </table>
    </c:if>
</div>

<!-- jQuery文件。務必在bootstrap.min.js 以前引入 -->
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
</html>

    講解:

  1. <c>標籤:在jsp中使用了jstl語法,能夠方便地進行一些判斷<c:if>與遍歷操做<c:forEach>;

  2. 頁面使用了Bootstrap,部分功能將在以後實現。

    運行Tomcat,在瀏覽器中輸入 http://localhost:8080/admin/users,進入用戶管理界面,顯示以下:

    因爲目前數據庫中沒有數據,於是顯示爲空,如今須要向數據庫中添加用戶。

(2)添加用戶

    在MainController中增長兩個方法:

// get請求,訪問添加用戶 頁面
@RequestMapping(value = "/admin/users/add", method = RequestMethod.GET)
public String addUser() {
    // 轉到 admin/addUser.jsp頁面
    return "admin/addUser";
}

// post請求,處理添加用戶請求,並重定向到用戶管理頁面
@RequestMapping(value = "/admin/users/addP", method = RequestMethod.POST)
public String addUserPost(@ModelAttribute("user") UserEntity userEntity) {
    // 注意此處,post請求傳遞過來的是一個UserEntity對象,裏面包含了該用戶的信息
    // 經過@ModelAttribute()註解能夠獲取傳遞過來的'user',並建立這個對象

    // 數據庫中添加一個用戶,該步暫時不會刷新緩存
    //userRepository.save(userEntity);

    // 數據庫中添加一個用戶,並當即刷新緩存
    userRepository.saveAndFlush(userEntity);

    // 重定向到用戶管理頁面,方法爲 redirect:url
    return "redirect:/admin/users";
}

    講解:

  1. /admin/users/add請求:get請求轉到添加用戶頁面

  2. /admin/users/addP請求:post請求收集數據並存庫

  3. @ModelAttribute註解:收集post過來的數據(在此,至關於post過來了一整個userEntity,不用一個一個地取)

  4. save()和saveAndFlush():save()方法處理完畢後,數據依然在緩衝區未寫入數據庫,使用saveAndFlush()能夠當即刷新緩衝區,寫入數據庫

  5. redirect:/admin/users:這裏使用重定向,可讓該方法重定向訪問一個請求,ruturn以後,將跳轉到 :/admin/users 所訪問的頁面。

如今,在pages的admin目錄下新建一個addUser.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3個meta標籤*必須*放在最前面,任何其餘內容都*必須*跟隨其後! -->
 <title>SpringMVC 添加用戶</title>

    <!-- 新 Bootstrap 核心 CSS 文件 -->
 <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>
<body>
<div class="container">
    <h1>SpringMVC 添加用戶</h1>
    <hr/>
    <form:form action="/admin/users/addP" method="post" commandName="user" role="form">
        <div class="form-group">
            <label for="firstName">Nickname:</label>
            <input type="text" class="form-control" id="nickname" name="nickname" placeholder="Enter Nickname:"/>
        </div>
        <div class="form-group">
            <label for="firstName">First Name:</label>
            <input type="text" class="form-control" id="firstName" name="firstName" placeholder="Enter FirstName:"/>
        </div>
        <div class="form-group">
            <label for="lastName">Last Name:</label>
            <input type="text" class="form-control" id="lastName" name="lastName" placeholder="Enter LastName:"/>
        </div>
        <div class="form-group">
            <label for="password">Password:</label>
            <input type="text" class="form-control" id="password" name="password" placeholder="Enter Password:"/>
        </div>
        <div class="form-group">
            <button type="submit" class="btn btn-sm btn-success">提交</button>
        </div>
    </form:form>
</div>

<!-- jQuery文件。務必在bootstrap.min.js 以前引入 -->
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
</html>

    講解:

  1. <form:form>標籤:使用Spring的form標籤,能夠方便的收集整塊數據,commondName=「user」說明form內的內容都保存在這個user實例中,而後將整個user實例傳遞給controller處理。在全部的input標籤中,name必定要與UserEntity中的成員相同,否則沒法找到

  2. 在提交以後,後臺將會處理 /admin/users/addP 請求。

    如今,從新啓動服務器,訪問 http://localhost:8080/admin/users/add 頁面,以下圖所示:

    輸入數據,點擊提交,數據庫中將會寫入新的用戶,從新跳轉到用戶管理頁面:

(3)查看用戶詳情

    在MainController中加入查看詳情操做:

// 查看用戶詳情
// @PathVariable能夠收集url中的變量,需匹配的變量用{}括起來
// 例如:訪問 localhost:8080/admin/users/show/1 ,將匹配 id = 1
@RequestMapping(value = "/admin/users/show/{id}", method = RequestMethod.GET)
public String showUser(@PathVariable("id") Integer userId, ModelMap modelMap) {

    // 找到userId所表示的用戶
    UserEntity userEntity = userRepository.findOne(userId);

    // 傳遞給請求頁面
    modelMap.addAttribute("user", userEntity);
    return "admin/userDetail";
}

    在pages目錄下新建 userDetail.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3個meta標籤*必須*放在最前面,任何其餘內容都*必須*跟隨其後! -->
 <title>SpringMVC 用戶詳情</title>

    <!-- 新 Bootstrap 核心 CSS 文件 -->
 <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>
<body>
<div class="container">
    <h1>SpringMVC 用戶詳情</h1>
    <hr/>

    <table class="table table-bordered table-striped">
        <tr>
            <th>ID</th>
            <td>${user.id}</td>
        </tr>
        <tr>
            <th>Nickname</th>
            <td>${user.nickname}</td>
        </tr>
        <tr>
            <th>First Name</th>
            <td>${user.firstName}</td>
        </tr>
        <tr>
            <th>Last Name</th>
            <td>${user.lastName}</td>
        </tr>
        <tr>
            <th>Password</th>
            <td>${user.password}</td>
        </tr>
    </table>
</div>

<!-- jQuery文件。務必在bootstrap.min.js 以前引入 -->
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
</html>

    講解:如何訪問一個實例內的數據?

        使用${}語法,在{}內可使用相似Java的方法方便地訪問數據。

    重啓服務器,進入 http://localhost:8080/admin/users ,點擊ID = 1的用戶的 詳情 按鈕,能夠查看用戶詳情:

    從url能夠看出,訪問的是ID=1的用戶的詳細狀況,這樣的URL採用了REST風格設計,看起來更加簡便。

(4)修改用戶信息

    如今咱們要對用戶信息作必定的修改,那該如何作呢。假設咱們要可以修改所有的數據(除了id),JpaRepository未定義update方法,須要咱們本身定義。

    打開UserRepository,添加updateUser()接口方法:

package com.gaussic.repository;

import com.gaussic.model.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

/**
 * Created by dzkan on 2016/3/8.
 */
@Repository
public interface UserRepository extends JpaRepository<UserEntity, Integer> {

    @Modifying      // 說明該方法是修改操做
    @Transactional  // 說明該方法是事務性操做
    // 定義查詢
    // @Param註解用於提取參數
    @Query("update UserEntity us set us.nickname=:qNickname, us.firstName=:qFirstName, us.lastName=:qLastName, us.password=:qPassword where us.id=:qId")
    public void updateUser(@Param("qNickname") String nickname, @Param("qFirstName") String firstName,
                           @Param("qLastName") String qLastName, @Param("qPassword") String password, @Param("qId") Integer id);
}

    在MainController中定義update操做方法:

// 更新用戶信息 頁面
@RequestMapping(value = "/admin/users/update/{id}", method = RequestMethod.GET)
public String updateUser(@PathVariable("id") Integer userId, ModelMap modelMap) {

    // 找到userId所表示的用戶
    UserEntity userEntity = userRepository.findOne(userId);

    // 傳遞給請求頁面
    modelMap.addAttribute("user", userEntity);
    return "admin/updateUser";
}

// 更新用戶信息 操做
@RequestMapping(value = "/admin/users/updateP", method = RequestMethod.POST)
public String updateUserPost(@ModelAttribute("userP") UserEntity user) {

    // 更新用戶信息
    userRepository.updateUser(user.getNickname(), user.getFirstName(),
            user.getLastName(), user.getPassword(), user.getId());
    userRepository.flush(); // 刷新緩衝區
    return "redirect:/admin/users";
}

    而後,在pages目錄下,新建updateUser.jsp文件:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3個meta標籤*必須*放在最前面,任何其餘內容都*必須*跟隨其後! -->
 <title>SpringMVC Demo 更新用戶</title>

    <!-- 新 Bootstrap 核心 CSS 文件 -->
 <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
</head>
<body>
<div class="container">
    <h1>SpringMVC 更新用戶信息</h1>
    <hr/>

    <form:form action="/admin/users/updateP" method="post" commandName="userP" role="form">
        <div class="form-group">
            <label for="firstName">Nickname:</label>
            <input type="text" class="form-control" id="nickname" name="nickname" placeholder="Enter Nickname:"
 value="${user.nickname}"/>
        </div>
        <div class="form-group">
            <label for="firstName">First Name:</label>
            <input type="text" class="form-control" id="firstName" name="firstName" placeholder="Enter FirstName:"
 value="${user.firstName}"/>
        </div>
        <div class="form-group">
            <label for="lastName">Last Name:</label>
            <input type="text" class="form-control" id="lastName" name="lastName" placeholder="Enter LastName:"
 value="${user.lastName}"/>
        </div>
        <div class="form-group">
            <label for="password">Password:</label>
            <input type="text" class="form-control" id="password" name="password" placeholder="Enter Password:"
 value="${user.password}"/>
        </div>
        <!-- 把 id 一併寫入 userP 中 -->
 <input type="hidden" id="id" name="id" value="${user.id}"/>

        <div class="form-group">
            <button type="submit" class="btn btn-sm btn-success">提交</button>
        </div>
    </form:form>
</div>


<!-- jQuery文件。務必在bootstrap.min.js 以前引入 -->
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
</html>

    重啓服務器,進入 http://localhost:8080/admin/users ,點擊第一個用戶的 修改 按鈕,作以下修改:

    提交後,從新跳轉回用戶管理頁面,可發現修改完成:

(5)刪除用戶

    如今,新添加一個用戶:

    如今咱們須要刪掉新加入的用戶,打開MainController,加入如下方法:

// 刪除用戶
@RequestMapping(value = "/admin/users/delete/{id}", method = RequestMethod.GET)
public String deleteUser(@PathVariable("id") Integer userId) {

    // 刪除id爲userId的用戶
    userRepository.delete(userId);
    // 當即刷新
    userRepository.flush();
    return "redirect:/admin/users";
}

    重啓服務器,進入 http://localhost:8080/admin/users ,點擊ID=2的用戶的刪除按鈕,在controller中處理完以後,將跳轉回用戶管理界面:

 

    這樣,增刪該查基本完成了。

    其實,更到這裏,基本就能夠開始開發工做了,還有一些其餘的功能,都須要經過平時的積累以及多查資料來完成。例如JSON數據的處理,異步請求的處理,以及相關外鍵等操做。

    要知道的是,讀者所閱讀的三十分鐘,須要寫這篇文章的人數個小時的努力,整理確實不易。讀文章要有觸類旁通地態度,才能真正的把東西學精學全。

    轉載請註明出處:Gaussic(一個致力於AI研究卻不得不兼顧項目的研究生) 。

相關文章
相關標籤/搜索