林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

一、Filter

1、过滤器的概念

Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应。 主要用于对HttpServletRequest 进行预处理,也可以对HttpServletResponse 进行后处理,是个典型的处理链。

优点:过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题

2、过滤器的作用描述

  • 在HttpServletRequest 到达Servlet 之前,拦截客户的HttpServletRequest 。
  • 根据需要检查HttpServletRequest ,也可以修改HttpServletRequest 头和数据。
  • 在HttpServletResponse 到达客户端之前,拦截HttpServletResponse 。
  • 根据需要检查HttpServletResponse ,可以修改HttpServletResponse 头和数据。

3、特点

Servlet
过滤器是在Java
Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改,它在Servlet被调用之前检查Request对象,
修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response
Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件,具有以下特点:

  • Servlet过滤器可能检查和修改ServletRequest和ServletResponse对象
  • 可以指定Servlet过滤器和特定的URL关联,只有当客户请求访问此URL时,才会触发该过滤器工作
  • 多个Servlet过滤器可以被串联起来,形成管道效应,协同修改请求和响应对象
  • 所有支持Java Servlet规范2.3的Servlet容器,都支持Servlet过滤器

4、接口

所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。该接口定义了以下3个方法:

  • init(FilterConfig)    
    这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后就会调用这个方法。在这个方法中可以通过
    FilterConfig来读取web.xml文件中Servlet过滤器的初始化参数。
  • doFilter(ServletRequest,
    ServletResponse, FilterChain) 
    这是完成实际的过滤操作的方法,当客户请求访问与过滤器关联的URL时,Servlet容器先调用该方法。FilterChain参数用来访问后续的过滤
    器的doFilter()方法。
  • destroy() Servlet容器在销毁过滤器实例前调用该方法,在这个方法中,可以释放过滤器占用的资源。

5、Filter过程


使用户可以改变一个request和修改一个response. Filter
不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开
servlet时处理response.换种说法,filter其实是一个”servletchaining”(servlet 链).一个filter
包括:

  • 在servlet被调用之前截获;
  • 在servlet被调用之前检查servletrequest;
  • 根据需要修改request头和request数据;
  • 根据需要修改response头和response数据;
  • 在servlet被调用之后截获.


能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用.几个实用的filter
包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLTfilter等.

6、Filter建立步骤

建立一个过滤器涉及下列五个步骤:
        1)建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。doFilter方法包含主要的过滤代码(见第2步),init方法建立设置操作,而destroy方法进行清楚。

2)在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息
(包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参
数为FilterChain,如下一步所述,此参数用来调用servlet或JSP页。
      
3)调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作为它的一个参
数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP
页面被激活。
       4)对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和filter-mapping元素。
       5)禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。

