1、web.xml配置如下内容：
	
	<filter>
		<filter-name>Atomarrow</filter-name>
		<filter-class>net.atomarrow.dispatcher.FilterDispatcher</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>Atomarrow</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
2、使用规则，按照约定大于配置的原则，按照以下包规则进行编码

 	xxx.xxx.controller ------控制层包，所有Controller需要继承Controller
 	xxx.xxx.service	   ------业务层包，所有Service需要继承Service
 	xxx.xxx.domain     ------数据领域模型包，所有Domain需要继承Domain
 	xxx.xxx.config	   ------配置包  配置类继承与Config
 	xxx.xxx.interceptor------拦截器包 控制层拦截器实现 ControllerInterceptor 业务层拦截器实现ControllerInterceptor
  	xxx.xxx.init       ------web启动加载包 自动加载类实现InitLoader接口
  	xxx.xxx.plugin	   ------插件包 需要实现Plugin接口
 	备注：包文件层数和关键字出现的位置可以任意
 3、Controller匹配规则
 	PersonController类中一个方法hello（）,默认匹配地址为 person/hello  规则为  类名（不含有Controller）/方法名
 	【指定类名】
 	@ControllerUrl("/mall/area")
 	public class AreaController extends BaseController{
 	     
 	}
 	【指定方法名】
 	@MethodUrl("hi")
 	public void hello(){
 	
 	}
 	【指定路径】
 	@Url("/person/hi")
 	public void hello(){
 	
 	}
 	【指定请求类型】
 	@HttpMethod(Method.GET)
    public Render hi(){
    
    }
 4、service引用规则
 	在Controller或者Service中可以直接声明类如 private HelloService helloService;
 	被引用的类是需要是继承Service的类
 5、domain数据库生成
    Domain需要继承Domain类
        生成单个表
  	new TbAdmin().generateTable();
  	生成所有不分表的表
   	new TbAdmin().generateAllSingleTable();
   	生成指定分表的表
   	new TbAdmin().generateAllMultiTable(1);
 6、拦截器使用
 	拦截器需要再指定规则包内，实现对应的接口类（参考规则2）
 	通过ActionInvocation可以获得当前访问的类方法等信息
    @Override
    public Render intercept(ActionInvocation actionInvocation) {
        System.out.println("1 before");
        Render render = actionInvocation.invoke();
        System.out.println("1 after");
        return render;
    }
 7、ActionContext
 	在业务流程中的任意位置都可以通过ActionContext获取相关信息，如request、response、session、application等信息
 8、参数
 	Controller中通过getParam开头的方法获取相关参数如：
 	
	方式一：
 	String name= getParamString("name");//参数名方式获得
 	
 	方式二：
 	访问地址如：/XXX/hello-1
 	String p1 = getParamString(0);//下标方式获得
    Integer p2 = getParamInteger(1);//下标方式获得
 	解析规则：如果多个参数会使用-进行分割，特殊情况，如果参数要传负数，使用N代替符号
 	如：/XXX/N1
 
        传值
      setAttr("topic",topic);
      setAttr("number",1);
        
 9、返回值
 
 	Controller返回值
 		返回Render开头的方法
 		如：
 		绝对路径：renderJsp("/web/index")
 		相对路径：renderJsp("index")
 		备注：不需要写后缀名，相对路径是相对与当前类对应的文件夹，如类名PersonController，相对路径就是/person/下的
 		
 		跳转action
 		renderAction("/person/hello")
 		返回json
 		renderJson(obj);
 		
 		其他方法详见Controller类
 		
 	Service返回值
 		Service中对于需要有操作结果返回的方法，统一返回ServiceResult，可以使用静态变量SUCCESS,或者success()、error()、warn()等方法
 		存在error()方法，整个事务会执行回滚，中途发生错误，事务也会进行回滚
 		
 	
 10、文件上传下载
  	public Render addByExcel(){
        UploadFile file=getFile("upload");
        if(!FileUtil.checkSuffix(file.getFileName(),"xls")){
             return renderJsonFail(FM.UPLOAD_FILE_FORMAT_ERROR);
        }
        ServiceResult result=topicBsService.addFromExcel(file.getFilePath());
        return renderJsonServiceResult(result);
    }

    public Render downloadModel(){
        return renderFile("topic.xls", topicBsService.getExcelModel(getRealPath("/download/topic.xls")));
    }
    
    public Render export(){
    	return renderFile("topic.xls", topicBsService.export(getParamObject("form", TopicBsForm.class)));
    }
 11、配置config
 
 
 
 public class ProjectConfig extends Config{
    private Properties properties;
    
    public Properties getProperties(){
        if(properties==null){
            String path=getClass().getResource("/").getPath()+"database.properties";
            path=path.replace("%20", " ");
            properties = PropertyUtil.readProperties(path);
        }
        return properties;
    }
    @Override
    public boolean configDevMode() {
    	Properties properties = getProperties();
    	String devMode= properties.getProperty("devmode");
    	if(devMode==null){
    		return false;
    	}
        if(devMode.endsWith("true")){
        	return true;
        }
        return false;
    }

    @Override
    public List<String> configTxPrefix() {
        List<String> needTxPrefixs = new ArrayList<String>();
        needTxPrefixs.add("add");
        needTxPrefixs.add("del");
        needTxPrefixs.add("modify");
        needTxPrefixs.add("save");
        needTxPrefixs.add("update");
        needTxPrefixs.add("do");
        needTxPrefixs.add("execute");
        return needTxPrefixs;
    }

    @Override
    public IDataSource configDbPool() {
//        C3p0DataSource
    	Properties properties = getProperties();
    	DefaultDruidDataSource soruce = new DefaultDruidDataSource("jdbc:mysql://"+properties.getProperty("url")+"/"+properties.getProperty("databasename"), properties.getProperty("username"),properties.getProperty("password") );
    	soruce.set(5, 5, 10);
    	soruce.start();
        return soruce;
    
    
    
    }

    @Override
    public String configDbName() {
        Properties properties = getProperties();
        return properties.getProperty("databasename");
    }

    @Override
    public String configDbType() {
        return DbConfig.DB_TYPE_MYSQL;
    }

    @Override
    public boolean configServiceLog() {
        return true;
    }

    @Override
    public String configUploadPath() {
        return "upload";
    }

    @Override
    public int configUploadMaxSize() {
        return 1024*1024*5;
    }

    @Override
    public List<String> configUploadExcludeSuffixs() {
        List<String> excludeSuffixs=new ArrayList<String>();
        excludeSuffixs.add(".bat");
        excludeSuffixs.add(".sh");
        excludeSuffixs.add(".exe");
        excludeSuffixs.add(".jsp");
        excludeSuffixs.add(".php");
        excludeSuffixs.add(".jar");
        excludeSuffixs.add(".class");
        excludeSuffixs.add(".js");
        excludeSuffixs.add(".asp");
        excludeSuffixs.add(".jspx");
        excludeSuffixs.add(".html");
        excludeSuffixs.add(".htm");
        excludeSuffixs.add(".shtml");
        excludeSuffixs.add(".py");
        return excludeSuffixs;
    }
	@Override
	public void coinfigOrmBean() {
		OrmContext.addBean(OptionBean.class);
		OrmContext.addBean(ClasshourStatisticsBean.class);
		OrmContext.addBean(SchoolIncomeBean.class);
	}
	@Override
	public IDomainControl configDomainControl() {
		return DomainControl.INSTANCE;
	}

}
 

 12、分表控制
 /**
 * Domain控制类
 * @author Michael
 *
 */
