博客标题

不管是Stuct2还是Spring MVC,都是通过在Web.xml里面加入filter,使得Web服务器启动时加载它。Jfinal也是。

filter本身是对Web所有请求的过滤。在 Web服务器启动的时候会加载Filter-class,利用这点Jfinal也就加载起来了。

<filter>
<filter-name>jfinal</filter-name>
<filter-class>com.jfinal.core.JFinalFilter</filter-class>
<init-param>
<param-name>configClass</param-name></init-param>
</filter>
<filter-mapping>
<filter-name>jfinal</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

这里的Filter-class是com.jfinal.core.JFinalFilter,所以我们要从它开始看起。

public final class JFinalFilter implements Filter

从定义中可以看出,JFinal是实现了Filter接口

Filter接口里面有三个主要的方法:

public void init(FilterConfig filterConfig);
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain);
public void destroy();

这是Java本身的东西,Jfinal是对他的实现。

在init方法中Jfinal完成了自身的初始化。

 public void init(FilterConfig filterConfig) throws ServletException {
  //实例化 ConfigClass

  createJFinalConfig(filterConfig.getInitParameter("configClass"));

  
  //进行最主要的Jfinal初始化(疑问:为什么不把ConfigClass也放到Jfinal.init中来,这样代码更容易理解)
  if (jfinal.init(jfinalConfig, filterConfig.getServletContext()) == false)

   throw new RuntimeException("JFinal init error!");
  //获得Jfinal初始化后的对象。
  handler = jfinal.getHandler();
  //获得配置的编码信息,(疑问:应该直接默认UTF-8,此处真是多此一举)
  constants = Config.getConstants();
  encoding = constants.getEncoding();
  jfinalConfig.afterJFinalStart();
  //解析路径的时候需要把前面的主机名,协议名去掉,比如 
  //此处contextPath 是http://127.0.0.1,那么以后得到http://127.0.0.1/helloworld时, 
  //可以根据contextPathLength把http://127.0.0.1截掉,这样得到helloworld,    
  //然后根据helloworld进行映射controller方法
  String contextPath = filterConfig.getServletContext().getContextPath();
  contextPathLength = (contextPath == null || "/".equals(contextPath) ? 0 : contextPath.length());

 }

在doFilter中Jfinal调用真正的处理。

 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
  //传过来的ServletRequest和 ServletResponse 进行类型转换HttpServletRequest,HttpServletResponse 
  //为什么进行类型转换: HttpServletRequest和ServletRequest都是接口 
//HttpServletRequest继承自ServletRequest 
//HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。 
//如getHeader(String name),getMethod(),getSession() 等等。 

  
  HttpServletRequest request = (HttpServletRequest)req;
  HttpServletResponse response = (HttpServletResponse)res;
  request.setCharacterEncoding(encoding);

  String target = request.getRequestURI();
  if (contextPathLength != 0)
   target = target.substring(contextPathLength);
  //为什么要用数组,实在不知道,还要往里面看 
  boolean[] isHandled = {false};
  try {
   handler.handle(target, request, response, isHandled);
  }

  catch (Exception e) {
   if (log.isErrorEnabled()) {
    String qs = request.getQueryString();
    log.error(qs == null ? target : target + "?" + qs, e);
   }
  }
  if (isHandled[0] == false)
   chain.doFilter(request, response);
 }

在destroy只是留下了扩展接口,没有实际内容。

在整个JFinalFilter类中,还有两个方法

private void createJFinalConfig(String configClass)
static void initLogger()

createJFinalConfig使用了反射,实例化了ConfigClass,

ConfigClass就是在<param-value>com.demo.common.DemoConfig</param-value>配置的类。

createJFinalConfig里面的方法是比较common的方法,为什么没有放在util里面,很奇怪。

总结:

 JFinalFilter是直接和Web server耦合的类,是Jfinal的入口。从代码层面说,还有几点需要改进

  1. 去掉 createJFinalConfig,放入Jfinal主类中感觉比较好,并在init中调用
  2. initLogger在Config类中被调用,Config被Jfinal调用,而JFinalFilter本身又调用Jfinal中的方法,

    形成的相互依赖,感觉不太好

  3. init方法内容是几个不相关的内容,最好分出来。
  4. 下面的代码段,放在init中没有意义,本身Constants是静态类,而且仅使用一次,在使用的地方直接

    Config.getConstants().getEncoding()即可,或者在使用该变量的方法开始的时候

encoding=Config.getConstants().getEncoding();

  constants = Config.getConstants();

  encoding = constants.getEncoding();

博客标题

时间: 2024-10-09 14:03:40

博客标题的相关文章

通过urllib.request爬取CSDN原创博客标题方法封装

通过urllib.request爬取CSDN博客原创博客标题方法封装 正则表达式:pat = '<span class=".*">原创</span>(.*)</a>' import re import urllib.request def get_csdn(url, pat, page): title_list = [] for page1 in range(1, int(page) + 1): new_url = url + str(page1)

python 3.5 django 笔记(六)修改博客标题与内容

接下来,要把博客继续完善 画个画儿先~~ ~~~~~~ ~~~~~~ 主页点击修改文章----修改文章页面 主页点击新文章----新文章页面 新文章提交后----主页 修改文章提交后----修改文章 ~~~~~~ ~~~~~~ 敲代码咯 编辑edit_page.html页面 <body> <form action="{% url 'blog:edit_action' %}" method="post"> {% csrf_token %} &l

博客标题测试

我是h1标题 h1h1h1h1h1h1hh1h1hh1h1hh1h1h1h1hh1h1h1h1h1h1h1h1hh1h1h1hh1 我是h2标题 h2h2h2h2hhh2222222222222222h 我是h3标题 333333333333333333333333333333333 我是h4标题 44444444444444444444444444 我是h5标题 5555555555555555555555555555555555

祝贺自己itpub和csdn双双荣获专家博客标题

这是业界难以得到认同内的技能,记录下来.油...所有的钱,明天会更好.

我的版权何在?博客园就不维护博友文章的版权?

说到版权心里就很不爽,大家很多时候自己的利益都有被侵犯的时候,很多人感觉不再乎,以前自己也是. 自己以前在51cto技术博客也写博客,不能说每天都写吧,但是每周都会出新笔记,当时自己也有很多粉丝,当时朋友就给我说,记得写笔记啊,我们都等着看呢,晚上10点前发出来,我必看.当时自己把自己知道的,结合所学到的一块做成world文档,加图片,标注,一心一意的写,偶尔也会录个小视频.想着自己会有越来越多的粉丝,后来博客就被封了,就中午下去吃顿饭的功夫,后来申诉去了,说我博客内容雷同,想想可能版权的问题,

nodejs环境 + 入门 + 博客搭建

NodeJS:NodeJS是一个使用了Google高性能V8 引擎 的服务器端JavaScript实现.它提供了一个(几乎)完全非阻塞I/O栈,与JavaScript提供的闭包和匿名函数相结合,使之成为编写高吞吐 量网络服务程序的优秀平台. NPM:全称是Node Package Manager,是一个NodeJS定制的包管理和分发工具,如node-mysql,已经成为了非官方的发布Node模块(包)的标准. (npm类似maven,package.json类似pom.xml文件) mongod

博客的标签

页面定制css代码 /*去广告*/ #google_ad_c1,#div-gpt-ad-1320933818841-0,#google_ad_c2,#div-gpt-ad-1320933818841-1,#ad_under_google ,#opt_under_post,#ad_under_post_holder,#HistoryToday,.c_ad_block,#under_post_kb,#div-gpt-ad-1410860226396-0,#under_post_news,#site_

使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结

[超详细教程]使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结 去年就知道有这个功能,不过没去深究总结过,最近有写网络博客的欲望了,于是又重新拾起这玩意儿. 具体到底是用Windows Live Writer 2012还是用Word 2013,个人觉得看个人,因为这2个软件各有优点,各有缺点. 1.首先用LiveWriter发博客显然更专业,发布后的效果也与本地最接近,但是在编辑功能上肯定大不如Word,另外一个最大缺点是它本地保存

我的博客是怎么自定义的

第一步,打开设置,一切都在设置里进行,让我们从头到尾,从左到右一步步讲. 1.头像 此头像不是账号头像,是标题那里放图片当头像 <img src="你头像的地址" /> 步骤:将你喜欢的头像上传在相册里(这样比较方便),打开相册—>找到你要的图片—>右键—>复制该图片地址—>放在上面双引号里面,复制上面的代码放在设置的标题框里.如图: 这是我的代码 <img src="http://images.cnblogs.com/cnblogs