MVC三层架构
1.什么是MVC
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式
- Model(模型)
- 业务处理 :业务逻辑(Service)
- 数据持久层:CRUD (Dao)
- View(视图)
- 展示数据
- 提供链接发起Servlet请求 (a,form,img…)
- Controller(控制器)
- 接收用户的请求 :(req:请求参数、Session信息….)
- 交给业务层处理对应的代码
- 控制视图的跳转
2.MVC原理图
3.MVC的优缺点
优点: 缺点:
- 耦合性低 - 没有明确的定义
- 重用性高 - 不适合小型,中等规模的应用程序
- 生命周期成本低 - 增加系统结构和实现的复杂性
- 部署快 -视图与控制器间的过于紧密的连接
- 可维护性高 - 视图对模型数据的低效率访问
- 有利软件工程化管理 - 一般高级的界面工具或构造器不支持模式
过滤器(Filter )
1.什么是Filter
Filter可认为是Servlet的一种“变种”,它主要用于对用户请求(HttpServletRequest)进行预处理,也可以对服务器响应(HttpServletResponse)进行后处理,是个典型的处理链。
它与Servlet的区别在于:它不能直接向用户生成响应。
完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
2.过滤器链
在一个Web应用中,也可以部署多个过滤器,这些过滤器组成了一个过滤器链。
过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求可以在这些过滤器之间进行传递,直到 达到目标资源。
一个由两个Filter所组成的过滤器链的过滤过程:
注意:
在客户端的请求响应过程中,并不需要经过所有的过滤器链,而是根据过滤器链中每个过滤器的过滤条件来匹配需要过滤的资源。
3.Filter的开发步骤
- 导包
- 编写过滤器:实现filter接口,重写方法
public class CharacterEncodingFilter implements Filter {
//初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CharacterEncodingFilter初始化");
}
//Chain : 链
/* 1. 过滤中的所有代码,在过滤特定请求的时候都会执行
2. 必须要让过滤器继续同行
chain.doFilter(request,response); */
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("CharacterEncodingFilter执行前....");
chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!
System.out.println("CharacterEncodingFilter执行后....");
}
//销毁:web服务器关闭的时候,过滤会销毁
public void destroy() { System.out.println("CharacterEncodingFilter销毁"); }
}
- 在web.xml中配置 Filter
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>com.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<!--只要是 /servlet的任何请求,会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
<!--<url-pattern>/*</url-pattern>--> //所有请求
</filter-mapping>
监听器(Listener)
在监听器里面实际上主要都是针对于属性的监听(request、session、application)。
在这里我们主要讲述session监听
实现session监听
- 实现接口
//统计网站在线人数 : 统计session
public class OnlineCountListener implements HttpSessionListener {
//创建session监听: 看你的一举一动
//一旦创建Session就会触发一次这个事件!
public void sessionCreated(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
System.out.println(se.getSession().getId());
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount = new Integer(1);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count+1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
//销毁session监听
//一旦销毁Session就会触发一次这个事件!
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext ctx = se.getSession().getServletContext();
Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
if (onlineCount==null){
onlineCount = new Integer(0);
}else {
int count = onlineCount.intValue();
onlineCount = new Integer(count-1);
}
ctx.setAttribute("OnlineCount",onlineCount);
}
/*
Session销毁:
1. 手动销毁 getSession().invalidate();
2. 自动销毁 在web.xml设置时间
*/
}
- web.xml中注册监听器
<!--注册监听器-->
<listener>
<listener-class>com.listener.OnlineCountListener</listener-class>
</listener>