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标准
目录
MVC01_Eclipse、Servlet回顾、整合MyBatis
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>
注意:打开不同的浏览器测试。