MVC学习

MVC笔记

MVC01_Eclipse、Servlet回顾、整合MyBatis

一、Servlet回顾

MVC: 面向对象的思想 MVC是一种项目分层思想 M:Model 模型---数据模型、业务模型 V:View 视图---HTML、JSP、CSS、JS C:Control 控制---控制页面的跳转 想要落地,就是要上述思想去实现: 1、自己手写MVC框架 2、使用第三方MVC框架

软件开发层面的三层架构是思想: Model:Pojo(实体类) 视图层:前台(用户层面)---》MVC方式来实现 JSP实现 View(不分层)---Servlet Control 业务层:处理业务逻辑---处理登录、注册、订单、发货。。。业务 Dao层:访问数据库

Servlet组件:web组件 Servlet:先出来,就是JAVA代码嵌套HTML标签 .java--->.class--->执行 JSP:相当于HTML嵌套JAVA代码 .jsp--->.java--->.class--->执行 JSP就是一个特殊的Servlet。 Web容器:可以满足web中的13个标准 Tomcat,能执行web应用。servlet、jsp标准jboss ​ ... servlet容器:只能满足servlet标准 ​

目录

MVC笔记

MVC01_Eclipse、Servlet回顾、整合MyBatis

MVC04_监听器


1、Servlet的生命周期

xxx的生命周期:从出生到死亡这个过程。 出生:构造方法,被容器调用。 初始化:init()方法 工作:service()方法--->doGet/doPost... 销毁:destory()方法

2、JSP的九大[内置]对象

out:输出对象 request:请求对象 response:响应对象 session:会话对象 application:全局对象 page:页面对象 pageContext:上下文对象 config:配置对象 exception:异常对象

3、四大作用域

page:页面域,当前页面有效 request:请求域,一次请求有效,一次请求到一次响应 session:会话域,一次会话有效,从会话的开启到销毁 application:全局域,整个应用有效,从服务器的开启到关闭 setAttribute(name,value) getAttribute(name)

4、使用Eclipse创建web项目。

6、整合MyBatis。

1)创建web项目。 2)建库建表。 3)拷贝jar包和配置文件 4)按三层架构的思想建包 com.turing.entity com.turing.mapper/dao com.turing.service com.turing.servlet/web/control com.turing.utils 5)写实体类、dao层接口、dao层实现类(可以使用逆向工程自动生成) 单独写一个生成器 6)写业务层接口 写实现类 7)写视图层(MVC) Servlet(控制器) C JSP(视图) V

二、Eclipse创建web项目

视频

三、Eclipse配置Tomcat视频

视频

四、版本对应图

五、Eclipse配置JSP模板

1、设置JSP编码 打开window-Preferences-web-JSP Files,编码选择第一个:UTF-8

2、点击Editor-Templates,找到html的这行,点编辑

3、在Pattern区域加入下列代码:

<%@ page language="java" contentType="text/html;  charset=${encoding}"
    pageEncoding="${encoding}"%>
<%
String path = request.getContextPath();
String basePath
=  request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<base href="<%=basePath%>">
<meta charset="${encoding}">
<title>Insert title here</title>
</head>
<body>
${cursor}
</body>
</html>

六、Eclipse配置Servlet模板

1、打开window-Preferences-java-Editor-Templates 2、点new

3、配置如下

4、Pattern内容:

package ${enclosing_package};
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ${primary_type_name} extends  HttpServlet {
    public void doGet(HttpServletRequest  request, HttpServletResponse response)
throws  ServletException, IOException {
        
    }
    public void doPost(HttpServletRequest  request, HttpServletResponse response)
throws  ServletException, IOException {
        doGet(request, response);
    }
}

5、 勾选上“Use code formatter”->Apply->OK

MVC04_监听器

一、监听器概述

1、什么是监听器

做过Swing或者AWT图像界面Java程序开发的话,应该对Listener与Event非常 熟悉。Swing或者AWT中通过Listener与Event来处理事件,如鼠标事件、键盘事件等。

先实现一个Listener接口,然后通过addListener()方法把Listener绑定到某个控件上,单机按钮时就会调用Listener的相应方法,并传回一个Event对象。 Java Web程序也一样,使用Listener与Event完成相应事件的处理。使用 Listener不需要关注该类事件是怎样触发的或者怎么调用相应的Listener,只要记住该类事件触发时一定会调用相应的Listener。

遵循Servlet规范的服务器完成了相应的工作。开发者只要在Listener里编写相关代码就OK了。

二、八大监听器

1、Java Web一共提供了八个监听器供使用,分别用于监听Request、Session

和ServletContext等的创建与销毁、属性变化。这八个监听器分别如下:

  • 监听三大作用域的创建和销毁(重点掌握)

    • ServletContextListener

    • HttpSessionListener

    • ServletRequestListener

  • 监听三大作用域属性的变化(添加、替换、移除)

    • ServletContextAttributeListener

    • HttpSessionAttributeListener

    • ServletRequestAttributeListener

  • 监听被绑定到session中的对象

    • HttpSessionBindingListener

  • 监听Session钝化与活化

    • HttpSessionActivationListener

