使用IDEA练习一个最基础的java web项目(适合新手)

您所在的位置:网站首页 web例题 使用IDEA练习一个最基础的java web项目(适合新手)

使用IDEA练习一个最基础的java web项目(适合新手)

2023-08-11 05:52| 来源: 网络整理| 查看: 265

使用Servlet、JDBC、Maven和IDEA完成最基础的增删改查,整体逻辑浅显易懂,希望能帮助到各位更好的学习web基础,如果有问题欢迎留言,

完整代码免费下载地址:https://wwa.lanzous.com/ih0tRhfneba

目录 主要功能整体架构1.新建mysql表2.IDEA新建maven项目3.整理pom.xml文件4.过滤器5.实体类User6.数据库工具类DBCoon7.UserDao接口和实现类8.servlet登录LoginServlet注册RegisterServlet查询所有SearchAllServlet删除DeleteServlet更新UpdateServlet 9.在web.xml里注册servlet10.jsp页面登录login.jsp注册register.jsp操作成功success.jsp操作失败error.jsp显示所有用户信息showAll.jsp 可能会遇到的一些坑进阶搜索功能的实现分页功能的实现搜索加分页功能验证码的实现文件上传功能购物车功能 总结

主要功能

1.用户注册 2.用户登录 3.用户列表展示 4.用户信息修改 5.用户信息删除

整体架构

在这里插入图片描述

1.新建mysql表 CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL, `pwd` varchar(255) NOT NULL, `sex` varchar(255) NOT NULL, `home` varchar(255) NOT NULL, `info` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; /*添加两个值用于测试*/ INSERT INTO `user` VALUES ('1', '123', '123', '男', '北京', '123'); INSERT INTO `user` VALUES ('2', '123123', '123123', '男', '北京', '123123'); 2.IDEA新建maven项目

在这里插入图片描述 这里选择设置好的maven环境在这里插入图片描述 在src下建立项目包结构 在这里插入图片描述

3.整理pom.xml文件

注意: 1.删除没用的内容 2.导入需要使用的依赖

4.0.0 org.example csdn3 1.0-SNAPSHOT war mysql mysql-connector-java 8.0.20 javax.servlet javax.servlet-api 4.0.0 javax.servlet.jsp javax.servlet.jsp-api 2.3.3 javax.servlet.jsp.jstl jstl-api 1.2 taglibs standard 1.1.2 org.projectlombok lombok 1.18.12 junit junit 4.11 org.apache.maven.plugins maven-clean-plugin 3.0.0 4.过滤器

作用:过滤所有页面解决乱码问题 注意:在web.xml里注册

