黑马程序员技术交流社区

标题: 【石家庄校区】WEB阶段19-22天学习笔记 [打印本页]

作者: 李时珍的皮~    时间: 2018-5-27 16:21
标题: 【石家庄校区】WEB阶段19-22天学习笔记
本帖最后由 小石姐姐 于 2018-5-30 15:08 编辑

第19天 MVC和事物
JSP的模式:
* JSP的设计模式:
    * JSP的模式一:JSP + JavaBean设计模式:
    * JSP的模式二:JSP + Servlet + JavaBean设计模式:MVC设计模式.
        * M:Model
        * V:View
        * C:Controller
    * MVC和EE开发三层结构的关系:
    * 反射:(*****)
        * 获得类的字节码对象:Class对象.三种获得的方式.
            * 类名.class;
            * 类的实例.getClass();
            * Class.forName();
        * 获得构造器:Constructor
        * 获得属性:Field
        * 获得方法:Method
JDBC的事务管理:
    * 事务的概念:指的是逻辑上的一组操作,要么一起成功,要么一起失败.
    * 事务的特性:
        * 原子性:事务的不可分割
        * 一致性:事务执行的前后,数据完整性保持一致.
        * 隔离性:一个事务的执行不应该受到另一个事务的干扰
        * 持久性:事务一旦结束,将会永久修改到数据库.
    * 如果不考虑隔离性:
        * 脏读                :一个事务读到另一个未提交的数据.
        * 不可重复读        :一个事务读到另一个事务已经提交的update的数据,导致多次的查询结果不一致.
        * 虚读                :一个事务读到另一个事务已经提交的insert的数据,导致多次的查询结果不一致.
    * 解决读问题:
        * 未提交读:以上情况都能发生.
        * 已提交读:解决脏读,但是不可重复读和虚读有可能发生
        * 重复读:解决脏读和不可重复读,但是虚读有可能发生.
        * 串行化:可以解决以上的所有情况.
    * JDBC进行事务的管理:
        * Connection:
            * setAutoCommit(boolean flag);
            * commit();
            * rollback();
    * DBUtils进行的事务的管理:
第20天 商品增删改查&分页
1.商品的查询的功能:
在首页上点击【查询所有商品】链接:
提交到Servlet中:
    * 调用业务层-->调用DAO:
    * 将商品列表保存到request域中:
    * 转发到商品列表页面:
在商品列表的页面中显示商品:
2.商品的添加的功能:
在首页点击【添加】链接:跳转到添加页面.
在添加页面中输入信息:点击【提交】提交到Servlet
在Servlet中:
    * 接收数据:
    * 封装数据:
    * 调用业务层:
    * 页面跳转




* 重复提交的问题:
    * 添加完商品之后,转发到一个页面,刷新该页面.
    * 网速很慢,点击提交的按钮,其实已经在提交了但是网速慢,不停的点击提交.
* 解决重复提交的根本解决办法:令牌机制(一次性).
    * 生成随机的令牌保存在session中.
    * 在表单的提交的时候,将随机的令牌放入到表单的隐藏字段中.
    * 在Servlet中获得session中和表单中的令牌是否一致.
    * 如果一致执行插入操作,不一致跳转到其他页面.将令牌销毁.
* 代码实现:
                        // 判断是否是重复提交:
                        String token1 = (String)request.getSession().getAttribute("token");
                        String token2 = request.getParameter("token");
                        // 清空session中的令牌:
                        request.getSession().removeAttribute("token");
                        if(!token2.equals(token1)){
                                request.setAttribute("msg", "亲!您已经提交过!请不要重复提交了!");
                                request.getRequestDispatcher("/jsp/msg.jsp").forward(request, response);
                                return;
                        }
3.商品的信息的修改:
在列表页面上点击【修改】链接:
提交到Servlet:根据id查询该商品.将商品的信息显示到修改页面:
在修改的页面上修改数据,点击【提交】按钮:
提交到Servlet:完成商品信息的修改:
4.商品的信息的删除:
在列表页面上点击【删除】链接:
提交到Servlet:
调用业务层完成删除的操作:


***** 扩展删除多条记录:


5.商品分页显示:
分页条: 【首页】【上一页】[1][2][3][4]【下一页】【尾页】


分页功能的实现:
* 物理分页:一次只查10条记录,点击下一页,再去查询后10条.使用SQL语句进行控制的分页.
    * 缺点:经常需要和数据库交互.
    * 优点:数据量特别大,不会导致内存的溢出.