2、如何自定义一个监听器的,需要如下几步:

  • 写一个类,并实现上述八个监听器中的一个或多个。

  • 在web.xml中注册监听器,或者在自定义类的上面使用注解。

//使用web.xml注册:
<listener>
      <listener-class>自定义监听器的完整路径</listener-class>
  </listener>
//使用注解:
@WebListener
public class MyHttpSessionListener implements  HttpSessionListener {
    ...
}

三、监听三大作用域的创建和销毁

1、ServletContextListener接口:用来监听ServletContext对象的创建和销

毁。

创建:Tomcat服务器启动时。销毁:Tomcat服务器正常关闭时。

自定义监听器:

package com.turing.group1;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* 第一组:监听ServletContext对象
* @author fred
*
*/
public class MyServletContextListener implements  ServletContextListener{
    //当ServletContext对象销毁时会自动调用的方法
    @Override
    public void  contextDestroyed(ServletContextEvent arg0) {
        System.out.println("ServletContext对象销毁啦...");
    }
    //当ServletContext对象创建时会自动调用的方法
    @Override
    public void  contextInitialized(ServletContextEvent arg0) {
        System.out.println("ServletContext创建啦...");
    }
    
}

注册监听器(使用web.xml):

<listener>
    <listener-class>com.turing.group1.MyServletContextListener</listener-class>
  </listener>

测试:正常开启tomcat、正常关闭tomcat,看看控制台输出结果。

2、HttpSessionListener接口:用来监听HttpSession的创建和销毁。

创建:第一次调用request.getSession方法销毁:超过30分钟、调用invalidate、服务器非正常关闭。修改超时默认时间:在web.xml中添加

<session-config>
    <session-timeout>1</session-timeout>
</session-config>

自定义监听器:

package com.turing.group1;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* 第一组:监听session对象
* @author fred
*
*/
@WebListener
public class MyHttpSessionListener implements  HttpSessionListener {
    //当session创建时会自动调用的方法(第一次执行request.getSession()方法)
    @Override
    public void sessionCreated(HttpSessionEvent  arg0) {
        System.out.println("session创建啦...");
    }
    //当session销毁时会自动调用的方法(执行invalidate、超时、服务器非正常关闭)
    @Override
    public void  sessionDestroyed(HttpSessionEvent arg0) {
        System.out.println("session销毁啦...");
    }
}

注册监听器(使用注解):

@WebListener
//写两个servlet,分别来创建session和销毁session:
package com.turing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
    public void doGet(HttpServletRequest  request, HttpServletResponse response)
throws  ServletException, IOException {
        //创建Session
        request.getSession();
    }
    public void doPost(HttpServletRequest  request, HttpServletResponse response)
throws  ServletException, IOException {
        doGet(request, response);
    }
}
package com.turing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
    public void doGet(HttpServletRequest  request, HttpServletResponse response)
throws  ServletException, IOException {
        //销毁Session
        request.getSession().invalidate();
    }
    public void doPost(HttpServletRequest  request, HttpServletResponse response)
throws  ServletException, IOException {
        doGet(request, response);
    }
}

项目发布:分别访问Serlvet1和Servlet2,观察控制台的输出。

3、ServletRequestListener接口:用来监听ServletRequest对象的创建和销

毁。 创建:请求开始时 销毁:请求结束时 自定义监听器:

package com.turing.group1;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
/**
* 第一组:监听request对象的创建和销毁
* @author fred
*
*/
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
    //当请求完成时会自动调用的方法
    @Override
    public void requestDestroyed(ServletRequestEvent arg0) {
        System.out.println("request请求开始啦...");
    }
    //当请求创建时会自动调用的方法
    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
        System.out.println("request请求结束啦...");
    }
}

注册监听器(使用注解):

@WebListener

创建一个Servlet或JSP来测试即可。

四、监听三大作用域属性变化

  • ServletContextAttributeListener

  • HttpSessionAttributeListener

  • ServletRequestAttributeListener

这三个接口中都定义了三个方法,来处理被监听对象中的属性的增加,删除和替换的事件,方法都一样,我们以request域为例: 自定义监听器:

package com.turing.group2;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;
/**
* 第二组:监听request域中属性的变化
* @author fred
*
*/
@WebListener
public class MyServletRequestAttributeListener implements
ServletRequestAttributeListener {
    //当request域添加属性时
    @Override
    public void attributeAdded(ServletRequestAttributeEvent arg0) {
        System.out.println("request域添加了属性...");
    }
    //当request域移除属性时
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
        System.out.println("request域移除了属性...");
    }
    //当request域替换属性时
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
        System.out.println("request域替换了属性...");
    }
}

注册监听器(使用注解):

@WebListener
package com.turing.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet("/Servlet3")
public class Servlet3 extends HttpServlet {
    public void doGet(HttpServletRequest  request, HttpServletResponse response)
throws  ServletException, IOException {
        request.setAttribute("city",  "changsha");
        request.getAttribute("city");
        request.removeAttribute("city");
    }
    public void doPost(HttpServletRequest  request, HttpServletResponse response)
throws  ServletException, IOException {
        doGet(request, response);
    }
}

