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部分代码

 

posted on   白嫖老郭  阅读(377)  评论(0编辑  收藏  举报

编辑推荐:
· 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代理技术深度解析与实战指南

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示