前面我们做了挺多东西了,接下来要做的就是实际业务部分了。

其实管理之类的业务,都是一个套路,能增,能用表格展示出来,然后能删和改就行。

那么就让我们来完成一个用户管理页面,明白其中的套路吧。

1、首先来添加 JSTL 的包,方便我们再后面在 JSP 里用 JSTL 的标签。

 

点开 Problems  那,然后点下 Add…

2、然后来创建一组页面。

注意的点:

JSTL 标签的使用请查阅:

http://www.runoob.com/jsp/jsp-jstl.html

本片中只用到其核心库的标签。

这些就是提供增删改查功能的页面了。

add.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 引入 jstl 支持 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:include flush="true" page="../../includes/admin/header.jsp" />
<p>
    添加用户
</p>
<p>
    <!-- 直接对当前页面的 URL 进行 POST, 用 HTTP 动词来区分-->
    <form action="/admin/users/add?page=<%=request.getParameter("page")%>" method="post">
        <!-- 对实体直接这样访问也行,因为生成的时候都写好访问器方法了 -->
        用户名:<input type="text" name="username"><br/>
        密码:<input type="password" name="password"><br/>
        角色:
        <select name="user_role_type">
            <!-- 访问过去的时候名称映射规则是这样 -->
            <option value="1">管理员</option>
            <option value="2">用户</option>
        </select>
        <br>
        <input type="submit" value="添加">
    </form>
</p>
<jsp:include flush="true" page="../../includes/admin/footer.jsp" />

edit.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 引入 jstl 支持 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:include flush="true" page="../../includes/admin/header.jsp" />
<p>
    <!-- 从当前页面的 URL 里获取参数 id,也就是当前编辑的用户id-->
    用户编辑 ID:${User.id}
</p>
<p>
    <!-- 直接对当前页面的 URL 进行 POST, 用 HTTP 动词来区分-->
    <form action="/admin/users/edit?page=<%=request.getParameter("page")%>&id=${User.id}" method="post">
        <!-- 对实体直接这样访问也行,因为生成的时候都写好访问器方法了 -->
        用户名:<input type="text" name="username" value="${User.username}"><br/>
        密码:<input type="password" name="password" value="${User.password}"><br/>
        角色:
            <select name="user_role_type">
                <!-- 访问过去的时候名称映射规则是这样 -->
                <option value="1"<c:if test="${User.userRoleType == 1}"> selected</c:if>>管理员</option>
                <option value="2"<c:if test="${User.userRoleType == 2}"> selected</c:if>>用户</option>
            </select>
        <br>
        <input type="submit" value="编辑">
    </form>
</p>
<jsp:include flush="true" page="../../includes/admin/footer.jsp" />

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 引入 jstl 支持 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:include flush="true" page="../../includes/admin/header.jsp" />
<p>
    用户列表<a href="./users/add?page=${currentPage}"> 添加</a>
</p>
<%
    //显示提示信息
    String msg = (String)session.getAttribute("msg");
    if(msg != null) {
        out.println("<p>");
        out.println(msg);
        out.println("</p>");
        session.removeAttribute("msg");
    }
%>
<p>
    <table>
        <tr>
            <th>ID</th>
            <th>用户名</th>
            <th>用户角色</th>
            <th>操作</th>
        </tr>
        <c:forEach items="${List}" var="user">
            <tr>
                <th>${user.getId()}</th>
                <th>${user.getUsername()}</th>
                <th>
                    <c:if test="${user.getUserRoleType() == 1}">
                        管理员
                    </c:if>
                    <c:if test="${user.getUserRoleType() == 2}">
                        用户
                    </c:if>
                </th>
                <th>
                    <a href="./users/delete?id=${user.getId()}&page=${currentPage}">删除</a>
                    <a href="./users/edit?id=${user.getId()}&page=${currentPage}"> 编辑</a>
                </th>
            </tr>
        </c:forEach>
    </table>
</p>
<p>
    <c:forEach var="i" begin="1" end="${totalPage}">
        <c:if test="${currentPage == i}">
            ${i}
        </c:if>
        <c:if test="${currentPage != i}">
            <a href="./users?page=${i}">${i}</a>
        </c:if>
    </c:forEach>
</p>
<jsp:include flush="true" page="../../includes/admin/footer.jsp" />

然后我们管理员的头部文件 header.jsp 里加上这个管理页面的首页链接。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>管理员页面</title>
</head>
<body>

<p>
    <a href="/admin">首页</a>

    <a href="/admin/users">用户管理</a>

    <a href="/admin/page1">页面1</a>

    <a href="/admin/page2">页面2</a>

    <a href="/logout">登出</a>
</p>

3、然后就在 Controller  包的 Admin 包里创建一个AdminUsersController

package Controllers.Admin;

import Helpers.DbConnection;
import Models.UsersEntity;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.persistence.criteria.CriteriaBuilder;
import javax.servlet.http.HttpSession;
import java.util.List;