过滤器需要在web.xml文件中进行配置

  1. <!-- 配置Filter -->
  2. <filter>
  3. <filter-name>LogFilter</filter-name>
  4. <filter-class>com.mucfc.LogFilter</filter-class>
  5. </filter>
  6. <filter-mapping>
  7. <filter-name>LogFilter</filter-name>
  8. <url-pattern>/*</url-pattern><!-- 表示处理根目录下的所有请求 -->
  9. </filter-mapping>

或者直接用注解:

  1. @WebFilter(filterName="log",urlPatterns={"/*"})
  2. public class LogFilter implements Filter {
  3. .................................
  4. }

7、映射的配置
(1) 映射到一个或多个jsp

  1. <filter-mapping>
  2. <filter-name>FilterName</filter-name>
  3. <url-pattern>/path/FileName.jsp</url-pattern>
  4. </filter-mapping>

(2) 映射到一个或多个servlet

  1. <filter-mapping>
  2. <filter-name>FilterName</filter-name>
  3. <servlet-name>ServletName1</servlet-name>
  4. </filter-mapping>
  5. <filter-mapping>
  6. <filter-name>FilterName</filter-name>
  7. <servlet-name>ServletName2</servlet-name>
  8. </filter-mapping>

(3) 映射到任意的url

  1. <filter-mapping>
  2. <filter-name>FilterName</filter-name>
  3. <url-pattern>/*</url-pattern>
  4. </filter-mapping>

二、Filter简单示例

本例子工程免费下载

下面我们要通过Filter来输出一个Hello World,先建立一个web工程。

然后添加一个Filter如下:

  1. package com.mucfc;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletContext;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.annotation.WebFilter;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import javax.servlet.http.HttpSession;
  14. @WebFilter(filterName="log",urlPatterns={"/*"})
  15. public class LogFilter implements Filter {
  16. private FilterConfig filterConfig;
  17. @Override
  18. public void destroy() {
  19. filterConfig=null;
  20. }
  21. @Override
  22. public void doFilter(ServletRequest arg0, ServletResponse arg1,
  23. FilterChain arg2) throws IOException, ServletException {
  24. //获取ServletContext对象,用于记录日志
  25. ServletContext servletContext=filterConfig.getServletContext();
  26. long before=System.currentTimeMillis();
  27. System.out.println("开始过滤");
  28. HttpServletRequest httpServletRequest=(HttpServletRequest)arg0;
  29. //输出信息
  30. System.out.println("Filter已经截获到用户的请求地址"+httpServletRequest.getServletPath());
  31. //Filter 只是链式处理,请求依然放行到目的地址
  32. arg2.doFilter(arg0, arg1);
  33. //输出到服务器响应执行后处理
  34. long after=System.currentTimeMillis();
  35. System.out.println("过滤 结束");
  36. System.out.println("请求被定位到"+httpServletRequest.getRequestURI()+"  所花时间为"+(after-before));
  37. }
  38. @Override
  39. public void init(FilterConfig arg0) throws ServletException {
  40. filterConfig=arg0;
  41. }
  42. }

这里是直接使用注解的方式来配置Filter,也可以在web.xml中配置

然后就是另一个Servlet

  1. package com.mucfc;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. @WebServlet(name="HelloServlet" ,urlPatterns="/HelloServlet")
  10. //采用WebServlet注解,不用再到web.xml中配置
  11. public class HelloServlet extends HttpServlet {
  12. private static final long serialVersionUID = 1L;
  13. public HelloServlet() {
  14. super();
  15. }
  16. protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. request.setCharacterEncoding("gb2312");
  18. response.setCharacterEncoding("gb2312");
  19. PrintWriter out=response.getWriter();
  20. out.println("你好!hello World  ");
  21. out.close();
  22. }
  23. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  24. }
  25. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26. }
  27. }

这里也是基于注解实现Servlet。这样子可以省去在web.xml中大量的代码,速度更加的快!

  1. @WebServlet(name="HelloServlet" ,urlPatterns="/HelloServlet")

相当于以下

  1. <!-- 配置servlet -->
  2. <servlet>
  3. <servlet-name>HelloServlet</servlet-name>
  4. <servlet-class>com.mucfc.HelloServlet</servlet-class>
  5. </servlet>
  6. <servlet-mapping>
  7. <servlet-name>HelloServlet</servlet-name>
  8. <url-pattern>/HelloServlet</url-pattern>
  9. </servlet-mapping>

然后就是运行了:浏览器输入:http://localhost:8080/ServletLearningChapter2_1/HelloServlet

控制台输出:

页面输出:

三、四种过滤器比较

1、request过滤器

这种过滤器的工作方式比较简单,大家也经常遇到,如下所示:以下是web.xml文件配置方式:

  1. <filter>
  2. <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> 目标资源</servlet-name>
  8. </filter-mapping>

下面我们更改一下web.xml文件的配置,如下方式:

  1. <filter>
  2. <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> 目标资源1</servlet-name>
  8. </filter-mapping>
  9. <filter-mapping>
  10. <filter-name>myFilter</filter>
  11. <servlet-name> 目标资源2</servlet-name>
  12. </filter-mapping>


就是说此过滤器对目标资源一和目标资源二都进行过滤,然后当目标资源一被访问的时候我们将请求转发给目标资源二,那么这个时候过滤器是怎么工作的呢?如下
图所示:我们可以看到,当我们访问目标资源一时过滤器截取了请求,然后再转发给目标资源一,然后再转发给目标资源二,从图中我们可以看到过滤器没有截取转
发到目标资源二的请求,但是我们已经在web.xml文件中配置了该过滤器对目标资源二的过滤,为什么又没有起到过滤作用呢?

答案就在于,目标资源一是客户端直接访问,而目标资源二是被转发过来的,这时过滤器就不能过滤目标资源二。如果你直接访问目标资源二,你会发现该过滤器起到了作用?

我们上面的web.xml文件配置与以下方式等价:

  1. <filter>
  2. <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> 目标资源1</servlet-name>
  8. <dispatcher>REQUEST</dispatcher>
  9. </filter-mapping>
  10. <filter-mapping>
  11. <filter-name>myFilter</filter>
  12. <servlet-name> 目标资源2</servlet-name>
  13. <dispatcher>REQUEST</dispatcher>
  14. </filter-mapping>

这种方式的配置,说明只有直接访问该目标资源时该过滤器才会起作用,对转发到该目标资源的请求将忽略不处理。

那如果我想对转发到目标资源二的请求进行过滤,那怎么办呢?答案见,下一种过滤器,forward过滤器。

2、forward过滤器

我们将web.xml文件的配置修改如下:

  1. <filter>
  2.   <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> 目标资源1</servlet-name>
  8. <dispatcher>REQUEST</dispatcher>
  9. </filter-mapping>
  10. <filter-mapping>
  11. <filter-name>myFilter</filter>
  12. <servlet-name> 目标资源2</servlet-name>
  13. <dispatcher>FORWARD</dispatcher>
  14. </filter-mapping>

我们看对目标资源二过滤的配置方式,这时过滤方式为forward,也就是说对转发到目标资源二的请求过滤,如果直接访问目标资源二,过滤器将不起作用。

3、include过滤器

理解了forward过滤器之后,include过滤器就不难理解了。以下方式:

  1. <filter>
  2. <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> 目标资源1</servlet-name>
  8. <dispatcher>REQUEST</dispatcher>
  9. </filter-mapping>
  10. <filter-mapping>
  11. <filter-name>myFilter</filter>
  12. <servlet-name> 目标资源2</servlet-name>
  13. <dispatcher>INCLUDE</dispatcher>
  14. </filter-mapping>

此表示对包含了目标资源二的请求过滤,如果直接访问目标资源二,则此过滤器将不起作用。

在JSP页面中的动作:指令包含,这时此过滤器不工作。

4、error过滤器

当我们访问一个web目标资源时,如果服务器没有找到该目标资源,那么服务器就会给出一个404错误代码。如果我们给404错误代码定义一个页面,那么当404错误发生时就会调用该页面,请看以下web.xml文件的配置:

  1. <filter>
  2. <filter-name>myFilter</filter-name>
  3. <filter-class>packagename.MyFilterName</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>myFilter</filter>
  7. <servlet-name> /error.jsp</servlet-name>
  8. <dispatcher>ERROR</dispatcher>
  9. </filter-mapping>
  10. <error-page>
  11. <error-code>404</error-code>
  12. <location>/error.jsp</location>
  13. </error-page>

当我们访问一个不存在的文件时,就会访问error.jsp,但是配置了过滤器对错误页面进行过滤,所以过滤器先接受到请求,然后再转发给error.jsp。

如果我们访问一个已经存在的页面,会不会调用error.jsp呢?如果这个页面中有response.sendError(404,"出错了!");那么该错误页面仍然会被调用,过滤器也会工作。

 
 
 

四、Filter使用范例--登陆验证

现在很多网页都要你用账号登录后才能浏览相关的内容。这里我实现通过登录账号,然后浏览相应的网页。

1、新建一个web工程,最终目录 如下:

2、登陆界面JSP:

  1. <%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <title>登录</title>
  6. </head>
  7. <body>
  8. <form action="http://localhost:8080/ServletLearningChapter2_2/Main.jsp" method="POST">
  9. 用户:<input type="text" name="username" /><br/>
  10. 密码:<input type="password" name="password" /><br/>
  11. <input type="submit" value="登录" />
  12. </form>
  13. </body>
  14. </html>

3、登录成功后进行主界面:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@page import="java.util.*"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>Insert title here</title>
  9. </head>
  10. <body>
  11. <% String name=request.getParameter("username"); %>
  12. 欢迎用户:
  13. <%=name %>
  14. 您已经登录成功,可以尽情浏览本网站
  15. </body>
  16. </html>

4、一般如果不加过滤器的话,我们是可以直接通过http://localhost:8080/ServletLearningChapter2_2/Main.jsp

来访问到Main.jsp的。如下:

但是实际我们是想要得用户登录后才能访问,所以要增加如下的过滤 器

5、过滤器

  1. package com.mucfc;
  2. import java.io.IOException;
  3. import javax.servlet.Filter;
  4. import javax.servlet.FilterChain;
  5. import javax.servlet.FilterConfig;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletRequest;
  8. import javax.servlet.ServletResponse;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import javax.servlet.http.HttpSession;
  12. /**
  13. *
  14. * 权限过滤器
  15. *
  16. * */
  17. public class AuthorityFilter implements Filter {
  18. private FilterConfig config;
  19. @Override
  20. public void destroy() {
  21. this.config=null;
  22. }
  23. @Override
  24. public void doFilter(ServletRequest request, ServletResponse response,
  25. FilterChain chain) throws IOException, ServletException {
  26. //获取Filter配置参数
  27. String encoding=config.getInitParameter("encoding");
  28. String loginPage=config.getInitParameter("loginPage");
  29. String afterLogin=config.getInitParameter("afterLogin");
  30. //设置request编码
  31. request.setCharacterEncoding(encoding);
  32. HttpServletRequest requ=(HttpServletRequest) request;
  33. HttpSession session=requ.getSession();
  34. //获取客户请求页面
  35. String requestPath=requ.getServletPath();
  36. String name=requ.getParameter("username");
  37. if(name==""||name==null){
  38. System.out.println("权限拦截器的消息:"+"终止");
  39. HttpServletResponse resq=(HttpServletResponse)response;
  40. resq.sendRedirect(requ.getContextPath()+loginPage);
  41. }else{
  42. System.out.println("权限拦截器的消息:"+"放行");
  43. request.setCharacterEncoding("UTF-8");
  44. chain.doFilter(request, response);
  45. }
  46. }
  47. @Override
  48. public void init(FilterConfig config) throws ServletException {
  49. this.config=config;
  50. }
  51. }