五、监听被绑定到session中的对象

HttpSessionBindingListener用于当JavaBean对象被放到Session里时执行valueBound()方法, 当JavaBean对象从Session移除时执行valueUnBound()方法。JavaBean必须实现该Listener接口,由JavaBean感知监听。

创建一个JavaBean,实现HttpSessionBindingListener接口:

package com.turing.group3;
import  javax.servlet.http.HttpSessionBindingEvent;
import  javax.servlet.http.HttpSessionBindingListener;
public class Employee implements  HttpSessionBindingListener{
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public void  valueBound(HttpSessionBindingEvent arg0) {
        System.out.println("员工对象被添加到了session中...");
    }
    @Override
    public void  valueUnbound(HttpSessionBindingEvent arg0) {
        System.out.println("员工对象从session中被移除...");
    }
    
}

创建一个Servlet用于将JavaBean对象放置到Session和从Session移除:

package com.turing.group3;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
    public void doGet(HttpServletRequest  request, HttpServletResponse response)
throws  ServletException, IOException {
        //创建实体类
        Employee emp = new Employee();
        //把实体类绑定到session总
        request.getSession().setAttribute("emp",  emp);
        //把实体类从session中移除
        request.getSession().removeAttribute("emp");
    }
    public void doPost(HttpServletRequest  request, HttpServletResponse response)
throws  ServletException, IOException {
        doGet(request, response);
    }
}

使用HttpSessionBindingListener监听器时,不需要注册监听。

六、Session钝化与活化监听session中的对象是否钝化或活化

钝化:当Tomcat服务器关闭时Session会被保存到本地硬盘中。 活化:当Tomcat服务器启动时Session会从本地硬盘读取到内存中的过程。 演示session的钝化和活化。 使用HttpSessionActivationListener来监听Session的钝化与活化 注意:如果session保存的是对象,并想实现钝化和活化,则该对象需要实现Serializable接口。

public class Student
implements  HttpSessionBindingListener,HttpSessionActivationListener,Serializable{
   private int id;
   private String name;
   public int getId() {
       return id;
   }
   public void setId(int id) {
       this.id = id;
   }
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   
   @Override
   public void  valueBound(HttpSessionBindingEvent arg0)  {
       System.out.println("session绑定了一个Student对象");
       
   }
   @Override
   public void  valueUnbound(HttpSessionBindingEvent  arg0) {
       System.out.println("session解绑了一个Student对象");
   }
   
   @Override
   public void  sessionDidActivate(HttpSessionEvent  arg0) {
       System.out.println(arg0.getSession()+"活化了...");
   }
   @Override
   public void  sessionWillPassivate(HttpSessionEvent  arg0) {
       System.out.println(arg0.getSession()+"钝化了...");
   }
   
}

七、统计在线人数

思路:在线人数应该大家都可以看得见,只要有人打开浏览器,就表示上线, 关闭浏览器,就表示下线。

1、在全局域中保存在线人数,可以监听全局域创建时设置变量。

package com.turing.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* 全局域监听器---用于保存在线人数
* @author fred
*
*/
@WebListener
public class MyServletContextListener implements  ServletContextListener{
    @Override
    public void  contextDestroyed(ServletContextEvent arg0) {
        //销毁的时候不管
        
    }
    @Override
    public void  contextInitialized(ServletContextEvent arg0) {
        //第一次初始化的时候,创建一个变量,用来保存在线人数
        
        //通过事件源获取全局对象
        ServletContext application =  arg0.getServletContext();
        
        //设置属性
        application.setAttribute("count", 0);
    }
}

2、监听session的变化,只要session创建就让在线人数+1,只要session销毁

就让在线人数-1。

package com.turing.listener;
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* 会话域对象,用来增减在线人数
* @author fred
*
*/
@WebListener
public class MyHttpSessionListener implements  HttpSessionListener{
    @Override
    public void sessionCreated(HttpSessionEvent  arg0) {
        //上线的时候增
        
        //通过事件源获取全局对象
        ServletContext application =  arg0.getSession().getServletContext();
        
        //获取全局参数
        int count = (int)  application.getAttribute("count");
        
        count++;
        
        //把刷新的数据继续放回到全局域中
        application.setAttribute("count",  count);
        
        System.out.println(arg0.getSession().getId()+"上线了...");
    }
    @Override
    public void  sessionDestroyed(HttpSessionEvent arg0) {
        //下线的时候减
        
        //通过事件源获取全局对象
        ServletContext application =  arg0.getSession().getServletContext();
        
        //获取全局参数
        int count = (int)  application.getAttribute("count");
        
        count--;
        
        //把刷新的数据继续放回到全局域中
        application.setAttribute("count",  count);
        
        System.out.println(arg0.getSession().getId()+"下线了...");
    }
}

3、页面测试

<%@ page language="java" contentType="text/html;  charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath
=  request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html>
<html>
<head>
<base href="<%=basePath%>">
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    在线人数:${applicationScope.count}
</body>
</html>

注意:打开不同的浏览器测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值