javaweb综合项目:CRUD
数据库:表
jar包:
前端的样式,基于bootstrap:
资源文件:数据库配置文件druid.properties
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/study?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8 username=root password=root initialSize=5 maxActive=10 maxWait=3000 #<!--removeAbandoned: 是否自动回收超时连接--> removeAbandoned=true #<!--removeAbandonedTimeout: 超时时间(以秒数为单位)--> removeAbandonedTimeout=180
MVC,功能分离,包的三层架构的设计:
dao层设计:
package com.gton.curd.dao; import com.gton.curd.entity.User; import com.gton.curd.utils.JDBCUtils; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import java.util.List; /** * @program: javaweb-demo * @description: * @author: GuoTong * @create: 2020-09-16 17:05 **/ public class UserDao { private JdbcTemplate jdbcTemplate =new JdbcTemplate(JDBCUtils.getDataSource()); public List<User> findAll(){ List<User> users = jdbcTemplate.query("select * from user", new BeanPropertyRowMapper<>(User.class)); return users; } //添加 public void addUser(User user){ int update = jdbcTemplate.update("insert into user values (null,?,?,?,?,?,?)", user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail()); if (update>0){ System.out.println("添加成功"); }else{ System.out.println("添加失败"); } } public User findById(int id) { List<User> query = jdbcTemplate.query("select * from user where id = ?", new Object[]{id},new BeanPropertyRowMapper<>(User.class)); if (query.size()>0) { return query.get(0); }else { return null; } } //更新 public void saveUpdate(User user){ int update = jdbcTemplate.update("update user set name=?,gender=?,age=?,address=?,qq=?,email=? where id =?", user.getName(), user.getGender(), user.getAge(), user.getAddress(), user.getQq(), user.getEmail(), user.getId()); if (update>0){ System.out.println("更新成功"); }else{ System.out.println("更新失败"); } } //删除 public void deleteById(int id){ int update = jdbcTemplate.update("delete from user where id= ?", id); if (update>0){ System.out.println("删除成功"); }else{ System.out.println("删除失败"); } } //根据id模糊匹配 public List<User> serchName(String name) { List<User> query = jdbcTemplate.query("select * from user where name like ?", new Object[]{"%"+name+"%"},new BeanPropertyRowMapper<>(User.class)); if (query.size()>0) { return query; }else { return null; } } public User findByUserNameAndPwd(String name, String email) { List<User> query = jdbcTemplate.query("select * from user where name =? and email = ?", new Object[]{name, email}, new BeanPropertyRowMapper<User>(User.class)); if (query.size()>0){ return query.get(0); } else { return null; } } }
实体类设计:
package com.gton.curd.entity; /** * @program: javaweb-demo * @description: * @author: GuoTong * @create: 2020-09-16 17:03 **/ public class User { private Integer id; private String name; private String gender; private Integer age; private String address; private String qq; private String email; public User() { } public User(Integer id, String name, String gender, Integer age, String address, String qq, String email) { this.id = id; this.name = name; this.gender = gender; this.age = age; this.address = address; this.qq = qq; this.email = email; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", gender='" + gender + '\'' + ", age=" + age + ", address='" + address + '\'' + ", qq='" + qq + '\'' + ", email='" + email + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getQq() { return qq; } public void setQq(String qq) { this.qq = qq; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
登录与静态资源的允许:需要先登录才能访问。。静态资源不拦截
package com.gton.curd.fileter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; /** * @program: javaweb-demo * @description: 登录拦截器 * @author: GuoTong * @create: 2020-09-17 16:15 **/ @WebFilter(urlPatterns = {"/*"}) public class LoginFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //不拦截 String uri = request.getRequestURI(); if (uri.contains("myLogin")||uri.contains("login") || uri.contains("css") || uri.contains("fonts") || uri.contains("js")) { filterChain.doFilter(request, response);//放行资源 return; } //拦截后 HttpSession session = request.getSession(); if (session.getAttribute("UserName")!=null){ //已经登录 filterChain.doFilter(request, response);//放行资源 }else{ response.sendRedirect(request.getContextPath()+"/login.jsp"); } } @Override public void destroy() { } }
编码设计filter,设置统一utf8编码:
package com.gton.curd.fileter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map; /** * @program: javaweb-demo * @description:过滤器 * @author: GuoTong * @create: 2020-09-17 14:07 **/ //所有的字符编码都需要统一,所以这里用全部 @WebFilter(value = "/*",initParams = { @WebInitParam(name="code",value = "UTF-8") }) public class TestFilter implements Filter { /* * 拦截路径 1. 精确拦截`/user-servlet` 2. 通配符`/*`表示拦截所有资源`/user/*`拦截`/user`这个路径下的所有资源 3. 通配符`*.jsp`表示拦截所有以`.jsp`结尾的资源*/ private String code; //保存字符编码的类型 @Override public void init(FilterConfig filterConfig) throws ServletException { //读取web.xml||注解 中Filter配置的初始化參数 code = filterConfig.getInitParameter("code"); } /*实现过滤的方法: *servletRequest:请求 * servletResponse:响应 * filterChain: 根据条件放行*/ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 处理请求乱码 HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletRequest myRequest = new MyRequest(httpServletRequest); // 处理响应乱码 response.setContentType("text/html;charset=utf-8"); chain.doFilter(myRequest, response); } @Override public void destroy() { } } // 自定义request对象 class MyRequest extends HttpServletRequestWrapper { private HttpServletRequest request; private boolean hasEncode; public MyRequest(HttpServletRequest request) { super(request);// super必须写 this.request = request; } // 对需要增强方法 进行覆盖 @Override public Map getParameterMap() { // 先获得请求方式 String method = request.getMethod(); if (method.equalsIgnoreCase("post")) { // post请求 try { // 处理post乱码 request.setCharacterEncoding("utf-8"); return request.getParameterMap(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } else if (method.equalsIgnoreCase("get")) { // get请求 Map<String, String[]> parameterMap = request.getParameterMap(); if (!hasEncode) { // 确保get手动编码逻辑只运行一次 for (String parameterName : parameterMap.keySet()) { String[] values = parameterMap.get(parameterName); if (values != null) { for (int i = 0; i < values.length; i++) { try { // 处理get乱码 values[i] = new String(values[i] .getBytes("ISO-8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } } hasEncode = true; } return parameterMap; } return super.getParameterMap(); } @Override public String getParameter(String name) { Map<String, String[]> parameterMap = getParameterMap(); String[] values = parameterMap.get(name); if (values == null) { return null; } return values[0]; // 取回参数的第一个值 } @Override public String[] getParameterValues(String name) { Map<String, String[]> parameterMap = getParameterMap(); String[] values = parameterMap.get(name); return values; } }
监听器,关闭druid池。。。
package com.gton.curd.listnener; import com.alibaba.druid.pool.DruidDataSource; import com.gton.curd.utils.DruidUtils; import com.mysql.jdbc.AbandonedConnectionCleanupThread; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Enumeration; /** * @program: javaweb-demo * @description: * @author: GuoTong * @create: 2020-09-17 16:57 **/ @WebListener() public class TestListener implements ServletContextListener { /** * 创建后的回调函数:contextInitialized * @param sce */ @Override public void contextInitialized(ServletContextEvent sce) { //回调函数的参数是事件对象,通过该对象可以获取到被监听的对象。。 //获取当前监听的对象: sce.getXXXX() System.out.println("Servlet 容器已经初始化完毕"); } /** * servlet容器销毁过后的回调函数:contextDestroyed * @param sce */ @Override public void contextDestroyed(ServletContextEvent sce) { System.out.println("容器已经销毁。。。"); DruidDataSource druidDataSource= (DruidDataSource) DruidUtils.getDataSource(); druidDataSource.close(); System.out.println("关闭连接池"); try { Enumeration<Driver> drivers = DriverManager.getDrivers(); while(drivers.hasMoreElements()){ DriverManager.deregisterDriver(drivers.nextElement()); System.out.println("解除注册"); } } catch (SQLException e) { e.printStackTrace(); } try { AbandonedConnectionCleanupThread.shutdown(); System.out.println("关闭 Abandoned 线程"); } catch (Exception e) { System.out.println("ContextFinalizer:SEVERE problem cleaning up: " + e.getMessage()); e.printStackTrace(); } } /* * 1.监听事件 * 2.选择实现接口 * 3.实现接口度方法 * */ }
然后业务层,由于业务比较简单,所以,,直接调dao。。
package com.gton.curd.service; import com.gton.curd.dao.UserDao; import com.gton.curd.entity.User; import java.util.List; /** * @program: javaweb-demo * @description: * @author: GuoTong * @create: 2020-09-16 17:07 **/ public class UserService { private UserDao dao = new UserDao(); public List<User> findAll(){ List<User> all = dao.findAll(); return all; } //添加 public void addUser(User user){ dao.addUser(user); } public User findById(int id) { return dao.findById(id); } public void deleteById(int id) { dao.deleteById(id); } public List<User> serch(String name) { return dao.serchName(name); } public void saveUpdate(User user) { dao.saveUpdate(user); } public User loginUser(User loginUser) { User findByUser = dao.findByUserNameAndPwd(loginUser.getName(),loginUser.getEmail()); return findByUser; } }
Junit单元测试Dao&&Service
package com.gton.curd.test; import com.gton.curd.entity.User; import com.gton.curd.service.UserService; import org.junit.Before; import org.junit.Test; import java.util.List; /** * @program: javaweb-demo * @description: * @author: GuoTong * @create: 2020-09-16 17:08 **/ public class UserTest { private UserService userService ; @Before public void beforEncoding(){ userService = new UserService(); } @Test public void findAll(){ List<User> all = userService.findAll(); all.forEach(System.out::println); } }
JdbcTemple工具类:
package com.gton.curd.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import javax.xml.crypto.Data; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; /** * JDBC工具类 使用Durid连接池 */ public class JDBCUtils { private static DataSource ds ; static { try { //1.加载配置文件 Properties pro = new Properties(); //使用ClassLoader加载配置文件,获取字节输入流 InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); //2.初始化连接池对象 ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接池对象 */ public static DataSource getDataSource(){ return ds; } /** * 获取连接Connection对象 */ public static Connection getConnection() throws SQLException { return ds.getConnection();
} }
servlet层:
JSP展示页面:
。。下一节展示servlet与jsp部分代码
作者:隔壁老郭
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
Java入门到入坟
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南