6、然后在web.xml中来配置过滤器(这里也可以直接 用注解的方式 来配置,具体看上面的例子)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  6. <welcome-file-list>
  7. <welcome-file>Login.html</welcome-file>
  8. <welcome-file>Login.htm</welcome-file>
  9. <welcome-file>Login.jsp</welcome-file>
  10. </welcome-file-list>
  11. <!-- 权限拦截器 -->
  12. <filter>
  13. <filter-name>AuthorityFilter</filter-name>
  14. <filter-class>com.mucfc.AuthorityFilter</filter-class>
  15. <init-param>
  16. <param-name>encoding</param-name>
  17. <param-value>GBK</param-value>
  18. </init-param>
  19. <init-param>
  20. <param-name>loginPage</param-name>
  21. <param-value>/Login.jsp</param-value>
  22. </init-param>
  23. <init-param>
  24. <param-name>afterLogin</param-name>
  25. <param-value>/Main.jsp</param-value>
  26. </init-param>
  27. </filter>
  28. <filter-mapping>
  29. <filter-name>AuthorityFilter</filter-name>
  30. <url-pattern>/Main.jsp</url-pattern>
  31. </filter-mapping>
  32. </web-app>

7、下面就是直接启动了,输入http://localhost:8080/ServletLearningChapter2_2/