@Controller
public class AdminUsersController {
    //默认页数
    static int PageSize = 3;


    /**
     * @RequestParam注解的作用是:根据参数名从URL中取得参数值
     * @param page
     *             页数
     * @param model
     *            一个域对象,可用于存储数据值
     */
    @RequestMapping("/admin/users")
    public String index(@RequestParam(value = "page", defaultValue = "1") String page, Model model) {
        //创建数据库操作线程
        Session db_session = DbConnection.getSession();

        try{
            //参数预处理
            Integer currentPage = Integer.valueOf(page);

            //传递当前页面
            model.addAttribute("currentPage", currentPage);

            //创建初始创建条件
            Criteria criteria = db_session.createCriteria(UsersEntity.class);
            //每次最多
            criteria.setMaxResults(PageSize);
            //起始位置
            criteria.setFirstResult((currentPage - 1) * PageSize);
            //列出所有查询结果
            List<UsersEntity> list = criteria.list();

            model.addAttribute("List", list);

            //获取总记录数,计算总页面数,传递总页面数
            int total_page = (int)Math.ceil(((Long) (db_session.createCriteria(UsersEntity.class)
                    .setProjection(Projections.rowCount())
                    .uniqueResult())) / Double.valueOf(PageSize));
            model.addAttribute("totalPage", total_page);


            return "admin/users/index";
        }catch(Exception e) {
            //添加错误信息
            e.printStackTrace();
            model.addAttribute("error_msg", " 系统发生了错误!");
            return "admin/fail";
        }finally {
            //用完这个 数据库的 Session  记得关了
            db_session.close();
        }
    }

    /**
     * @RequestParam注解的作用是:根据参数名从URL中取得参数值
     * @param id
     *            用户 id
     * @param page
     *            当前页数
     * @param model
     *            一个域对象,可用于存储数据值
     * @param session
     *            线程对象
     */
    @RequestMapping("/admin/users/delete")
    public String delete(@RequestParam(value = "id") String id,
                         @RequestParam(value = "page", defaultValue = "1") String page,
                         Model model,
                         HttpSession session) {
        //创建数据库操作线程
        Session db_session = DbConnection.getSession();

        try{
            //参数预处理
            Integer currentPage = Integer.valueOf(page);
            Integer userId = Integer.valueOf(id);

            //进行删除操作
            //创建初始条件
            Criteria criteria = db_session.createCriteria(UsersEntity.class);
            //往条件里加东西,等同于 where `id` = userId
            criteria.add(Restrictions.eq("id", userId));
            //只返回一条结果就好
            criteria.setMaxResults(1);
            //列出所有查询结果
            List<UsersEntity> list = criteria.list();

            UsersEntity user = list.get(0);

            Transaction db_trans = db_session.beginTransaction();
            db_session.delete(user);
            db_trans.commit();

            //返回信息
            session.setAttribute("msg", "ID:" + id + "删除成功!");
            return "redirect:/admin/users?page=" + currentPage;
        }catch(Exception e) {
            //添加错误信息
            e.printStackTrace();
            model.addAttribute("error_msg", " 系统发生了错误!");
            return "admin/fail";
        }finally {
            //用完这个 数据库的 Session  记得关了
            db_session.close();
        }
    }

    /**
     * @RequestParam注解的作用是:根据参数名从URL中取得参数值
     * @param id
     *            用户 id
     * @param page
     *            当前页数
     * @param model
     *            一个域对象,可用于存储数据值
     */
    @RequestMapping(value = "/admin/users/edit", method = RequestMethod.GET)
    public String edit_show(@RequestParam(value = "id") String id,
                            @RequestParam(value = "page", defaultValue = "1") String page,
                            Model model) {
        //创建数据库操作线程
        Session db_session = DbConnection.getSession();

        try{
            //参数预处理
            Integer currentPage = Integer.valueOf(page);
            Integer userId = Integer.valueOf(id);

            //创建初始条件
            Criteria criteria = db_session.createCriteria(UsersEntity.class);
            //往条件里加东西,等同于 where `id` = userId
            criteria.add(Restrictions.eq("id", userId));
            //只返回一条结果就好
            criteria.setMaxResults(1);
            //列出所有查询结果
            List<UsersEntity> list = criteria.list();

            UsersEntity user = list.get(0);

            //给管理页面加上要编辑的用户信息
            model.addAttribute("User", user);

            return "admin/users/edit";
        }catch(Exception e) {
            //添加错误信息
            e.printStackTrace();
            model.addAttribute("error_msg", " 系统发生了错误!");
            return "admin/fail";
        }finally {
            //用完这个 数据库的 Session  记得关了
            db_session.close();
        }
    }

    /**
     * @RequestParam注解的作用是:根据参数名从URL中取得参数值
     * @param id
     *            用户 id
     * @param page
     *            当前页数
     * @param username
     *             用户名
     * @param password
     *            密码
     * @param user_role_type
     *            当前页数
     * @param model
     *            一个域对象,可用于存储数据值
     * @param session
     *            线程对象
     */
    @RequestMapping(value = "/admin/users/edit", method = RequestMethod.POST)
    public String edit(@RequestParam(value = "id") String id,
                       @RequestParam(value = "page", defaultValue = "1") String page,
                       @RequestParam(value = "username") String username,
                       @RequestParam(value = "password") String password,
                       @RequestParam(value = "user_role_type") String user_role_type,
                       Model model,
                       HttpSession session) {
        //创建数据库操作线程
        Session db_session = DbConnection.getSession();

        try{
            //参数预处理
            Integer currentPage = Integer.valueOf(page);
            Integer userId = Integer.valueOf(id);
            Byte userRoleType = Byte.valueOf(user_role_type);

            //输入参数为空
            if(username.equals("") || password.equals("")) {
                //返回 错误信息
                session.setAttribute("msg", "ID:" + id + " 编辑失败,参数不足!");
                return "redirect:/admin/users?page=" + currentPage;
            }

            //创建初始条件
            Criteria criteria = db_session.createCriteria(UsersEntity.class);
            //往条件里加东西,等同于 where `id` = userId
            criteria.add(Restrictions.eq("id", userId));
            //只返回一条结果就好
            criteria.setMaxResults(1);
            //列出所有查询结果
            List<UsersEntity> list = criteria.list();

            UsersEntity user = list.get(0);

            //创建事务,编辑,保存,提交事务
            Transaction db_trans = db_session.beginTransaction();
            user.setUsername(username);
            user.setPassword(password);
            user.setUserRoleType(userRoleType);
            db_session.update(user);
            db_trans.commit();

            //返回信息
            session.setAttribute("msg", "ID:" + id + " 编辑成功!");
            return "redirect:/admin/users?page=" + currentPage;
        }catch(Exception e) {
            //添加错误信息
            e.printStackTrace();
            model.addAttribute("error_msg", " 系统发生了错误!");
            return "admin/fail";
        }finally {
            //用完这个 数据库的 Session  记得关了
            db_session.close();
        }
    }

    /**
     * @RequestParam注解的作用是:根据参数名从URL中取得参数值
     * @param page
     *            当前页数
     * @param model
     *            一个域对象,可用于存储数据值
     */
    @RequestMapping(value = "/admin/users/add", method = RequestMethod.GET)
    public String add_show(@RequestParam(value = "page", defaultValue = "1") String page,
                           Model model) {

        try{
            //参数预处理
            Integer currentPage = Integer.valueOf(page);


            return "admin/users/add";
        }catch(Exception e) {
            //添加错误信息
            e.printStackTrace();
            model.addAttribute("error_msg", " 系统发生了错误!");
            return "admin/fail";
        }
    }

    /**
     * @RequestParam注解的作用是:根据参数名从URL中取得参数值
     * @param page
     *            当前页数
     * @param username
     *             用户名
     * @param password
     *            密码
     * @param user_role_type
     *            当前页数
     * @param model
     *            一个域对象,可用于存储数据值
     * @param session
     *            线程对象
     */
    @RequestMapping(value = "/admin/users/add", method = RequestMethod.POST)
    public String add(@RequestParam(value = "page", defaultValue = "1") String page,
                       @RequestParam(value = "username") String username,
                       @RequestParam(value = "password") String password,
                       @RequestParam(value = "user_role_type") String user_role_type,
                       Model model,
                       HttpSession session) {
        //创建数据库操作线程
        Session db_session = DbConnection.getSession();

        try{
            //参数预处理
            Integer currentPage = Integer.valueOf(page);
            Byte userRoleType = Byte.valueOf(user_role_type);

            //输入参数为空
            if(username.equals("") || password.equals("")) {
                //返回 错误信息
                session.setAttribute("msg", "添加失败,参数不足!");
                return "redirect:/admin/users?page=" + currentPage;
            }

            //创建事务,编辑,保存,提交事务
            Transaction db_trans = db_session.beginTransaction();
            UsersEntity new_user = new UsersEntity();
            new_user.setUsername(username);
            new_user.setPassword(password);
            new_user.setUserRoleType(userRoleType);
            db_session.save(new_user);
            db_trans.commit();

            //返回信息
            session.setAttribute("msg", "添加成功!");
            return "redirect:/admin/users?page=" + currentPage;
        }catch(Exception e) {
            //添加错误信息
            e.printStackTrace();
            model.addAttribute("error_msg", " 系统发生了错误!");
            return "admin/fail";
        }finally {
            //用完这个 数据库的 Session  记得关了
            db_session.close();
        }
    }
}

4、运行,测试。

总结:

到这里我们的教程就到一段落了,希望大家能够理解每一个操作,每一行代码是什么意思。

上面其实也有很多不足的地方,比如创建查询的条件的时候那个方法是过时的方法,更合适的方法在这

https://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/querycriteria.html

再比如,上面的查询和分页的那段代码应该增强复用性。

再比如从命名到注释,都得规范化,研究下 IDEA 的模板。

加油吧。