Servlet+Jsp—增删改查

Servlet+Jsp—增删改查

从一开始的网络编程(TCP编程对Socket进行监听,到HTTP编程),现在终于可以使用强大的API进行JavaEE编程了,Servlet底层封装了各种网络协议的处理,使我们不再深陷于对协议的编程,我们只需要处理请求和返回响应就行了。这次是个简单的用Servlet类来处理对用户的简单的增删改查,我们通过对实体类与数据库的映射来将数据传送到JSP页面上进行展示。
模式如下,controller层、dao层、pojo层(用户实体类)、utils层(封装jdbc)

utils类(封装jdbc)

public class JdbcUtils {

    
    private JdbcUtils() {}
    
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    public static Connection getConnection() throws SQLException{
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/djm","root","123456");
        
    }
    
    public static void close (Connection conn,PreparedStatement ps,ResultSet rs){
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(ps!=null) {
            try {
                ps.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        if(conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

一、用户验证

1.登录页面,用于验证登录如果没有则查看不了信息(在写代码之前导入jdbc的jar包)

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>login</title>
</head>
<body>
<form action="/ServletJSPLX/LoginCheck">
username:<input type="text" name="username"><br>
password:<input type="text" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>

2、logincheck页面连接数据库查询有没有该用户,如果成功则会跳到显示用户信息的页面,没有则跳到error页面

@Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("UTF-8");
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        boolean loginsuccess=false;
        try {
            conn = JdbcUtils.getConnection();
            ps = conn.prepareStatement("select * from user where username=? and password=?");
            ps.setString(1,username);
            ps.setString(2,password);
            rs = ps.executeQuery();
            if(rs.next()) {
                loginsuccess=true;
            }
            conn.commit();
        } catch (Exception e) {
            // TODO: handle exception
            if(conn!=null) {
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
            e.printStackTrace();
        }finally {
            JdbcUtils.close(conn, ps, rs);
        }
        if(loginsuccess) {
            request.getRequestDispatcher("/ListUserServlet").forward(request, response);
        }else {
            request.getRequestDispatcher("/error.jsp").forward(request, response);
        }
    }

二、查询全部的信息,就是上面登录成功跳转需要的代码

1、dao层接口写方法

public interface UserDao {
    //查找全部
    public List<User> getAllUser();
}

2、dao才能够接口具体实现类

//查全部
    @Override
    public List<User> getAllUser() {
        // TODO Auto-generated method stub
        //连接数据库对象
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        //定义集合
        List list = new ArrayList<User>();
        try {
            //连接数据库
            conn = JdbcUtils.getConnection();
            //查询语句
            ps = conn.prepareStatement("select * from user");
            //获取结果集
            rs = ps.executeQuery();            
            while(rs.next()) {
                //while循环结果集数据
                String username = rs.getString("username");
                int userno = rs.getInt("userno");
                String job = rs.getString("job");
                String password = rs.getString("password");
                BigDecimal sal = rs.getBigDecimal("sal");
                //给对象赋值
                User user = new User(username,userno,job,password,sal);
                //对象加入到集合
                list.add(user);
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            //注意!!!一定要关闭资源
            JdbcUtils.close(conn, ps, rs);
        }
        return list;
    }

3、controller层调用具体实现类方法,如果查到就会跳转到list.jsp显示查到的数据

@WebServlet("/ListUserServlet")
public class ListUserServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        UserDaoImpl dao = new UserDaoImpl();
        List<User> users = dao.getAllUser();
        
        request.setAttribute("users",users);
        request.getRequestDispatcher("/user/list.jsp").forward(request, response);
    }
}

4、list.jsp页面如下,下面的查询表单是下面要写的单条数据查询用到的,del和update链接是用来删除和修改用的,最下面的insert是用来插入新数据的

<form action="FindUser">
<input type="number" name="userno"><input type="submit" value="查询">
</form>

<%
    List<User> users=(List<User>)request.getAttribute("users");
%>

<table border="1">
    <tr>
        <th>用户名字</th>
        <th>用户编号</th>
        <th>用户工作</th>
        <th>用户密码</th>
        <th>用户工资</th>
        <th>操作</th>
    </tr>


<%
    for(int i=0;i<users.size();i++){
        User user=users.get(i);
    
%>
    <tr>
        <td><%=user.getUserame() %></td>
        <td><%=user.getUserno() %></td>
        <td><%=user.getJob() %></td>
        <td><%=user.getPassword() %></td>
        <td><%=user.getSal() %></td>
        <td>
            <a href="<%=request.getContextPath() %>/DeleteUser?userno=<%=user.getUserno() %>">del</a>
            <a href="<%=request.getContextPath() %>/FindUser?userno=<%=user.getUserno() %>">update</a>
        </td>
    </tr>

<%
    }
%>
</table>
<a href="user/insert.jsp">insert</a>

5、如下查询到的页面,查询表单查询单列数据,del和update链接负责删和修改,最后的insert负责插入新的数据

 如下数据库表和查到的一样

 三、删除数据

1、dao层接口方法,因为删除要根据条件查出一条数据来,这里用userno当做条件,有参方法

public interface UserDao {
    //删除
    public void deleteUser(int userno);
}

2、具体实现类方法

//
    @Override
    public void deleteUser(int userno) {
        // TODO Auto-generated method stub
        //数据库连接对象
        Connection conn=null;
        PreparedStatement ps=null;
        try {
            //数据库连接
            conn = JdbcUtils.getConnection();
            //删除语句
            ps = conn.prepareStatement("delete from user where userno=?");
            //根据userno来删除
            ps.setInt(1,userno);
            //返回受影响的行数
            int count = ps.executeUpdate();
            if(count==0) {
                throw new RuntimeException("行数没变化");
            }
            } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            //注意!!!一定要关闭资源
            JdbcUtils.close(conn, ps, null);
        }
    }

3、controller层调用方法,如果显示删除成功则在跳转到主页list.jsp页面显示看有没有删除

@WebServlet("/DeleteUser")
public class DeleteUser extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        String userno = request.getParameter("userno");
        UserDaoImpl dao = new UserDaoImpl();
        dao.deleteUser(new Integer(userno));
        request.getRequestDispatcher("/ListUserServlet").forward(request, response);
    }
    
}

4、主页显示页面还是上面的jsp页面

<form action="FindUser">
<input type="number" name="userno"><input type="submit" value="查询">
</form>

<%
    List<User> users=(List<User>)request.getAttribute("users");
%>

<table border="1">
    <tr>
        <th>用户名字</th>
        <th>用户编号</th>
        <th>用户工作</th>
        <th>用户密码</th>
        <th>用户工资</th>
        <th>操作</th>
    </tr>


<%
    for(int i=0;i<users.size();i++){
        User user=users.get(i);
    
%>
    <tr>
        <td><%=user.getUserame() %></td>
        <td><%=user.getUserno() %></td>
        <td><%=user.getJob() %></td>
        <td><%=user.getPassword() %></td>
        <td><%=user.getSal() %></td>
        <td>
            <a href="<%=request.getContextPath() %>/DeleteUser?userno=<%=user.getUserno() %>">del</a>
            <a href="<%=request.getContextPath() %>/FindUser?userno=<%=user.getUserno() %>">update</a>
        </td>
    </tr>

<%
    }
%>
</table>
<a href="user/insert.jsp">insert</a>

5、下面的链接是删除的,先根据userno来查对应的一条数据,然后跳转到对应的controller层调用方法再删(一定要注意对应servlet的映射路径,我这里用的注解,你也可以用web.xml来配)

<a href="<%=request.getContextPath() %>/DeleteUser?userno=<%=user.getUserno() %>">del</a>

6、然后点击del删除,这里我们删除pp就删除了,数据库如下图也没了