然后什么都不输入,直接点击登录,发现又跳转到Login.jsp

浏览器中直接输入http://localhost:8080/ServletLearningChapter2_2/Main.jsp,它又会自动跳转到Login.jsp

然后输入一个用户名和密码,就可以正确跳转到Main.jsp(这里没做用户名和密码的判断,只做了一个用户判断)

再来看看控制台的输出结果

从控制台的输出结果我们可以知道是正确 的!

servlet之过滤器(转载)的更多相关文章

  1. 面试之servlet、过滤器、监听器

    servlet.过滤器.监听器servlet是Java中WEB请求和响应的容器servlet的运行需要在类似tomcat容器中,一个 Web 应用对应一个 Context 容器,也就是 Servlet ...

  2. Servlet的过滤器Filter

    Servlet 编写过滤器 Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Serv ...

  3. javaWeb中servlet开发——过滤器

    servlet开发--过滤器(filter) servlet有三种,分为简单servlet.过滤器servlet.监听servlet 简单servlet是作为一种程序所必须的开发结构保存的,继承htt ...

  4. 动手学servlet(六) 过滤器和监听器

     过滤器(Filter) 过滤器是在客户端和请求资源之间,起一个过滤的作用,举个例子,比如我们要请求admin文件夹下的index.jsp这个页面,那么我们可以用一个过滤器,判断登录用户是不是管理员 ...

  5. java servlet之过滤器1(解决jsp之间POST方式数据传递乱码)

    首先,看看没有解决乱码的效果,新建两个jsp页面(a.jsp跳转到b.jsp). <form action="b.jsp" method="post"&g ...

  6. Servlet之过滤器

    Servlet的介绍: Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfig Filter 程序是一个实 ...

  7. 个人笔记--Servlet之过滤器实现权限拦截

    一.编写一个Java类实现javax.servlet.Filter接口 package cn.edu.sxu.filter; import java.io.IOException; import ja ...

  8. Servlet Filter 过滤器

    Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件或静态 ht ...

  9. Servlet 笔记-过滤器

    Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息. 可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet.Servlet 过滤 ...

