如下的文檔內容你能夠移步到 [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的內容指明瞭該此請求使用何種視圖。
下列情景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); } }