public class DomainControl implements IDomainControl{
	
	public static DomainControl INSTANCE=new DomainControl();

	/**
	 * 获得实体domain类名
	 * @param domain
	 * @return
	 */
	public String getDomainName(Class domain){
		String domainName = domain.getSimpleName();
		if(DomainUtil.isMultiTable(domainName)){
			return DomainUtil.getMultiTableName(domainName, 1);
		}
		return domainName;
	}
	
	/**
	 * 获得实体domain类名
	 * @param domain
	 * @return
	 */
	public String getDomainName(Class domain,Integer ssid){
		String domainName = domain.getSimpleName();
		if(DomainUtil.isMultiTable(domainName)){
			return DomainUtil.getMultiTableName(domainName, ssid);
		}
		return domainName;
	}
	
}
 
 
 13.获取程序中的错误日志
 1、controller及controller拦截器和render中的错误获取方式：
可以使用controller拦截器，拦截方法中使用ActionContext.getContext().getControllerOrInterceptorException() 可以获取到错误信息
 2、service及数据库相关错误日志的获取方式：
 可以使用Service拦截器，拦截方法中使用ActionContext.getContext().getServiceException()可以获取到错误信息
 
 14.注解使用
 1、数据库相关
 @Comment
  注释
 @Default
 默认值
 @FieldType
 列的类型长度等设置
 @Index
 索引列
 @NotCreate
 非数据库字段
 @NotNull
 不可为空
 @PrimaryKey
 主键
 @Transaction
 是否开启事物
 2、业务相关
 @ControllerUrl
 @HttpMethod
 @Inject
 @MethodUrl
 @NoInject
 @Priority
 @Url
 @UseSetMethod
 
 
 备注：
 如果想实现修改时，修改哪些字段就更新哪些字段如要符合以下规则
 1、数据库字段需要使用包装类  Integer  Double Float 等
 2、数据库更新为Null需要使用Domain上setNull(String filedName)方法
如果使用 int double float也可以正常使用，但是在修改更新时需要指定全需要更新的字段

场景如：

一个表有10个字段，如果修改页面只有8个字段，使用第一种方案Integer类型的，会自动更新8个，另外2个不动
使用int类型的方案，则会更新这8个，另外两个更新为null了，如果需要更新另外两个，需要页面隐藏域或者后台设置等方法了