随机推荐

  1. Redis监控数据分布工具Redis-audit 使用总结

    Redis-audit 是一个用ruby实现的脚本,通过它,我们可以知道每一类 key 对内存的使用量.它可以提供的数据有:某一类 key 值的访问频率如何,有多少值设置了过期时间,某一类 key 值 ...

  2. 使用DBUnit实现对数据库的测试

    这是一个JavaProject,有关DBUnit用法详见本文测试用例 首先是用到的实体类User.java package com.jadyer.model; public class User { ...

  3. gearman的安装和配置

    gearman作为并发任务管理服务,已经越来越多攻城狮在生产环境中使用了.为了日后方便部署到服务器,我写了一个shell. 一般服务器使用稳定的centos,我使用的是centos6.7. 安装she ...

  4. Android RecyclerView体验(一)- 简介

    在网上关于RecyclerView的基本使用方式已经有了比较详细介绍,而且其设计结构也类似于ListView,所以本文将不重点介绍如何使用,在文末的引用中都可以相关内容.这里主要是介绍Recycler ...

  5. LightOJ 1248 Dice (III)

    期望,$dp$. 设$dp[i]$表示当前已经出现过$i$个数字的期望次数.在这种状态下,如果再投一次,会出现两种可能,即出现了$i+1$个数字以及还是$i$个数字. 因此 $dp[i]=dp[i]* ...

  6. Nopcommerce架构浅谈之架构层次

    前面谈到了系统的文件,从文件结构中我们也可以看出Nop的层次划分还是非常清晰,下面我将介绍下Nop的架构层次,并对每个层做简要的介绍,先看我画的层次图. 这个系统基本上按照了ddd的形式做了划分,我本 ...

  7. Css3新特性应用之过渡与动画

    目录 背景与边框第一部分 背景与边框第二部分 形状 视觉效果 字体排印 用户体验 结构与布局 过渡与动画 源码下载 一.缓动效果 学习和利用贝塞尔曲线,默认支持ease,ease-in,ease-ou ...

  8. Nginx stream(TCP/UDP)负载均衡

    Nginx-1.11.6编译安装 nginx编译安装,(平台:ubuntu 14.04); sudo apt-get install zlib1g-dev sudo apt-get install l ...

  9. BTE 增强

    BTE的设计思路还是比较简单,和BADI有点类似.在标准程序中留有OPEN_FI的出口(以函数OPEN_FI_PERFORM_event id_type的形式存在),然后提供一个可配置的TABLE,可 ...

  10. (五)python的发展历史

    1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Circus.他希望这个新的叫做 ...