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、插入新的数据如下所示