簡潔的MVC框架Rural

如下的文檔內容你能夠移步到 [Rual(http://github.com/nullcodeexecutor/rural) 查看。java

這個框架的設計初衷是徹底無註解無配置,不事後來發現真正無註解無配置並不必定簡潔,好比攔截器的使用如今只有靠代碼來代替配置。這個小小框架的代碼真的有點慘不忍睹。 你們有什麼設計和代碼上的建議請提出一塊兒交流。git

<br/>github

####1 Getting Started #####1.1 Introduction     Rural是一個基於spring的mvc框架,設計上相似spring mvc,相比於spring mvc,Rural使用更簡便,無需配置和註解就能夠實現URL到java方法的映射。 取名Rural(鄉村風味的,田園的)寓意簡潔。<br/>     目前Rural支持json,jsp,freemarker三種視圖。 #####1.2 Hello World     首先在web.xml中配置,相似spring mvc,須要配置listener來啓動spring context,配置servlet負責請求分發web

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <servlet>
        <servlet-name>rural</servlet-name>
        <servlet-class>org.rural.context.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>rural</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    增長spring bean配置以下spring

<bean id="defaultRuralConfig" class="org.rural.config.DefaultRuralConfig"/>

    而後編寫controllerjson

@Controller
public class HelloController {

    public String sayHello(Model model) {
        model.put("msg", "Hello World!");
        return "json";
    }

}

    訪問url /contextPath/hello/sayHello時,methodsayHello將執行,容器返回以下json字符串mvc

{"msg":"Hello World!"}

####2 Config     Rural配置極少,通常只須要配置默認的DefaultRuralConfig便可。若須要更改配置或須要定義攔截器則可自定義配置類,繼承自DefaultRuralConfig便可。app

@Component
public class RuralConfig extends DefaultRuralConfig {
    @Override
    public void setInterceptorConfig(InterceptorConfigHolder interceptorConfigHolder) {
        super.setInterceptorConfig(interceptorConfigHolder);
        //增長攔截器
        interceptorConfigHolder.add("/user/*", UserInterceptor.class);
    }

    @Override
    public void setContextConfig(ContextConfigHolder contextConfigHolder) {
        super.setContextConfig(contextConfigHolder);
        //重寫定義某些配置,這裏重定義了模板類型爲freemarker
        contextConfigHolder.add(TEMPLATE, "fm");
    }
}

    DefaultRuralConfig 類中定義了全部Rural支持的配置。框架

@Override
    public void setContextConfig(ContextConfigHolder contextConfigHolder) {
	    //請求響應編碼類型
        contextConfigHolder.add(CHARSET, "UTF-8");
        //模板類型,目前只支持jsp和fm(freemarker)
        contextConfigHolder.add(TEMPLATE, "fm");
        //頁面文件所在位置
        contextConfigHolder.add(PAGE_LOCATION, "/WEB-INF/page/");
        //資源文件所在位置
        contextConfigHolder.add(RESOURCES_LOCATION, "/resources");
        //Controller所在包
        contextConfigHolder.add(CONTROLLER_LOCATION, "");
    }

####3 URL Mapping #####3.1 Default     Rural自動創建URL到方法的映射。當有以下兩個Controller類和方法URL映射以下<br/>jsp

org.coder.controller.HelloController	
	public String sayHello(Model model)
	
org.coder.controller.resc.ResouceController
	public  String fineOne(Model model);

    當沒有配置CONTROLLER_LOCATION時,默認全部以Controller爲後綴的類都是Controller,url路徑爲類名截去後綴Controller,再把首字母小寫。<br/>     以上所示的兩個方法分別對應URL /hello/sayHello/resource/findOne。 #####3.2 自定義Controller包位置     當自定義Rural Config的CONTROLLER_LOCATION後,必須知足以該包名開頭且以Controller爲後綴的類纔是Controller,且包名會與URL路徑對應。     如類結構仍爲3.1所示,設置

@Override
    public void setContextConfig(ContextConfigHolder contextConfigHolder) {
        super.setContextConfig(contextConfigHolder);
        contextConfigHolder.add(CONTROLLER_LOCATION, "org.coder.controller");
    }

    此時兩個URL 爲/hello/sayHello/resc/resource/findOne。 ####4 Metadata Inject #####4.1 Is what metadata     Metadata是指可以被Rural自動注入在URL對應的方法參數的數據類型,這包括請求類型和其它一些servlet和rural相關類型。<br/>     如訪問urlxxx/findOne?name=myname&age=24,以下的方法中的參數name,age,model都會被自動注入。

public String findOne(String name, int age, Model model, HttpServletRequest request){
    System.out.println("user findOne ...");
    model.put("name", name);
    model.put("age", age);
    return "forward:user";
}

#####4.2 全部能被注入的類型     可以被Rural注入的請求參數類型包括8種基本數據類及其包裝器類型和String類型。     此外還有三個servlet相關類型,ServletContext,HttpServletRequest,HttpServletResponse,HttpSession。注入這四個類型是必須定義成這幾個接口類型。     還有比較特殊的類型Model,該類其實是一個HashMap,用於持有用於頁面渲染的數據類型。當模板類型是JSP時,model中的數據會自動轉存到request中。 ####5 View     Controller中的方法必須返回String,String的內容指明瞭該此請求使用何種視圖。

  • json    json視圖
  • forward:xxx/xx    經過forward形式跳轉到頁面,目前頁面支持freemarker(fm)和jsp
  • redirect:xxx    經過redirect跳轉到另外一個請求

    下列情景Rural會返回/WEB-INF/page/user/one.ftl頁面渲染的結果。

contextConfigHolder.add(TEMPLATE, "fm");
        contextConfigHolder.add(PAGE_LOCATION, "/WEB-INF/page/");
public String user(Model model){
        model.put("user", new User("lisi", 18));
        return "forward:user/one";
    }

####6 Interceptor     Rural支持自定義攔截器,繼承抽象類Interceptor。不管before仍是after 方法返回false都會使請求鏈終止。

@Component
public class UserInterceptor extends Interceptor{
    @Override
    public boolean before(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("user before");
        return true;
    }
    @Override
    public boolean after(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("user after");
        return true;
    }
}

    Rural攔截器的配置須要在代碼中完成。攔截器中URL配置使用的是org.springframework.util.AntPathMatcher

@Component
public class MyConfig extends DefaultRuralConfig {
    @Override
    public void setInterceptorConfig(InterceptorConfigHolder interceptorConfigHolder) {
        super.setInterceptorConfig(interceptorConfigHolder);
        interceptorConfigHolder.add("/user/*", UserInterceptor.class);
    }
    @Override
    public void setContextConfig(ContextConfigHolder contextConfigHolder) {
        super.setContextConfig(contextConfigHolder);
    }
}
相關文章
相關標籤/搜索