 四、查询单条数据

1、dao层接口方法,和上面删除一样,要根据条件来查,用userno当条件,因为如果查询的会有多个字段,这用User来充当方法名

public interface UserDao { 
    //查一条
    public User findUser(int userno);    
}

2、dao层具体实现类

//查一条
    @Override
    public User findUser(int userno) {
        // TODO Auto-generated method stub
        //数据库使用对象
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        //定义类
        User user=null;
        try {
            //数据库连接
            conn = JdbcUtils.getConnection();
            //条件查询
            ps = conn.prepareStatement("select * from user where userno=?");
            //根据userno来查
            ps.setInt(1,userno);
            //获取结果集
            rs = ps.executeQuery();            
            while(rs.next()) {
                //while循环结果集数据
                String username = rs.getString("username");
                int userno1 = rs.getInt("userno");
                String job = rs.getString("job");
                String password = rs.getString("password");
                BigDecimal sal = rs.getBigDecimal("sal");
                //加入到对象中
                user = new User(username,userno1,job,password,sal);
            }
            return user;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            //注意!!!一定要关闭资源
            JdbcUtils.close(conn, ps, rs);
        }
        
    }

3、controller层调用方法

@WebServlet("/FindUser")
public class FindUser extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        String userno = request.getParameter("userno");
        UserDaoImpl dao = new UserDaoImpl();
        User user = dao.findUser(new Integer(userno));
        request.setAttribute("user",user);
        request.getRequestDispatcher("/user/update.jsp").forward(request, response);
    }
    
}

4、主页还是上面的list.jsp页面这里就不写了,下面的form表单就是查询单列的数据

//action跳转到Finder这个servlet,就是上面的controller调用方法对应的servlet
<form action="FindUser">
<input type="number" name="userno"><input type="submit" value="查询">
</form>

5、查询回跳到另一个js显示如下,action是修改的路径,所以它俩公用一个jsp

<form action="<%=request.getContextPath()%>/UpdateUser" method="post">
    username:<input type="text" name="username" value="<%=user.getUserame() %>"><br>
    userno:<input type="number" name="userno" value="<%=user.getUserno()%>"><br>
    job:<input type="text" name="job" value="<%=user.getJob() %>"><br>
    password:<input type="text" name="password" value="<%=user.getPassword() %>"><br>
    sal:<input type="number" name="sal" value="<%=user.getSal() %>"><br>
    <input type="submit" value="update">
 </form> 

