JavaWeb开发实战(三)

简介: JavaWeb开发实战(三)

八、查询用户业务

8.1 创建查询用户持久层

创建查询用户的抽象方法和实现类。

package com.zj.dao;
import com.zj.pojo.User;
import java.util.List;
public interface UserManageDao {
    //用户添加
    void insertUser(User user);
    //查询用户
    List<User> selectUserByProperty(User user);
}
package com.zj.dao.impl;
import com.zj.commons.jdbcUtils;
import com.zj.dao.UserManageDao;
import com.zj.pojo.User;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class UserManageDaoImpl implements UserManageDao {
    @Override
    public void insertUser(User user) {
        Connection con = null;
        try {
            con = jdbcUtils.getConnection();
            //关闭自动提交事务,加深对事务印象
            con.setAutoCommit(false);
            PreparedStatement ps = con.prepareStatement("INSERT INTO users values (default ,?,?,?,?,?)");
            ps.setString(1, user.getUsername());
            ps.setString(2, user.getUserpwd());
            ps.setString(3, user.getUsersex());
            ps.setString(4, user.getPhonenumber());
            ps.setString(5, user.getQqnumber());
            ps.executeUpdate();
            con.commit();
        }catch (Exception e) {
            e.printStackTrace();
            //出现异常回滚
            jdbcUtils.rollbackConnection(con);
        }finally {
           jdbcUtils.closeConnection(con);
        }
    }
    @Override
    public List<User> selectUserByProperty(User user) {
        Connection con = null;
        List<User> users = new ArrayList<User>();
        try {
            con = jdbcUtils.getConnection();
            String sql = this.createSQL(user);
            PreparedStatement ps = con.prepareStatement(sql);
            ResultSet resultSet = ps.executeQuery();
            while (resultSet.next()) {
                User u = new User();
                u.setUserid(resultSet.getInt("userid"));
                u.setUsername(resultSet.getString("username"));
                u.setPhonenumber(resultSet.getString("phonenumber"));
                u.setQqnumber(resultSet.getString("qqnumber"));
                u.setUserpwd(resultSet.getString("userpwd"));
                u.setUsersex(resultSet.getString("usersex"));
                users.add(u);
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        return users;
    }
    //sql拼接
    private String createSQL(User user){
        //没有给定查询参数时,查询全部数据
        StringBuffer stringBuffer = new StringBuffer("select * from users where 1=1");
         if (user.getUsersex() !=null && user.getUsersex().length() > 0){//从表单获取的数据是空串,也是有长度的。所以还要判断当前的字段的长度。
             //拼接到sql
             stringBuffer.append(" and usersex="+user.getUsersex());
         }
         if (user.getQqnumber() !=null && user.getQqnumber().length()>0){
             stringBuffer.append(" and qqnumber="+user.getQqnumber());
         }
        if (user.getUsername() !=null && user.getUsername().length()>0){
            stringBuffer.append(" and username="+user.getUsername());
        }
        if (user.getPhonenumber() !=null && user.getPhonenumber().length()>0){
            stringBuffer.append(" and phonenumber="+user.getPhonenumber());
        }
         return stringBuffer.toString();
    }
}

8.2 创建查询用户的业务层

package com.zj.service;
import com.zj.pojo.User;
import java.util.List;
public interface UserManageService {
    void addUser(User user);
    List<User> findUsers(User user);
}
package com.zj.service.Impl;
import com.zj.dao.UserManageDao;
import com.zj.dao.impl.UserManageDaoImpl;
import com.zj.pojo.User;
import com.zj.service.UserManageService;
import java.util.List;
public class UserManageServiceImpl implements UserManageService {
    /*添加用户*/
    @Override
    public void addUser(User user) {
        UserManageDao userManageDao = new UserManageDaoImpl();
        userManageDao.insertUser(user);
    }
    /*查询用户*/
    @Override
    public List<User> findUsers(User user) {
        UserManageDao userManageDao = new UserManageDaoImpl();
        List<User> users = userManageDao.selectUserByProperty(user);
        return users;
    }
}

8.3 创建查询用户的servlet

/*处理查询用户请求*/
    private void findUsers(HttpServletRequest request,HttpServletResponse response) throws IOException {
         //获取用户请求的数据
        User user = this.createUser(request, response);
        try {
            UserManageService userManageService = new UserManageServiceImpl();
            List<User> users = userManageService.findUsers(user);
            request.setAttribute("list",users);
            request.getRequestDispatcher("usermanage/showUsers.jsp").forward(request, response);
        }catch (Exception e){
            e.printStackTrace();
            response.sendRedirect("error.jsp");
        }
    }

8.4 创建查询用户与显示结果的页面

查询用户页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    <link href="../css/style.css" rel="stylesheet" type="text/css" />
    <link href="../css/select.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="place">
    <span>位置:</span>
    <ul class="placeul">
        <li><a href="#">用户管理</a></li>
        <li><a href="#">查询用户</a></li>
    </ul>
</div>
<div class="rightinfo">
<form method="post" action="../userManage.do">
    <input type="hidden" name="flag" value="find"/>
    <ul class="prosearch">
        <li>
            <label>查询:</label>
            <i>用户名</i>
            <a>
                <input name="username" type="text" class="scinput" />
            </a>
        </li>
        <li>
            <label>性别:</label>
            <input name="usersex" type="radio" value="1" checked="checked" />&nbsp;男&nbsp;&nbsp;
            <input name="usersex" type="radio" value="0" />&nbsp;女
        </li>
        <li>
            <label>手机号:</label>
            <a>
                <input name="phonenumber" type="text" class="scinput" />
            </a>
        </li>
        <li>
            <label>QQ号:</label>
            <a>
                <input name="qqnumber" type="text" class="scinput" />
            </a>
        </li>
        <a>
            <input  type="submit" class="sure" value="查询"/>
        </a>
    </ul>
</form>
</div>
</body>
</html>

显示结果页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>显示用户数据</title>
    <%--当前页面是服务端跳转的页面不需要在样式文件加../--%>
    <link href="css/style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="place">
    <span>位置:</span>
    <ul class="placeul">
        <li><a href="#">用户管理</a></li>
        <li><a href="#">查询用户</a></li>
        <li><a href="#">查询结果</a></li>
    </ul>
</div>
<div class="rightinfo">
    <div class="formtitle1"><span>用户列表</span></div>
    <table class="tablelist" >
        <thead>
        <tr>
            <th>序号</th>
            <th>用户名</th>
            <th>用户性别</th>
            <th>手机号</th>
            <th>QQ号</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        <c:forEach var="user" items="${requestScope.list}" varStatus="status">
        <tr>
            <td>${status.count}</td>
            <td>${user.username}</td>
            <td>
                <c:choose>
                    <c:when test="${user.usersex == 1}">男</c:when>
                    <c:otherwise>女</c:otherwise>
                </c:choose>
            </td>
            <td>${user.phonenumber}</td>
            <td>${user.qqnumber}</td>
            <td><a href="userUpdate.html" class="tablelink">修改</a> &nbsp;&nbsp;&nbsp;&nbsp;  <a href="#" class="tablelink click"> 删除</a></td>
        </tr>
        </c:forEach>
        </tbody>
    </table>
    <div class="tip">
        <div class="tiptop"><span>提示信息</span><a></a></div>
        <div class="tipinfo">
            <span><img src="images/ticon.png" /></span>
            <div class="tipright">
                <p>是否确认对信息的修改 ?</p>
                <cite>如果是请点击确定按钮 ,否则请点取消。</cite>
            </div>
        </div>
        <div class="tipbtn">
            <input name="" type="button"  class="sure" value="确定" />&nbsp;
            <input name="" type="button"  class="cancel" value="取消" />
        </div>
    </div>
</div>
<script type="text/javascript">
    $('.tablelist tbody tr:odd').addClass('odd');
</script>
</body>
</html>

九、更新用户业务

9.1 创建预更新用户查询的持久层接口和实现类

package com.zj.dao;
import com.zj.pojo.User;
import java.util.List;
public interface UserManageDao {
    //用户添加
    void insertUser(User user);
    //查询用户
    List<User> selectUserByProperty(User user);
    //更新用户
    User selectUserById(int userid);
}
//根据id查询用户数据
    @Override
    public User selectUserById(int userid) {
        Connection con = null;
        User u = null;
        try {
          con = jdbcUtils.getConnection();
          PreparedStatement ps = con.prepareStatement("select * from users where  userid = ?");
          ps.setInt(1, userid);
          ResultSet resultSet = ps.executeQuery();
          while (resultSet.next()) {
              u = new User();
              u.setUserid(resultSet.getInt("userid"));
              u.setUsername(resultSet.getString("username"));
              u.setPhonenumber(resultSet.getString("phonenumber"));
              u.setQqnumber(resultSet.getString("qqnumber"));
              u.setUserpwd(resultSet.getString("userpwd"));
              u.setUsersex(resultSet.getString("usersex"));
          }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            jdbcUtils.closeConnection(con);
        }
        return u;
    }

9.2 创建预更新用户的业务层

package com.zj.service;
import com.zj.pojo.User;
import java.util.List;
public interface UserManageService {
    void addUser(User user);
    List<User> findUsers(User user);
    User findUserById(int id);
}
/*根据用户id查询用户,预更新用户*/
    @Override
    public User findUserById(int id) {
        UserManageDao userManageDao = new UserManageDaoImpl();
        User user = userManageDao.selectUserById(id);
        return user;
    }

9.3 创建更新预查询的servlet

//用户预更新查询
    public void preUpdate(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String userid = request.getParameter("userid");
        try {
            UserManageService userService = new UserManageServiceImpl();
            User user = userService.findUserById(Integer.parseInt(userid));
            request.setAttribute("user", user);
            request.getRequestDispatcher("usermanage/update.jsp").forward(request, response);
        }catch (Exception e){
            e.printStackTrace();
            response.sendRedirect("error.jsp");
        }
    }

9.4 创建更新用户页面

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    <link href="css/style.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript">
        function update(){
            window.location='ok.html';
        }
    </script>
</head>
<body>
<div class="place">
    <span>位置:</span>
    <ul class="placeul">
        <li><a href="#">用户管理</a></li>
        <li><a href="#">修改用户</a></li>
    </ul>
</div>
<div class="formbody">
    <div class="formtitle"><span>基本信息</span></div>
    <form method="post" action="../userManage.do">
    <ul class="forminfo">
        <li><label>用户名</label><input name="username" type="text" class="dfinput" value="${requestScope.user.username}"/> </li>
        <li>
            <label>性别</label>
            <c:choose>
                <c:when test="${requestScope.user.usersex == 1}">
                    <input name="usersex" type="radio" value="1" checked="checked" />男&nbsp;&nbsp;&nbsp;&nbsp;
                    <input name="usersex" type="radio" value="0" />女
                </c:when>
                <c:otherwise>
                    <input name="usersex" type="radio" value="1"  />男&nbsp;&nbsp;&nbsp;&nbsp;
                    <input name="usersex" type="radio" value="0" checked="checked"/>女
                </c:otherwise>
            </c:choose>
        </li>
        <li><label>手机号</label><input name="phonenumber" type="text" class="dfinput" value="${requestScope.user.phonenumber}"/></li>
        <li><label>QQ号</label><input name="qqnumber" type="text" class="dfinput" value="${requestScope.user.qqnumber}"/></li>
        <li><label>&nbsp;</label><input  type="submit" class="btn" value="确认修改"/></li>
    </ul>
    </form>
</div>
</body>
</html>

9.5 创建更新用户持久层

package com.zj.dao;
import com.zj.pojo.User;
import java.util.List;
public interface UserManageDao {
    //用户添加
    void insertUser(User user);
    //查询用户
    List<User> selectUserByProperty(User user);
    //预更新用户
    User selectUserById(int userid);
    //更新用户
    void updateUser(User user);
}
@Override
    public void updateUser(User user) {
         Connection con = null;
         try {
             con = jdbcUtils.getConnection();
             con.setAutoCommit(false);
             PreparedStatement ps = con.prepareStatement("update users set userpwd=?, username=?,usersex=?,phonenumber=?,qqnumber=?");
             ps.setString(1, user.getUserpwd());
             ps.setString(2,user.getUsername());
             ps.setString(3,user.getUsersex());
             ps.setString(4, user.getPhonenumber());
             ps.setString(5, user.getQqnumber());
             int i = ps.executeUpdate();
             con.commit();
         }catch (Exception e){
             e.printStackTrace();
             jdbcUtils.rollbackConnection(con);
         }finally {
             jdbcUtils.closeConnection(con);
         }
    }


相关文章
|
7天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
18 4
|
8天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
29 4
|
8天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
14 0
|
8天前
|
Java API Android开发
kotlin和java开发优缺点
kotlin和java开发优缺点
22 0
WK
|
14天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
27 0
|
6天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
15天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
3天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
16 9
|
6天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
3天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin