servlet项目整合jFinal框架,解决servlet被jfinal拦截问题

blackworm 发布于 2014/04/14 17:30
阅读 2K+
收藏 6

最近因在老的系统整合jfinal后出现原来的servlet访问路径被jfinal拦截问题,后经jfinal作者詹总悉心指导以解决此问题。

项目背景:公司老的系统(纯serlvet),因后期维护、添加新功能想整合jfinal框架。

问题描述:因原有系统servlet路径全部采用不带后缀的命名方式,在整合jfinal后发生冲突,原有servlet访问地址被jfinal拦截,从来导致原来能正常访问的路径出现404。

解决方法:

共分成三步:

一.使用Digester解析web.xml读取所有servlet映射路径

1.WebApp.java

package com.lske.entity;

import java.util.ArrayList;
import java.util.List;

/**
 * web-app对象
 * @author blackworm
 *
 */
public class WebApp {


private List<ServletMapping> servletMappings=new ArrayList<ServletMapping>();

public List<ServletMapping> getServletMappings() {
return servletMappings;
}
public void setServletMappings(List<ServletMapping> servletMappings){
this.servletMappings = servletMappings;
}
// 供Digester调用的方法
    public void addServletMapping(ServletMapping servletMapping) {
        this.servletMappings.add(servletMapping);
    }
public WebApp(List<ServletMapping> servletMappings) {
super();
this.servletMappings = servletMappings;
}
public WebApp() {
super();
}
@Override
public String toString() {
return "WebApp [servletMappings=" + servletMappings + "]";
}

}


2. ServletMapping.java

package com.lske.entity;


/**
 * servlet-mapping对象
 * @author blackworm
 *
 */
public class ServletMapping {


private String name;
private String url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public ServletMapping(String name, String url) {
super();
this.name = name;
this.url = url;
}
public ServletMapping() {
super();
}
@Override
public String toString() {
return "ServletMapping [name=" + name + ", url=" + url + "]";
}

}


3.解析类 WebAppDigester.java

package com.lske.digester;

import java.io.File;
import java.io.IOException;


import org.apache.commons.digester3.Digester;
import org.xml.sax.SAXException;


import com.lske.entity.ServletMapping;
import com.lske.entity.WebApp;


/**
 * web.xml解析类
 * @author blackworm
 *
 */
public class WebAppDigester {


/**
* web.xml解析方法
* @param src
* @return
*/
public static WebApp digester(String src){
WebApp webApp=null;
Digester digester = new Digester();
    digester.setValidating(false);
    digester.addObjectCreate("web-app", WebApp.class);
    digester.addObjectCreate("web-app/servlet-mapping", ServletMapping.class);
    digester.addBeanPropertySetter("web-app/servlet-mapping/servlet-name","name");
    digester.addBeanPropertySetter("web-app/servlet-mapping/url-pattern","url");
    //当移动到下一个标签中时的动作
    digester.addSetNext("web-app/servlet-mapping", "addServletMapping");
    try {
webApp=digester.parse(new File(src));
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
return webApp;
}
}


二、在jfinal启动解析web.xml文件 ,MyConfig类里代码片段:

@Override
public void afterJFinalStart() {
loadServlet();
}

private void loadServlet(){
String webRoot = PathKit.getWebRootPath();
WebApp webApp=WebAppDigester.digester(webRoot+"/WEB-INF/web.xml");
if(webApp!=null){
List<ServletMapping> servletMappings=webApp.getServletMappings();
for (ServletMapping servletMapping : servletMappings) {
System.out.println(servletMapping.getUrl());
ServletExcludeHadler.servletSet.add(servletMapping.getUrl());
}
}
}


三、添加一个Handler,登记不需要处理的servlet

public class ServletExcludeHadler extends Handler{

@SuppressWarnings("serial")
public static final HashSet<String> servletSet = new HashSet<String>(){{
       // add("/codeimg");
    }};

@Override
public void handle(String target, HttpServletRequest request,
HttpServletResponse response, boolean[] isHandled) {
if (servletSet.contains(target)) 
          return;
      nextHandler.handle(target,request,response,isHandled);

}


}



加载中
0
JFinal
JFinal

运行效果怎么样? 感谢分享 

0
JFinal
JFinal

     可以在 ServletExcludeHadler 的 servletSet 定义时直接初始化该对象,就在 ServletExcludeHadler 类中添加一个方法来初始化,缩减代码量。只需要 ServletExcludeHadler 这一个类文件就可以打完收工

0
blackworm
blackworm

引用来自“JFinal”的评论

运行效果怎么样? 感谢分享 

嗯,效果挺好的,相互之间没什么影响,jfinal使用起来确实挺方便的

0
blackworm
blackworm

引用来自“JFinal”的评论

     可以在 ServletExcludeHadler 的 servletSet 定义时直接初始化该对象,就在 ServletExcludeHadler 类中添加一个方法来初始化,缩减代码量。只需要 ServletExcludeHadler 这一个类文件就可以打完收工

呵呵,是啊,我这样确实感觉繁琐了点

返回顶部
顶部