Sublime Text 安装 SVN插件

一、测试环境

操作系统:OS X EI Capitan 10.11.5

Sublime版本:Sublime Text 2 Version 2.0.2 Build 2221

二、安装步骤

1、安装Package Control

这个这里就不介绍了

2、cmd+shit+p(windows下ctrl+shit+p)调出控制台,输入install package 选择后按回车键

a7b62447-b3a7-41a5-82de-0a3f1dcd5de0

3、在弹出窗口输入:svn 后选中图中选项,按回车键,安装完成。

67ddaabf-ce2f-4183-8d76-27891510259c

三、插件使用

1、在本地创建项目路径

比如:/Users/renyiwei/workspace/helloworld

2、添加项目到sublime , 选中刚才创建的文件夹并确认

qq20161013-0

3、检出checkout

选择左侧项目右键->svn->checkout

qq20161013-1

在弹出输入框中,按照如下格式输入 (如果是http协议的,开头的svn换成http)

qq20161013-2

4、提交commit

编辑文件后,在项目或者文件夹上右键->Svn->Commit

qq20161013-3

 

 

保存这个文件后就会进行提交操作,如果不提交,则关闭此文件

5、更新项目(update)

在项目后者文件夹上右键->Svn->Updateqq20161013-4

SpringMVC自定义方法参数解析器 绑定mybatis分页PageBounds类型参数

一、需求 

mybatis整合了分页插件mybatis-paginator之后,我们需要从构造一个PageBounds类传入Mapper完成分页,构造PageBounds需要一些参数,比如当前页,分页尺寸,排序字段,排序参数等。这些参数我们可以通过request.getParameter()方式获取:

int page = null==request.getParameter("page") ? 1 : request.getParemeter("page");
//.....
PageBounds pageBounds = new PageBounds(page,limit);

也可以通过如下方式,对每个参数都通过参数绑定的形式获取:


@RequestMapping(value={"/index.action","/list.action"})
@RequiresAuthentication
public String list(Model model,@RequestParam(required =false,defaultValue ="1") int page,
@RequestParam(required =false,defaultValue ="15") int limit,
@RequestParam(required =false) String sort,
@RequestParam(required =false) String dir){
PageBounds pageBounds = new PageBounds(page, limit);
PageList couponList= (PageList) couponService.findByPage(pageBounds);
model.addAttribute("couponList", couponList);
model.addAttribute("page", couponList.getPaginator());
return "coupon/list";
}

但是,一个项目中,我们会有很多这样的分类,比如:产品列表分页,订单分页分页,会员列表分页。如果我们每个模块都用上面的方式去完成PageBounds的实例化,不仅影响代码的编写效率和可读性,也会造成很多代码的重复!

所以此处,我们可以使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定,已达到自动注入PageBounds类型参数的效果:

@RequestMapping(value={"/index.action","/list.action"})
@RequiresAuthentication
public String list(Model model,PageBounds pageBounds){
PageList couponList= (PageList) couponService.findByPage(pageBounds);
model.addAttribute("couponList", couponList);
model.addAttribute("page", couponList.getPaginator());
return "coupon/list";
}

二、实现

2.1、自定义一个解析器,来解析PageBounds类型参数,代码中已注解说明:

package com.renyiwei.web.resolver;

import org.springframework.core.MethodParameter;

import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import com.github.miemiedev.mybatis.paginator.domain.PageBounds;

/**
* 自定义PageBounds方法参数解析器
*
* @author RenYiwei
*
*/
public class PageBoundsMethodArgumentResolver implements HandlerMethodArgumentResolver {

@Override
public boolean supportsParameter(MethodParameter parameter) {
// 获取参数类型
Class paramType = parameter.getParameterType();
// 如果该参数类型是PageBounds类自身或者子类,则返回true,表示这个解析器可以解析此类型
return PageBounds.class.isAssignableFrom(paramType);
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 在此处通过request.getParameter()方式获取分页所需参数
//获取页码 这些字段可以通过自定义注解来指定
int page = null == webRequest.getParameter("page") ? 1 : new Integer(webRequest.getParameter("page"));
//获取分页尺寸
int limit = null == webRequest.getParameter("limit") ? 15 : new Integer(webRequest.getParameter("limit"));
//创建PageBounds实例 这里还可以传入排序方式等参数,构造更完美的PageBounds实例,此处为了简洁就以简单的为例
PageBounds pageBounds = new PageBounds(page,limit);
// 返回PageBounds实例,这个pageBounds就会以方法形参的方式传入控制器类的方法中
return pageBounds;
}

}

上面的PageBounds只是简单地构造了一下,还可以参入排序方式等参数来构造更完善的实例。

另外,也可以自定义注解,注解在方法参数中,来指定参数名称,默认值等,再通过methodParameter获取注解来读取自定义的值,这里就不作介绍了。

2.2、申明自定方法参数解析器,在springmvc的配置文件中配置,我的配置文件是spring-mvc.xml:







2.3、在控制器方法中指定参数为PageBounds类型,在调用service时可以直接传入:

@RequestMapping(value={"/index.action","/list.action"})
@RequiresAuthentication
public String list(Model model,PageBounds pageBounds){
PageList couponList= (PageList) couponService.findByPage(pageBounds);
model.addAttribute("couponList", couponList);
model.addAttribute("page", couponList.getPaginator());
return "coupon/list";
}