package com.filter; import javax.servlet.*; import java.io.IOException; public class EncodingFilter implements Filter { public EncodingFilter() { System.out.println("执行过滤器"); } public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=UTF-8"); filterChain.doFilter(request, response); } public void destroy() { } } 5.实体类User

作用:映射数据库创建的user表 注意:这里我使用到了lombok包,需要先下载lombok插件再在pom.xml里导入lombok依赖,在方法上加上**@Data**就会生成这个类所有属性的setter和getter方法,在左侧Structure里可以看到生成的方法,也可以手动生成setter和getter方法,二者没区别在这里插入图片描述

package com.entiy; import lombok.Data; @Data public class User { private int id; private String name; private String pwd; private String sex; private String home; private String info; } 6.数据库工具类DBCoon

作用:用于连接数据库,执行SQL语句和返回执行结果 注:我使用了PreparedStatement 预编译SQL方法通过遍历Object数组的方式传递SQL参数,原作者使用的是字符串拼接的方式,比较复杂且易错

package com.util; import java.sql.*; /*数据库工具类: * 1.连接数据库 * 2.增删改查 * 3.执行SQL语句并返回执行结果 * 4.关流 * */ public class DBCoon { //serverTimezone=UTC设置连接时区,不设置可能会报时区错误 static String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8"; static String username = "root"; //密码换成自己的 static String password = "root"; static Connection conn = null; static ResultSet rs = null; static PreparedStatement ps = null; /*连接数据库*/ public static void init() { try { /*1.加载驱动获得驱动管理器*/ Class.forName("com.mysql.cj.jdbc.Driver"); /*2.连接数据库*/ conn = DriverManager.getConnection(url, username, password); System.out.println("数据库连接成功"); } catch (Exception e) { e.printStackTrace(); System.out.println("数据库连接失败"); } } /*查询数据(传递参数)*/ public static ResultSet searchSql(String sql,Object[] args){ try { ps = conn.prepareStatement(sql); for (int j = 0; j e.printStackTrace(); System.out.println("数据查询失败"); } return rs; } /*增删改查数据(传递参数)*/ public static int addUpdDel(String sql,Object[] args){ int i = 0; try{ ps = conn.prepareStatement(sql); for (int j = 0; j e.printStackTrace(); System.out.println("增删改失败"); } return i; } /*不传递参数查询所有用户信息*/ public static ResultSet getUsers(String sql){ try { ps = conn.prepareStatement(sql); rs = ps.executeQuery(); System.out.println("数据查询成功"); } catch (SQLException e) { e.printStackTrace(); System.out.println("数据查询失败"); } return rs; } /*关流*/ public static void close() { try { if (rs != null){ rs.close(); } if (ps != null) { ps.close(); } if (conn != null){ conn.close(); } }catch (SQLException e) { System.out.println("数据流关闭异常"); } } 7.UserDao接口和实现类

注意:接口是为了使代码更简洁规范,注意每个方法传递的参数意义

package com.dao; import com.entiy.User; import java.util.List; public interface UserDao { /*获取前台的账号密码判断能否登录成功*/ public boolean login(String name, String pwd); /*获取前台的注册信息,封装成user对象*/ public boolean register(User user); /*返回所有的用户信息*/ public List searchAll(); /*根据获取到的内容更新用户信息*/ public boolean update(int id,String name, String pwd,String sex, String home,String info) ;//更新用户信息 /*获取前台传递的id删除用户*/ public boolean delete(int id); } package com.dao; import com.entiy.User; import com.util.DBCoon; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; public class UserDaoImpl implements UserDao { /*创建一个返回值标志*/ static boolean flag = false; /*提高sql作用域,每个方法里都要编写sql语句*/ static String sql = null; public boolean login(String name, String pwd) { try { DBCoon.init(); sql = "select * from user where name= ? and pwd = ?"; /*使用预编译SQL传递参数*/ Object[] args = {name,pwd}; ResultSet rs = DBCoon.searchSql(sql, args); /*遍历数据库里的账号密码与从jsp传来的账号密码作对比*/ while (rs.next()) { if (rs.getString("name").equals(name)&&rs.getString("pwd").equals(pwd)){ flag = true; System.out.println("登录成功"); } } }catch (Exception e) { System.out.println("登录失败"); e.printStackTrace(); } finally { DBCoon.close(); } return flag; } public boolean register(User user) { try { DBCoon.init(); sql="insert into user(name,pwd,sex,home,info)"+"values(?,?,?,?,?)"; Object[] args = {user.getName(),user.getPwd(),user.getSex(),user.getHome(),user.getInfo()}; int i = DBCoon.addUpdDel(sql,args); if (i>0){ flag = true; System.out.println("注册成功"); } }catch (Exception e) { e.printStackTrace(); System.out.println("注册失败"); }finally { DBCoon.close(); } return flag; } public List searchAll() { List list = new ArrayList(); try { DBCoon.init(); sql = "select * from user"; ResultSet rs = DBCoon.getUsers(sql); System.out.println("获取所有用户信息成功"); while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setPwd(rs.getString("pwd")); user.setSex(rs.getString("sex")); user.setHome(rs.getString("home")); user.setInfo(rs.getString("info")); list.add(user); } }catch (Exception e){ System.out.println("获取所有用户信息失败"); e.printStackTrace(); }finally{ DBCoon.close(); } return list; } public boolean update(int id, String name, String pwd, String sex, String home, String info) { try { DBCoon.init(); sql = "update user set name=?,pwd=?,sex=?,home=?,info=? where id=?"; Object[] args={name,pwd,sex,home,info,id}; int i = DBCoon.addUpdDel(sql,args); if (i>0){ flag=true; System.out.println("数据更新成功"); } }catch (Exception e) { System.out.println("数据更新失败"); e.printStackTrace(); }finally { DBCoon.close(); } return flag; } public boolean delete(int id) { try { DBCoon.init(); sql = "delete from user where id = ?"; Object[] args = {id}; int i = DBCoon.addUpdDel(sql,args); if (i>0){ flag=true; System.out.println("删除成功"); } }catch (Exception e) { System.out.println("删除失败"); e.printStackTrace(); }finally { DBCoon.close(); } return flag; } } 8.servlet

注意: 1.这里用到了请求转发和重定向,二者的不同可以看下这篇文章,详细介绍了什么时候用转发和重定向https://blog.csdn.net/weixin_40001125/article/details/88663468 2.req.getParameter获取前台输入框的值即input框里的name属性的值 3.req.setAttribute向request域中添加名为msg值为object对象类型的信息,前台可以通过el表达式${msg}获取对象的值

登录LoginServlet package com.servlet; import com.dao.UserDao; import com.dao.UserDaoImpl; 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 { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /*req.getParameter获取前台输入框的值即input框里的name属性的值*/ String name = req.getParameter("name"); String pwd = req.getParameter("pwd"); UserDao ud = new UserDaoImpl(); if(ud.login(name,pwd)){ /*如果要获取request存放的参数则使用请求转发,路径加不加/都行 */ System.out.println("用户"+name+"登录成功"); /*req.setAttribute向request域中添加名为msg对象object为string类型的信息*/ req.setAttribute("msg","用户"+name+"登录成功"); req.getRequestDispatcher("success.jsp").forward(req, resp); }else { /*如果不获取参数则使用重定向到错误页面*/ resp.sendRedirect("error.jsp"); } } } 注册RegisterServlet package com.servlet; import com.dao.UserDao; import com.dao.UserDaoImpl; import com.entiy.User; 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 RegisterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); String pwd = req.getParameter("pwd"); String sex = req.getParameter("sex"); String home = req.getParameter("home"); String info = req.getParameter("info"); //实例化一个对象,组装属性 User user = new User(); user.setName(name); user.setPwd(pwd); user.setSex(sex); user.setHome(home); user.setInfo(info); UserDao ud = new UserDaoImpl(); if (ud.register(user)){ System.out.println("用户"+name+"注册成功"); req.setAttribute("msg","用户"+name+"注册成功"); req.getRequestDispatcher("success.jsp").forward(req, resp); }else { resp.sendRedirect("error.jsp"); } } } 查询所有SearchAllServlet package com.servlet; import com.dao.UserDao; import com.dao.UserDaoImpl; import com.entiy.User; 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.util.List; public class SearchAllServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { UserDao ud = new UserDaoImpl(); List users = ud.searchAll(); req.setAttribute("users",users); System.out.println("查询全部用户成功"); req.getRequestDispatcher("/showAll.jsp").forward(req, resp); } } 删除DeleteServlet package com.servlet; import com.dao.UserDao; import com.dao.UserDaoImpl; 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 DeleteServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String id = req.getParameter("id"); System.out.println("删除的用户id为:"+id); /*获取到的id是一个引用数据类型即对象,需要变成基本数据类型作为参数传输*/ int userId = Integer.parseInt(id); /*调用dao层,返回值是一个整形数字*/ UserDao ud = new UserDaoImpl(); /*delete方法的参数为int id,所以必须把从jsp页面获取到的id转换成基本数据类型*/ if(ud.delete(userId)){ /*站内转发:请求转发到searchAll的servlet*/ req.getRequestDispatcher("searchAll").forward(req, resp); }else{ /*站外转发:重定向到首页*/ resp.sendRedirect("error.jsp"); } } } 更新UpdateServlet package com.servlet; import com.dao.UserDao; import com.dao.UserDaoImpl; 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 UpdateServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String id = req.getParameter("id"); int userId = Integer.parseInt(id); String name = req.getParameter("name"); String pwd = req.getParameter("pwd"); String sex = req.getParameter("sex"); String home = req.getParameter("home"); String info = req.getParameter("info"); UserDao ud = new UserDaoImpl(); if(ud.update(userId, name, pwd, sex, home, info)){ req.getRequestDispatcher("searchAll").forward(req, resp); }else{ resp.sendRedirect("error.jsp"); } } } 9.在web.xml里注册servlet

注意:设置好的名字,这是访问servlet的入口,建议复制

EncodingFilter com.filter.EncodingFilter EncodingFilter /* login com.servlet.LoginServlet login /login searchAll com.servlet.SearchAllServlet searchAll /searchAll delete com.servlet.DeleteServlet delete /delete update com.servlet.UpdateServlet update /update register com.servlet.RegisterServlet register /register login.jsp 10.jsp页面 登录login.jsp 登录 账号: 密码: 新用户注册 注册register.jsp 注册 输入用户名: 输入密码: 选择性别:男 女 选择家乡: 上海 北京 纽约 填写个人信息: 操作成功success.jsp

注意: 1.el表达式取值 2.href访问servlet

成功 ${msg} 查看所有用户 操作失败error.jsp 错误 操作错误 显示所有用户信息showAll.jsp

注意: 1.jstl表达式需要导入核心配置文件core 2.${users}获取名为users的对象 3.使用c标签的foreach遍历对象users,遍历后的别名为U 4.通过a标签href属性访问servlet并使用?id传递参数

所有用户信息 ID 姓名 性别 密码 家乡 备注 操作 删除 可能会遇到的一些坑 数据库连接失败:检查数据库url,账号,密码是否正确 /*test为表名,?后面是参数,serverTimezone设置时区为东八区*/ static String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8"; static String username = "root"; static String password = "root";` 获取不到req域里的参数:检查req.setAttribute List users = ud.searchAll(); req.setAttribute("users",users); 进阶

如果已经深刻理解了基础的MVC模式编写,可以尝试下其他功能

搜索功能的实现 分页功能的实现 搜索加分页功能 验证码的实现 文件上传功能 购物车功能 总结

这是javaweb最基础的操作,整个项目使用了MVC三层架构模式,controller即servlet直接调用了model层的dao方法,因为只有一个表,不需要多表查询,所以没有用到service层。项目整体的逻辑还是非常清晰的,如果大家有遇到不懂的建议先百度解决,有些坑迟早都是要踩的。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3