JAVA WEB DAY 16_ 综合案例-联系人管理系统

综合案例-联系人管理系统

01-案例演示和功能说明-[★★]

查询联系人
删除联系人
添加联系人
修改联系人

02-项目环境搭建和数据准备-[★★★]

  • 使用三层架构开发实现联系人CURD

项目结构

准备数据表

create table contact( 
   id int primary key auto_increment , 
   name varchar(20) not null , 
   sex char(1) , 
   age int(3) unsigned ,   -- 无符号
   address varchar(10) ,   -- 籍贯
   qq varchar(18) , 
   email varchar(25) 
 ) ;
 
-- 插入记录
insert  into contact(name,sex,age,address,qq,email) values 
('猪八戒','男',25,'广东','834523234','zhuzhuxia@163.com'),
('貂蝉','女',18,'湖南','59869834','diaochan@qq.com'),
('孙悟空','男',28,'湖南','87967822','wukong@qq.com'),
('周瑜','男',25,'广西','2743759345','zhou@163.com');

select * from contact;

主配置文件 sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--给数据类型取别名-->
    <typeAliases>
        <!-- 包扫描给类取别名,默认别名就是类名 -->
        <package name="com.pkx.entity"/>
    </typeAliases>

    <!--配置数据库连接参数-->
    <environments default="mybatis">
        <environment id="mybatis">
            <!--事务管理器-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源-->
            <dataSource type="pooled">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///day29"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加载接口映射文件 -->
    <mappers>
        <!-- 加载指定包(包括子包下)的所有接口映射映射文件 -->
        <package name="com.pkx.dao"/>
    </mappers>
</configuration>

03-创建工具类-[★★★★★]

SqlSession工具类

  • 目标:简化SqlSession对象的创建和接口代理对象的创建
/**
 * sqlSession工具类
 */
public class SqlSessionUtils {
   

    // 1. sqlSessionFactory对象
    private static SqlSessionFactory sqlSessionFactory;

    // 2. 加载主配置文件并获得SqlSessionFactory对象
    static {
   
        try{
   
            // 2.1 获得字节输入流关联sqlMapConfig.xml文件
            InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");
            // 2.2 获得SqlSessionFactoryBuilder对象
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            // 2.3 创建sqlSessionFactory对象
            sqlSessionFactory = builder.build(in);
        } catch(Exception e){
   
            e.printStackTrace();
        }
    }

    // 3. 返回一个sqlSession对象
    public static SqlSession openSession(){
   
        return sqlSessionFactory.openSession();
    }

    // 4. 返回Dao接口代理对象
    public static <T> T getMapper(Class<T> interfaceClass){
   
        // 创建代理对象并返回
        return (T) Proxy.newProxyInstance(
                SqlSessionUtils.class.getClassLoader(),
                new Class[]{
   interfaceClass},
                new InvocationHandler() {
   
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   
                        // 1. 获得连接对象
                        SqlSession sqlSession = sqlSessionFactory.openSession();
                        // 2. 获得接口代理对象 ==》 (真实对象)
                        T dao = sqlSession.getMapper(interfaceClass);
                        // 4. 调用真实对象的方法
                        Object result = method.invoke(dao, args);
                        // 5. 关闭连接
                        sqlSession.commit();
                        sqlSession.close();
                        return result;
                    }
                });
    }
}

字符编码过滤器

  • 目标:解决全局POST参数乱码问题
/**
 * 目标:解决全局POST请求参数乱码问题
 */
@WebFilter(urlPatterns = "/*")
public class CharacterEncodingFilter 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;
        // 获取请求方式:GET或POST
        String method = request.getMethod();
        // 判断是否是POST请求
        if ("post".equalsIgnoreCase(method)){
   
            // 设置请求参数编码:utf-8
            request.setCharacterEncoding("utf-8");
        }
        // 放行请求
        filterChain.doFilter(request, servletResponse);
    }

    @Override
    public void destroy() {
   

    }
}

04-显示联系人列表-[★★★★★]

ContactDao接口代码

/**
 * 数据访问层接口

    实现功能的步骤
        1. 后端服务器
          调用顺序:表现层 -> 业务层 -> 数据访问层
          开发顺序:数据访问层 -> 业务层 -> 表现层

          问题1:要明确方法的参数个数和类型
          问题2:要明确方法的返回值类型

        2. 前台页面
          1. 发送请求获取数据(是否需要传递参数,需要传递几个)
          2. 显示后台返回的数据
 */
public interface ContactDao {
   
    /**
     * 查询所有联系人
     */
    @Select("select * from contact")
    List<Contact> findAll();
}

ContactService业务层代码

/**
 * 业务层
 */
public class ContactService {
   

    // 获得接口实现类对象
    private ContactDao contactDao = SqlSessionUtils.getMapper(ContactDao.class);
    
    /**
     * 查询所有联系人
     */
    public List<Contact> findAll(){
   
        return contactDao.findAll();
    }
}

ListContactServlet控制器代码

/**
 * 目标:接收请求查询所有联系人
 *
 * 步骤:
     1. 创建业务层对象
     2. 调用业务层方法:查询所有联系人
     3. 将联系人数据存储到请求域
     4. 转发到list.jsp页面展示数据
 */
@WebServlet(urlPatterns = "/list")
public class ListContactServlet extends HttpServlet {
   

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        // 1. 创建业务层对象
        ContactService cs = new ContactService();
        // 2. 调用业务层方法:查询所有联系人
        List<Contact> contactList = cs.findAll();
        // 3. 将联系人数据存储到请求域
        request.setAttribute("contactList", contactList);
        // 4. 转发到list.jsp页面展示数据
        request.getRequestDispatcher("list.jsp").forward(request, response);
    }
}

list.jsp页面代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>查询所有联系人</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
    <style type="text/css">
        tr,th {
    
            text-align: center;
        }
    </style>
</head>
<body>
<div class="container">
    <form action="list" method="get" class="form-inline" id="contactForm">
        <h2 class="text-center">联系人列表</h2>
        <div class="row text-right" style="margin-bottom: 10px; margin-top: 15px;">
            <div class="col-md-4 text-left">
                <a class="btn btn-primary" href="add.jsp" style="width: 120px">添加联系人</a>
            </div>
        </div>
        <div class="row">
            <div class="col-md-12">
                <table border="1" class="table table-bordered table-hover">
                    <tr class="success">
                        <th>编号</th>
                        <th>姓名</th>
                        <th>性别</th>
                        <th>年龄</th>
                        <th>籍贯</th>
                        <th>QQ</th>
                        <th>邮箱</th>
                        <th
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: surf_cli_chn_mul_day-tem-12001-201501.txt是一个文件名,这个文件可能是一个文本文件。根据文件名的后缀“txt”可以判断出这是一个文本文件。根据文件名中的其他信息,可以猜测这个文件记录了2015年1月份中国地区某个地点的多天的海浪信息和气温信息。 文件名中的“surf_cli_chn_mul_day”可能表示这是一个关于冲浪、气象和中国的多天数据文件。其中“surf”可能指的是冲浪,意味着这个文件中包含有关冲浪条件和海浪高度的数据。而“cli”可能表示气候或气象,意味着这个文件中可能还包含了一些与气温或其他气象要素相关的数据。最后,“chn_mul_day”可能表示这是中国地区多天的数据,指的是这个文件中包含了多天的数据,可能是按日期顺序排列。 根据文件名中的“tem-12001-201501”部分,可以猜测这个文件可能是关于2015年1月份某个地点的气温数据。其中“tem”可能表示气温,而“12001”可能是指某个具体地点的编号或代号。而“201501”则代表了这个文件中记录的是2015年1月份的数据。 总结而言,surf_cli_chn_mul_day-tem-12001-201501.txt这个文件名暗示了这是一个包含了中国某地2015年1月份多天的冲浪和气温数据的文本文件。 ### 回答2: surf_cli_chn_mul_day-tem-12001-201501.txt是一个文件名,它可能表示一个气象数据文件。根据文件名的命名规则,该文件可能包含2015年1月份中国某个城市或地区的多日气温数据。 在该文件中,"surf_cli_chn_mul_day"可能代表"surface climate China multiple day"(中国地面气候多日)的缩写,意味着这是一个包含中国地面气候数据的文件。"tem"可能代表"temperature"(温度),表示该文件中包含的是温度数据。"12001"可能是文件的编号,用于标识该文件属于某个特定的数据集或项目。"201501"代表文件所涵盖的日期范围,可能是2015年1月。 由于题目只提供了文件名,并未提供具体的内容或其他背景信息,因此对于该文件的具体内容和用途,我无法做更详细的解读。要了解更多关于该文件的信息,需要查阅实际的文件内容或者咨询相关的数据提供机构或个人。 ### 回答3: surf_cli_chn_mul_day-tem-12001-201501.txt 是一个文件名,文件中可能包含有关2015年1月份中国多地的冷暖气温数据。 根据文件名可以分析出以下信息: 首先,文件是以“surf_cli_chn_mul_day-tem-12001-”开头的,这可能表示了该文件是多个城市的气温数据。 然后,文件名中的“201501”表示了该文件记录的是2015年1月份的数据。 如果我们打开这个文件,可能会看到以下内容: 该文件可能包含有关中国多个城市在2015年1月份每天的气温数据。这些数据可能以一定的格式来展示,可能按照城市和日期进行分组,并且可能有时间间隔。 该文件可能是一个纯文本文件,我们可以使用文本编辑器来打开它,并查看其中的内容。在文件中,每个城市的气温数据可能以一定的形式被记录,常见的格式可能是每行记录一个数据点,包括城市、日期和相应的气温值。 通过分析该文件,我们可以获得2015年1月份中国多地的气温趋势,可以观察各个城市在这个月份内的气温变化情况,从而对该时期的气候有更多的了解。这些数据对于气象研究、城市规划以及农业生产等领域可能具有重要的参考价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值