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+"/";
%>
Insert title here
${cursor}
六、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注册://使用注解: @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;
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):
com.turing.group1.MyServletContextListener
测试:正常开启tomcat、正常关闭tomcat,看看控制台输出结果。
2、HttpSessionListener接口:用来监听HttpSession的创建和销毁。
创建:第一次调用request.getSession方法 销毁:超过30分钟、调用invalidate、服务器非正常关闭。 修改超时默认时间:在web.xml中添加
1
自定义监听器:
package com.turing.group1;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@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;
@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;
@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;
@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;
@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+"/"; %>Insert title here 在线人数:${applicationScope.count}
注意:打开不同的浏览器测试。



