Package cn.org.ape

Source Code of cn.org.ape.ApeServlet

package cn.org.ape;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.commons.collections.IteratorUtils;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.objectweb.asm.ClassReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.org.ape.asm.ClassParsing;
import cn.org.ape.context.BeanParameter;
import cn.org.ape.http.HttpRequest;
import cn.org.ape.http.HttpResponse;
import cn.org.ape.http.RequestContext;
import cn.org.ape.http.ResponseContext;


/**
* Servlet的接口 默认的URL :servlet/*<br>
* 同时也可以配置文件 如:<br >
*
<br >
* <servlet><br >
*   <servlet-name>servlet</servlet-name><br >
*   <servlet-class>cn.org.ape.ApeServlet</servlet-class><br >
*   <init-param><br >
*   <param-name>module</param-name><br >
*   <param-value>module.properties</param-value><br >
*   </init-param><br >
*   <!-- 是否使用 异步处理  默认是false 不使用-->
*   <async-supported>true</async-supported><br >
*   <multipart-config></multipart-config><br >
* </servlet><br >
* <br >
* <br >
  * <servlet-mapping><br >
*   <servlet-name>servlet</servlet-name><br >
*   <url-pattern>/action/*</url-pattern><br >
* </servlet-mapping><br >
* <br >
* @author 陈磊
*
*/
@WebServlet(urlPatterns= "/servlet/*")
public class ApeServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  private final static Logger log= LoggerFactory.getLogger(ApeServlet.class);
 
  /**
   * 初始化,主要是完成module的内存加载<br>
   * 从配置文件中读取module对于类
   */
  @Override
  public void init() throws ServletException {
    super.init();
    String module = getInitParameter("module"); //<init-param>
    if (module==null)
    {
      module = "ape.properties"; //设置默认的配置文件
    }
    this._createModules(module);
  }
 
 
  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    HttpRequest request=new RequestContext(req);
    HttpResponse response = new ResponseContext(resp);
   String module= request.getModule();//取得调用类
   String action= request.getAction()//取得调方法
   BaseAction baseAction = modules.get(module); //初始调用类
   if (baseAction==null)
   {
     //没有找到Module 返回404
    response.sendError(HttpResponse.SC_NOT_FOUND);//返回404
    return ;
   }
    
   //通过asm 把request的属性赋值到调用类中属性中
    ClassParsing cp = new ClassParsing();
    ClassLoader classloader = baseAction.getClass().getClassLoader();
    if (classloader != null)
      {
      //取得调用类的url
        URL url = classloader.getResource(StringUtils.replace(baseAction.getClass().getName(), ".", "/") + ".class");
        File file = FileUtils.toFile(url);
        if (file != null)
        {
          ClassReader cr = new ClassReader(FileUtils.openInputStream(file));
          cr.accept(cp, 0);
        }

      }
  Map<?, ?> map=cp.getMap();
  baseAction.init(request, response); //初始化baseAction
  BeanParameter.populate(baseAction, request,map);//初始化bean
  if (StringUtils.isNotEmpty(action))
  {
    baseAction.run(); //执行
  }
  else
  {
    baseAction.execute(); //默认执行
  }
 
  }
 
 
  /**
   * 销毁
   */
  @Override
  public void destroy() {
    // TODO Auto-generated method stub
      log.debug("destroy");
    super.destroy();
  }

 
  /**
   * 把配置文件的内容 存放于 HashMap<String, BaseAction>
   * @param module 配置文件的名称
   */
  private  void _createModules(String module
  { 
   
    try {
      //module这个文件会自动在下面几个地方被搜寻:当前目录 、用户主目录 、classpath
      PropertiesConfiguration conf = new PropertiesConfiguration(module);
      //当配置文件的内容发生改变了的时候,Commons Configuration能自 动重新读取配置文件的内容。
      conf.setReloadingStrategy(new FileChangedReloadingStrategy());
     
      @SuppressWarnings("unchecked")
      List<String> keys=IteratorUtils.toList(conf.getKeys());
      for (String key : keys)
      {
        String moduleClass = conf.getString(key);
        BaseAction baseAction = _retrieveModule(moduleClass);
        modules.put(key, baseAction);
      }
    } catch (ConfigurationException e) {
      log.error("找不到配置文件 : {}\n"+e, module);
   
  }
 
  /**
   * 通过类的名称 ,返回名称对于的对象。如果没有找到该对象,返回NULL
   * @param moduleClass 类的名称 如:test.action.TestAction
   * @return 返回 Object对象
   */
  private  BaseAction _retrieveModule(String moduleClass)
  {
    try {
    BaseAction baseAction = (BaseAction) Class.forName(moduleClass).newInstance();
    return baseAction;
  } catch (InstantiationException e){
    log.error("不存在 :{} 类\n"+e,moduleClass);
    return null;
  }
    catch (IllegalAccessException e){
      log.error("不存在 :{} 类\n"+e,moduleClass);
      return null;
    }
    catch (ClassNotFoundException e) {
    log.error("不存在 :{} 类\n"+e,moduleClass);
    return null;
   
  }
  }
 

  private final static HashMap<String, BaseAction> modules = new HashMap<String, BaseAction>();

}
TOP

Related Classes of cn.org.ape.ApeServlet

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.