【Web】Servlet完整的前后端连接实例

    技术2022-07-10  150

    【Web】Servlet完整的前后端连接实例

    前言Codemodel层Userutil层DBUtildao层UserDaoservice层UserServiceservlet层AddServlet增删查数据方法类HelloServlet测试连接方法类LoginServlet前端登陆测试方法类 效果图本系列导航

    前言

    暑期项目实习第五课,用IDEA写个连接Mysql实现第四课【Web】Servlet有条理的实现层次分明的注册及注销 还未实现的查询功能。 由于本Blog为该项目的最终章,所以在代码片段均完整附上所有代码内容。 注:MySql选用8.0.17版本,5.X版本的同学可查阅【MySql】MySql5.0与8.0在连接数据库时候的区别。

    Code

    本次继续按照此思路,首先建立model层的User类,然后依此完成util层–>dao层–>service层–>servlet层–>jsp层

    项目展开目录:

    model层User

    建立与数据库字段一一对应的用户类User,并添加上响应的方法,且应使用private私有属性,保证程序安全性。

    package com.zr0629.model; public class User { private int id; private String name; private String password; private String age; //按住键盘上的alt + insert键(或者右键选择Generate) 选择getter and setter public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + ", age='" + age + '\'' + '}'; } }

    util层DBUtil

    package com.zr0629.util; import java.sql.*; public class DBUtil { public static Connection getConnection() throws ClassNotFoundException, SQLException { Class.forName("com.mysql.cj.jdbc.Driver"); //mysql6.0后要加.cj System.out.println("连接数据库"); //创建连接 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/abc?useSSL=false&serverTimezone=Asia/Shanghai", "root", "root"); //mysql版本8.0后要加&serverTimezone=Asia/Shanghai 5.X的版本可不加 System.out.println("连接成功!"); return connection; } public static void closeAll(ResultSet rs, Statement stmt,Connection conn)throws SQLException{ if(rs!=null){ rs.close(); } if(stmt!=null){ stmt.close(); } if (conn!=null){ conn.close(); } } }

    dao层UserDao

    在原先dao层基础上,我们添加selectByName方法来实现查询功能。

    package com.zr0629.dao; import com.zr0629.model.User; import com.zr0629.util.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class UserDao { //与数据库打交道的Dao层 public int add(User user){ Connection connection = null; PreparedStatement pstmt = null; int count = 0; try{ connection = DBUtil.getConnection(); System.out.println("连接成功"); //获得执行sql的Statement对象 pstmt = connection.prepareStatement("insert into user (name,password,age) values (?,?,?)"); pstmt.setString(1,user.getName()); pstmt.setString(2,user.getPassword()); pstmt.setString(3,user.getAge()); //执行sql,获得结果 count = pstmt.executeUpdate(); System.out.println("insert操作:"+count); return count; }catch (Exception e){ e.printStackTrace(); }finally { try { DBUtil.closeAll(null,pstmt,connection); //由于没有结果集所以第一项为空 } catch (SQLException throwables) { throwables.printStackTrace(); } } return count; } public int del(User user){ Connection connection = null; PreparedStatement pstmt = null; int count = 0; try{ connection = DBUtil.getConnection(); System.out.println("连接成功"); //获得执行sql的Statement对象 pstmt = connection.prepareStatement("DELETE FROM `user` WHERE name=? AND password=? AND age = ?"); pstmt.setString(1,user.getName()); pstmt.setString(2,user.getPassword()); pstmt.setString(3,user.getAge()); //执行sql,获得结果 count = pstmt.executeUpdate(); System.out.println("delete操作:"+count); return count; }catch (Exception e){ e.printStackTrace(); }finally { try { DBUtil.closeAll(null,pstmt,connection); //由于没有结果集所以第一项为空 } catch (SQLException throwables) { throwables.printStackTrace(); } } return count; } public User selectByName(String name){ ResultSet rs = null; Connection conn = null; PreparedStatement pstmt = null; DBUtil util = new DBUtil(); User user = new User(); try { conn = util.getConnection(); pstmt = conn.prepareStatement("select * from user where name = ?"); pstmt.setString(1,name); rs = pstmt.executeQuery(); //处理结果集 while (rs.next()) { user.setId(rs.getInt(1)); user.setName(rs.getString(2)); user.setPassword(rs.getString(3)); user.setAge(rs.getString(4)); } }catch (Exception e){ e.printStackTrace(); }finally { try { util.closeAll(rs,pstmt,conn); } catch (SQLException throwables) { throwables.printStackTrace(); } } return user; } }

    service层UserService

    package com.zr0629.service; import com.zr0629.dao.UserDao; import com.zr0629.model.User; public class UserService { UserDao userDao = new UserDao(); public int add(User user){ //注册功能 System.out.println("service中add方法被调用"); return userDao.add(user); } public int del(User user){ //注销功能 System.out.println("service中del方法被调用"); return userDao.del(user); } public User selectByName(String name){ //登陆功能 return userDao.selectByName(name); } }

    servlet层

    该层直接与前端界面连接提供前端界面所需要的一切方法。

    AddServlet增删查数据方法类

    package com.zr0629.servlet; import com.zr0629.model.User; import com.zr0629.service.UserService; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.sql.SQLException; public class AddServlet extends HttpServlet { UserService userService = new UserService(); //实例化UserService protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //重写父类HttpServlet中的doPost System.out.println("执行了doPost"); String method = req.getParameter("method"); //获取jsp页面中的method字段的值 if(method.equals("save")){ //save只是自己定义的 如果输入save则实现功能 insert(req,resp); }else if(method.equals("delete")){ delete(req,resp); }else if(method.equals("search")){ search(req,resp); } } public void insert(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException{ //建立需要传入的变量类型的实例User User user = new User(); //从前端传入值 String name = req.getParameter("name"); String password = req.getParameter("password"); String age = req.getParameter("age"); //将值加入实例化对象中 user.setName(name); user.setPassword(password); user.setAge(age); System.out.println(user); //控制台输出看看是否达到我们的要求 后期实现功能后可删除 仅便于调试查错 //调用方法 int count = userService.add(user); if(count>0){ //如果成功插入了 1+N 行数据 resp.sendRedirect("/index.jsp"); //成功就跳转到主页 }else { resp.getWriter().write("<h2>failed</h2>"); //失败就显示failed } } public void delete(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { //建立需要传入的变量类型的实例User User user = new User(); //从前端传入值 String name = req.getParameter("name"); String password = req.getParameter("password"); String age = req.getParameter("age"); //将值加入实例化对象中 user.setName(name); user.setPassword(password); user.setAge(age); System.out.println(user); //控制台输出看看是否达到我们的要求 后期实现功能后可删除 仅便于调试查错 //调用方法 int count = userService.del(user); if(count>0){ //如果删除成功了 1+N 行数据 resp.sendRedirect("/index.jsp"); //成功就跳转到主页 }else { resp.getWriter().write("<h2>failed</h2>"); //失败就显示failed } } public void search(HttpServletRequest req,HttpServletResponse resp) throws IOException { resp.setContentType("text/html;charset=GBK"); //防止中文乱码 resp.setContentType("text/html"); String name = req.getParameter("name"); User user1=userService.selectByName(name); if(user1!=null){ resp.getWriter().write("<h1>用户名:"+user1.getName()+"</h1><h1>密码,"+user1.getPassword()+"</h1><h1>年龄:"+user1.getAge()+"</h1>"); }else { resp.getWriter().write("失败!"); } } }

    HelloServlet测试连接方法类

    该方法主要用于第一次使用Servlet,与前端产生一次简单的互动详见:【Web】Servlet简易实现登陆功能。

    package com.zr0629.servlet; import javax.servlet.*; import java.io.IOException; public class HelloSevlet implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { } @Override public ServletConfig getServletConfig() { //获得servlet配置的方法 return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { //实现功能 servletResponse.getWriter().write("hello,servlet"); } @Override public String getServletInfo() { return null; } @Override public void destroy() { //清除相关服务 } }

    LoginServlet前端登陆测试方法类

    该方法不涉及后端,仅用于简单测试登陆功能,详见:【Web】Servlet简易实现登陆功能,真正实现登陆方法可在AddServlet方法类的查询功能上实现。

    package com.zr0629.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); String password = req.getParameter("password"); if (name.equals("123") && password.equals("123")) { resp.getWriter().write("success!"); } else { resp.getWriter().write("failed!"); } } }

    效果图

    由于其他功能均在之前的Blog中演示过,所以这里仅演示查询功能。 主页地址:http://localhost:8081/ 点击查询用户数据并查询所需数据。 点击查询按钮。 可以见到数据库返回给前端界面的数据。

    本系列导航

    【Web】Servlet简易实现登陆功能【Web】Servlet有条理的实现层次分明的注册及注销
    Processed: 0.022, SQL: 9