* 逻辑分页:一次性将所有数据全都查询出来,根据需要进行截取.List集合进行控制. subList();
    * 缺点:数据量如果特别大,容易导致内存溢出.
    * 优点:与数据库交互次数少.


* 不同的数据库对分页的语句也是不一样的:
    * MYSQL进行分页: 使用limit关键字.
        * select * from xxx where .. Group by ... Having ... Order by ... limit a,b; -- a:从哪开始  b:查询的记录数.
        * 根据页数计算 limit后面的两个参数:
            * currPage                        begin             pageSize
                  1                    0                    10
                  2                    10                   10
                  3                    20                   10
           * begin = (currPage - 1) * pageSize;
    * 参数的传递:
         * 前台--->后台:currPage
         * 后台--->前台:currPage,totalPage(总页数),totalCount(总记录数),pageSize,List集合.
    * 使用JavaBean封装参数:
         * 后台--->前台:传递一个JavaBean就可以.
    * Oracle进行分页: 使用SQL语句嵌套.
    * SQL Server数据库进行分页: 使用 top 关键字.


* 在首页上添加一个分页查询的链接:




第21天 jQuery&Ajax
$.get(
    "url",
    {
        "":"",
        "":""
    },
    function(data){ //data:服务器对当前这次请求的响应
        
    },
    "响应的类型"
);
$.post(
    "url",
    {
        "":"",
        "":""
    },
    function(data){ //data:服务器对当前这次请求的响应
        
    },
    "响应的类型"
);


$.ajax({
    url:"",
    type:"请求方式",
    data:{
        "":"",
        "":""
    },
    success:function(data){ //成功后执行
        
    },
    error:function(){ //出错之后执行
        
    },
    beforeSend:function(){ //发送之前执行
        
    },
    complete:function(){ //不管成功还是失败都执行
        
    }
});


第22天 jQuery和listener
1.什么是监听器:
* 监听器:就是一个Java类,用来监听其他的Java的状态的变化.
2.监听器的用途:
* 用来监听其他的对象的变化的.
* 主要应用在图形化界面中比较多:
    * GUI,Android.
3.监听器的术语:
* 事件源:指的是被监听的对象.(汽车)
* 监听器:值的是监听的对象.(报警器)
* 事件源与监听器的绑定:就是在汽车上安装报警器.
* 事件:指的是事件源的改变.(踹汽车一脚)---主要的功能获得事件源对象.
4.WEB中的监听器:
WEB中的Listener和Filter是属于Servlet规范中的高级的技术.
WEB中的监听器共有三类八种(监听三个域对象)
* 事件源:Servlet中的三个域对象.ServletContext,HttpSession,ServletRequest.
* 监听器:自定义类实现8个接口.
* 事件源和监听器的绑定:配置.
5.WEB中的监听器的分类:
三类八种:
* 一类:监听三个域对象的创建和销毁的监听器:
    * ServletContextListener
    * HttpSessionListener
    * ServletRequestListener
* 二类:监听三个域对象的属性变更的监听器(属性添加,移除,替换):
    * ServletContextAttributeListener
    * HttpSessionAttributeListener
    * ServletRequestAttributeListener
* 三类:监听HttpSession中的JavaBean的状态改变(绑定,解除绑定,钝化,活化)
    * HttpSessionBindingListener
    * HttpSessionActivationListener
6.ServletContextListener:监听ServletContext对象的创建和销毁
【ServletContext对象的创建和销毁】:
* 创建:服务器启动的时候,服务器为每个WEB应用创建一个属于该web项目的对象ServletContext.
* 销毁:服务器关闭或者项目从服务器中移除的时候.


【应用代码】
public class MyServletContextListener implements ServletContextListener{


        @Override
        public void contextInitialized(ServletContextEvent sce) {
                System.out.println("ServletContext对象被创建了...");
        }


        @Override
        public void contextDestroyed(ServletContextEvent sce) {
                System.out.println("ServletContext对象被销毁了...");
        }


}
配置:
  <!-- 配置监听器 -->
  <listener>
          <listener-class>com.itheima.weblistener.MyServletContextListener</listener-class>
  </listener>


【企业中的应用:】
* 1.加载框架的配置文件                :Spring框架 ContextLoaderListener
* 2.定时任务调度:
    * Timer,TimerTask











欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2