文档章节

简洁的MVC框架Rural

掠水
 掠水
发布于 2015/06/01 22:58
字数 1172
阅读 94
收藏 0

以下的文档内容你可以移步到 [Rual(http://github.com/nullcodeexecutor/rural) 查看。

这个框架的设计初衷是完全无注解无配置,不过后来发现真正无注解无配置并不一定简洁,比如拦截器的使用现在只有靠代码来代替配置。这个小小框架的代码真的有点惨不忍睹。 大家有什么设计和代码上的建议请提出一起交流。

<br/>

####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负责请求分发

    <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配置如下

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

    然后编写controller

@Controller
public class HelloController {

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

}

    访问url /contextPath/hello/sayHello时,methodsayHello将执行,容器返回如下json字符串

{"msg":"Hello World!"}

####2 Config     Rural配置极少,一般只需要配置默认的DefaultRuralConfig即可。若需要更改配置或需要定义拦截器则可自定义配置类,继承自DefaultRuralConfig即可。

@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/>

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);
    }
}

© 著作权归作者所有

掠水

掠水

粉丝 6
博文 2
码字总数 1172
作品 0
乐山
私信 提问
PHP5的MVC框架--TMPHP

TMPHP 是一个简洁高效的PHP5 MVC框架,基本核心特点是:简洁、高效、优雅。 核心特点 纯粹的PHP5面向对象代码特点,纯粹的MVC框架支持 支持多种配置文件 (ini/array) 支持多种模板 (原生PHP...

匿名
2010/10/14
1K
0
有关Spring3.x 整合myBatis3.1的轻量级框架简要说明

主题:有关Spring3.x 整合myBatis3.1的轻量级框架 对于现在主流的j2ee企业级开发而言,ssh(struts+hibernate+spring)依然是一个事实的标准。 由struts充当的mvc调度控制;hibernate的orm持...

后海
2013/02/01
492
0
MVC核心框架--MVC_CORE 0.0.2

core 0.0.2已经发布,精简了很多代码,基本满足开发的需要,适合开发者阅读及新手入门 core_mvc 是一个简洁的MVC核心框架,浅显易懂,没有任何干扰代码,提供给大家分享。代码本身只有几KB,...

匿名
2010/01/22
1K
0
PHP MVC框架--PHP AMP

欢迎使用 PHPMVC 开源框架 - AMP AMP-优雅精致的WEB应用开发MVC框架。 为什么选择AMP? 01) 快速: 框架核心文件总大小10余KB,0.0001毫秒迅速载入启动。 02) 高效: 安全高效性能、优越的资源控...

Amysql
2012/04/09
2.5K
1
pillar/FilghtPHP

框架介绍 本框架是在著名的FilghtPHP(国外)和Canphp(国内)基础上扩展的一个小框架,简化了开发流程,增加了MVC模式。 ####官网:http://www.easyes.com.cn FilghtPHP Flight是一个快速,简易...

pillar
2016/09/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.4K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
41
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部