codecamp

约定模式(Convention Mode)

名词解释:约定优于配置(Convention Over Configuration),也称作按约定编程,是一种软件设计范式,通过命名规则之类的约束来减少程序中的配置,旨在减少软件开发人员需要做决定的数量,获得简单的好处,而又不失灵活性。

有些时候我们仅仅是为了能够访问一个视图文件而不得不编写一个控制器方法与之对应,当这种重复性的工作很多时,就变成了灾难,因此,在WebMVC模块中,通过开启约定模式即可支持直接访问base_view_path路径下的视图文件,无需编写任何代码;

WebMVC模块的约定模式默认为关闭状态,需要通过配置参数开启:

ymp.configs.webmvc.convention_mode=true
访问权限规则配置

在约定模式模式下,支持设置不同路径的访问权限,规则是:-号代表禁止访问,+或无符串代表允许访问,多个路径间用|分隔;

访问权限示例:禁止访问admin目录和index.jsp文件,目录结构如下:

WEB-INF\
|
|--templates\
|   |
|   +--admin\
|   |
|   +--users\
|   |
|   +--reports\
|   |
|   +--index.jsp
|   |
|   <...>

示例参数配置:

ymp.configs.webmvc.convention_view_paths=admin-|index-|users|reports+
拦截器规则配置

由于在约定模式下,访问视图文件无需控制器,所以无法通过控制器方法添加拦截器配置,因此,WebMVC模块针对约定模式单独提供了拦截器规则配置这一扩展功能,主要是通过@InterceptorRule配合IInterceptorRule接口使用;

拦截器规则设置默认为关闭状态,需要通过配置参数开启:

ymp.configs.webmvc.convention_interceptor_mode=true

拦截规则配置示例:

@InterceptorRule("/demo")
@Before(WebUserSessionCheck.class)
public class InterceptRuleDemo implements IInterceptorRule {

    @InterceptorRule("/admin/*")
    @Before(AdminTypeCheckFilter.class)
    public void adminAll() {
    }

    @Clean
    @InterceptorRule("/admin/login")
    public void adminLogin() {
    }

    @InterceptorRule("/user/*")
    public void userAll() {
    }

    @InterceptorRule("/mobile/person/*")
    public void mobilePersonAll() {
    }
}

说明:

@InterceptorRule:拦截器规则注解;

  • 在实现IInterceptorRule接口的类上声明,表示该类为拦截规则配置;
  • 在类方法上声明,表示针对一个具体的请求路径配置规则,与@RequestMapping的作用相似;

规则配置中支持的注解:

  • @Before:约定模式下的拦截器仅支持@Before前置拦截;
  • @Clean:清理上层指定的拦截器;
  • @ContextParam:上下文参数;
  • @ResponseCache:声明控制器方法返回视图对象的执行结果将被缓存;

注意:配置规则类的方法可以是任意的,方法本身无任何意义,仅是通过方法使用注解;

URL伪静态

WebMVC模块通过约定模式可以将参数融合在URL中,不再通过?传递参数,让URL看上去更好看一些;

伪静态模式默认为关闭状态,需要通过配置参数开启:

ymp.configs.webmvc.convention_urlrewrite_mode=true

参数传递规则:

  • URL中通过分隔符_传递多个请求参数;
  • 通过UrlParams[index]方式引用参数值;

伪静态示例:

URL原始格式:
http://localhost:8080/user/info/list?type=all&page=2&page_size=15

URL伪静态格式:
http://localhost:8080/user/info/list_all_2_15

请求参数的引用:

// 通过EL表达式获取参数
${UrlParams[0]}:all
${UrlParams[1]}:2
${UrlParams[2]}:15

注意:伪静态参数必须是连续的,UrlParams参数集合存储在Request作用域内;

约定模式完整的配置参数
#-------------------------------------
# 约定模式配置参数
#-------------------------------------

# 是否开启视图自动渲染(约定优于配置,无需编写控制器代码,直接匹配并执行视图)模式,可选参数,默认值为false
ymp.configs.webmvc.convention_mode=

# Convention模式开启时视图文件路径(基于base_view_path的相对路径,'-'号代表禁止访问,'+'或无符串代表允许访问),可选参数,默认值为空(即不限制访问路径),多个路径间用'|'分隔
ymp.configs.webmvc.convention_view_paths=

# Convention模式开启时是否采用URL伪静态(URL中通过分隔符'_'传递多个请求参数,通过UrlParams[index]方式引用参数值)模式,可选参数,默认值为false
ymp.configs.webmvc.convention_urlrewrite_mode=

# Convention模式开启时是否采用拦截器规则设置,可选参数,默认值为false
ymp.configs.webmvc.convention_interceptor_mode=
国际化(I18N)
高级特性—控制器请求处理器
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }