mybatis和servlet整和 增删改查

重定向和请求转发的区别

一个会改变地址,一个不会改变url的地址
一个不能传对象,一个可以传对象过去

1.OpenSessionInView 的使用

Open Session In View 模式:
Open Session In View 是将一个数据库会话对象绑定到当前请求线程中,在请求期间一直
保持数据库会话对象处于Open 状态,使数据库会话对象在请求的整个期间都可以使用。直
到产生响应后关闭当前的数据库会话对象。
image

点击查看代码
/**
* 在Filter 中打开一个SqlSession
*/
@WebFilter("/*")
public class OpenSqlSessionInViewFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws
ServletException {
}
//一有请求就创建sqlsession,这里直接进行业务提交和回滚等操作,不用在业务层操作了
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain) throws
IOException, ServletException {
SqlSession sqlSession = MybatisUtils.getSqlSession();
try{
filterChain.doFilter(servletRequest, servletResponse);
sqlSession.commit();
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally {
MybatisUtils.closeSqlSession();
}
}
@Override
public void destroy() {
}
}

2.创建页面

开始页面有增删改查四个超链接,每个超链接对应一个页面
创建操作完成界面,完成每个页面,都重定向到这个页面

2.1创建查看页面

需要导入jstl标签,进行一些操作,还要进行js和form表单的提交

点击查看代码
<%--
  Created by IntelliJ IDEA.
  User: muzi
  Date: 2021/12/9
  Time: 15:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>显示</title>
    <script>
        function subForm(pageIndex) {
            // 将页码给form表单的pageInfo
            document.getElementById("pageInfo").value=pageIndex;
            // 执行form表达
            document.forms[0].submit();
        }
    </script>
</head>
<body>
<%--要传回的数据--%>
<form action="usersServlet.do" method="post">
    <%--    隐藏的信息,用于servlet判断当前操作--%>
    <input type="hidden" name="flag" value="selectUsers"/>
<%--        回传给 servlet当前页码--%>
    <input type="hidden" name="pageIndex" id="pageInfo"/>
    <input type="hidden" name="${users.username}"/>
    <input type="hidden" name="${users.usersex}"/>
</form>

<table align="center" border="1" width="40%">
    <tr>
        <th>id</th>
        <th>姓名</th>
        <th>性别</th>
    </tr>
    <%--    遍历pageInfo中的users--%>
    <c:forEach items="${pageInfo.list}" var="user">
        <tr>
            <td>${user.userid}</td>
            <td>${user.username}</td>
            <td>${user.usersex}</td>
        </tr>
    </c:forEach>
    <%--    添加换页的功能--%>
    <tr>
        <td align="center" colspan="3">
            <c:if test="${pageInfo.pageNum > 1}">
                <a href="#" onclick="subForm(${pageInfo.pageNum - 1})">上一页</a>
            </c:if>
<%--            这就相当于for 1到pageInfo.pages的循环打印数字,数字放在st中--%>
            <c:forEach begin="1" end="${pageInfo.pages}"
                       varStatus="st">
                <c:choose>
                    <c:when test="${pageInfo.pageNum eq st.count}">
                        <a style="color: red" href="#"
                           onclick="subForm(${st.count})">${st.count}</a>
                    </c:when>
                    <c:otherwise>
                        <a href="#"
                           onclick="subForm(${st.count})">${st.count}</a>
                    </c:otherwise>
                </c:choose>
            </c:forEach>
            <c:if test="${pageInfo.pageNum < pageInfo.pages}">
                <a href="#" onclick="subForm(${pageInfo.pageNum + 1})">下一页</a>
            </c:if>
        </td>
    </tr>
</table>
</body>
</html>


3.创建servlet控制层

3.1添加用户

点击查看代码
 @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String flag = req.getParameter("flag");
        //判断页面传来的表达是干什么
        if (flag.equals("addUsers") ) {
            this.addUsers(req, resp);
        }
    }
    //添加用户操作
    public void addUsers(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取数据
        Users users = this.createUsers(req);
        //调用服务层
        UsersService usersService = new UsersServiceImpl();
        usersService.addUsers(users);
        resp.sendRedirect("ok.jsp");
    }
    //获取页面传来的数据
    public Users createUsers(HttpServletRequest req) {
        Users users = new Users();
        users.setUsername(req.getParameter("username") );
        users.setUsersex(req.getParameter("usersex") );
        return users;
    }

3.2 查看用户

点击查看代码
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String flag = req.getParameter("flag");
        //判断页面传来的表达是干什么
        if (flag.equals("addUsers") ) {
            this.addUsers(req, resp);
        } else if (flag.equals("selectUsers") ) {
            this.selectUsers(req, resp);
        }
    }
    //查看用户
    public void selectUsers(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取数据
        Users users = this.createUsers(req);
        //用于获取当前页数,用于分页操作
        String pageIndex = req.getParameter("pageIndex");
        int page = 1;
        if( pageIndex != null && pageIndex.length() > 0) {
            //查询的页数存放 进page
            page = Integer.parseInt(pageIndex);
        }
        //业务操作
        UsersService usersService = new UsersServiceImpl();
        PageInfo<Users> pageInfo = usersService.selectUsers(page, users);
        //返回 users对象,用于下次分页查询,  pagInfo 这次查询结果
        //放入Attribute对象中,后面 请求转发给界面
        req.setAttribute("users", users);
        req.setAttribute("pageInfo", pageInfo);
//        请求转发给界面
        req.getRequestDispatcher("showUsers.jsp").forward(req, resp);
    }

3.3删除用户

点击查看代码

3.4修改用户

点击查看代码

4. 创建业务层

4.1 添加用户的

点击查看代码
    public void addUsers(Users users) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
        mapper.insertSelective(users);
        //这里不用提交事务和处理异常,监听那边已经处理了
    }

4.2查看用户

点击查看代码
    @Override
    public PageInfo<Users> selectUsers(int page, Users users) {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UsersMapper mapper = sqlSession.getMapper(UsersMapper.class);
        //拼接查询条件
        UsersExample usersExample = this.createUsersExample(users);
        PageHelper.startPage(page,2);
        List<Users> list = mapper.selectByExample(usersExample);
        PageInfo<Users> pageInfo = new PageInfo(list);
        return pageInfo;
    }
    //查询条件
    private UsersExample createUsersExample(Users users) {
        UsersExample usersExample = new UsersExample();
        UsersExample.Criteria criteria = usersExample.createCriteria();
        if(users.getUsername() != null && users.getUsername().length() > 0) {
            criteria.andUsersexEqualTo(users.getUsername() );
        }
        if(users.getUsersex() != null && users.getUsersex().length() > 0) {
            criteria.andUsersexEqualTo(users.getUsersex() );
        }

        return usersExample;
    }

分页查询时,查询对象要维护好,第一次查询是按照给定的users查询的,但是点第二次查询时也要以前的对象进行查询,否则点下一次查询的就有问题,分页插件PageHelper中的PageInfo 对象可以用来进行分页的一些列操作。

posted @ 2021-12-08 22:34  风的指引  阅读(241)  评论(0)    收藏  举报