5、如下图可以查询到1005的信息

五、修改数据

1、dao层接口类

public interface UserDao {    
    //修改
    public void updateUser(User user);
}

2、具体实现类

//修改
    @Override
    public void updateUser(User user) {
        // TODO Auto-generated method stub
        //数据库使用的对象
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            //连接数据库
            conn = JdbcUtils.getConnection();
            //修改语句
            ps = conn.prepareStatement("update user set username=?,job=?,password=?,sal=? where userno=?");
            //获取的对象加入
            ps.setString(1,user.getUserame());
            ps.setString(2,user.getJob());
            ps.setString(3,user.getPassword());
            ps.setBigDecimal(4,user.getSal());
            ps.setInt(5,user.getUserno());
            //受影响的行数
            int count = ps.executeUpdate();
            if(count==0) {
                throw new RuntimeException("行数没变化");
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            //注意!!!一定要关闭资源
            JdbcUtils.close(conn, ps, rs);
        }               
    }

3、controller类调用方法来修改数据,修改的数据传过来,然后存进user类调用实现类update方法,存进去那里面,然后显示

@WebServlet("/UpdateUser")
public class UpdateUser extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        String job = request.getParameter("job");
        String password = request.getParameter("password");
        String sal = request.getParameter("sal");
        String userno = request.getParameter("userno");
        User user = new User(username,new Integer(userno),job,password,new BigDecimal(sal));
        UserDaoImpl dao = new UserDaoImpl();
        dao.updateUser(user);
        request.getRequestDispatcher("/ListUserServlet").forward(request, response);
    }
}

4、jsp页面还是上面的jsp页面,然后下面的链接,是根据userno来查询到单列数据再改,如上一个所说,公用一个jsp

<a href="<%=request.getContextPath() %>/FindUser?userno=<%=user.getUserno() %>">update</a>
<form action="<%=request.getContextPath()%>/UpdateUser" method="post">
    username:<input type="text" name="username" value="<%=user.getUserame() %>"><br>
    userno:<input type="number" name="userno" value="<%=user.getUserno()%>"><br>
    job:<input type="text" name="job" value="<%=user.getJob() %>"><br>
    password:<input type="text" name="password" value="<%=user.getPassword() %>"><br>
    sal:<input type="number" name="sal" value="<%=user.getSal() %>"><br>
    <input type="submit" value="update">
 </form> 

5、如下图可以修改

六、插入新的数据

1、dao层接口

public interface UserDao {
    //插入
    public void insertUser(User user);
}

2、具体实现类

//插入新数据
    @Override
    public void insertUser(User user) {
        // TODO Auto-generated method stub
        //数据库使用的对象
        Connection conn=null;
        PreparedStatement ps=null;
        ResultSet rs=null;
        try {
            //连接数据库
            conn = JdbcUtils.getConnection();
            //添加语句
            ps = conn.prepareStatement("insert into user(username,userno,job,password,sal) values(?,?,?,?,?)");
            //获取修改的数据传进去
            ps.setString(1,user.getUserame());
            ps.setInt(2,user.getUserno());
            ps.setString(3,user.getJob());
            ps.setString(4,user.getPassword());
            ps.setBigDecimal(5,user.getSal());
            //受影响的行数
            int count = ps.executeUpdate();
            if(count==0) {
                throw new RuntimeException("行数没变化");
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            throw new RuntimeException(e);
        }finally {
            //注意!!!一定要关闭资源
            JdbcUtils.close(conn, ps, rs);
        }
        
    }

3、controller层调用方法,并将获取的数据存储起来

@WebServlet("/InsertServlet")
public class InsertServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
     //防止乱码
        request.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        String userno = request.getParameter("userno");
        String job = request.getParameter("job");
        String password = request.getParameter("password");
        String sal = request.getParameter("sal");
        
     //新获取的数据存到里面
        User user = new User();
        user.setUsername(username);
        user.setUserno(new Integer(userno));
        user.setJob(job);
        user.setPassword(password);
        user.setSal(new BigDecimal(sal));
        
        UserDaoImpl dao = new UserDaoImpl();
        dao.insertUser(user);
        request.getRequestDispatcher("/ListUserServlet").forward(request, response);
    }
}

4、插入数据的话就在弄一个新的表单insert.jsp如下,跳转到插入的servlet

<form action="<%=request.getContextPath()%>/InsertServlet" method="post">
    username:<input type="text" name="username"><br>
    usero:<input type="number" name="userno"><br>
    job:<input type="text" name="job"><br>
    password:<input type="number" name="password"><br>
    sal:<input type="number" name="sal">
<input type="submit" value="添加员工">

5、插入新的数据如下所示

 

 

posted @ 2022-11-13 21:01  花海~  阅读(1293)  评论(0)    收藏  举报