一个不超过5000行代码的,快速,简单,易用的MVC框架。
我们的目的是:
让MVC回归其最初的目的。
因简单而快速,超过目前各种主流MVC。
零侵入,零配置,易于测试,并且让开发者感觉不到MVC的存在
可以单独使用,也可以和Spring整合使用。
飞快的json解析,也支持jsp和freemarker(推荐)。
我们的目的不是:
各种标准,各种用法,20+ Annotations, 超强扩展.... SpringMVC做的足够了。
Multipart, 上传这样的需求应该是单独的、通用的,而不是和业务混在一起,邮箱用过吧...
验证,简单的非空验证远远不能满足实际需要,复杂的验证框架做不到。验证应该交给业务逻辑来做,而不是框架。
Getting Started
在此之前,请准备好:
Java JDK 8
Maven3
1.在您的POM中加入一个repository:
Honqun Nexus 3dp
Honqun Repository
http://115.28.55.60:8081/nexus/content/repositories/thirdparty/
true
2.POM中加入依赖
com.github.catstiger
catstiger-mvc
0.1
3.配置web.xml,加入MvcFilter:
MvcFilter
com.github.catstiger.mvc.MvcFilter
basePackage
org.honqun
MvcFilter
/*
4.写一个Service,哦,Controller,随便吧
@Domain //这个标注表示这个类可以响应HTTP请求,URL前缀为/user_service
public class UserService {
/**
* 连同类对应的URL,访问这个方法的URL为/user_service/create
*/
@API
public User create(@Param("id") Long id, @Param("name") String name) {
return null;
}
}
手册
URL映射规则
类用`@Domain`标注,方法用`@API`标注,只有这样,方法才能响应一个URL。
被@Domain的类对应的URL为类名(驼峰命名)小写,单词之间用_分隔,例如:
//这个类的URL前缀为/employee_join_service
@Param
public class EmployeeJoinService{}
被@API标注的函数,对应的URL为:类名URL + / + 方法URL,方法URL为方法名小写单词之间用_分隔。例如:
@Domain
public class EmployeeJoinService{
//访问这个方法的URL为/employee_join_service/join_on
@API
public Employee joinOn(@Param("emp") Employee emp) {
}
}
@Domain和@API都可以自定义URL,他们的value参数用于覆盖缺省的URL规则:
@Domain("/emp")
public class EmployeeJoinService{
//访问这个方法的URL为/emp/join
@API("join")
public Employee joinOn(@Param("emp") Employee emp) {
}
}
输入参数转换
能够自动从HTTP参数转换成各种常用的Java数据类型:
Primitive类型及其Wrapper
String
BigDecimal
BigInteger
java.util.Date,java.sql.Date,格式可以在web.xml中配置用inti-param配置(dateFormat)
普通Java Bean
由上述数据类型组成的数组。
java.util.List,java.util.Set,必须参数化
用@Param标注参数,可以自定义转换规则。
//MyConverterz实现了ValueConverter接口
public User queryByDate(@Param(value= "date", converter = MyConverter.class) Date date){}
方法参数与请求参数对应关系
如果方法参数只有一个,并且是一个JavaBean,那么JavaBean的属性名称与parameter名称一一对应。
如果方法有多个参数,则需要用@Param指出参数名称和parameter名称的对应关系。
如果方法参数是一个JavaBean,而parameter需要与JavaBeann中的某个Beand的属性对应,则可以使用.分隔参数名称。例如:?user.dept.id=1,对应的是User对象的dept属性的id属性。
例如:
@Domain
public class UserService {
/**
* 对应的URL:/user_service/query_user?id=0&username=a&dept.name=tech
*/
@API
public List queryUser(@Param("id") Long id, @Param("username") String username, @Param("dept") Dept dept){
}
}
解析响应
####缺省的解析规则(根据URL扩展名)
URL没有扩展名或者扩展名为.json,直接输出JSON格式的数据。
URL扩展名为.text,.txt, 则直接将方法执行的结果转换为字符串,渲染到HttpServletResponse中。
URL扩展名为.html,.htm,.do,.action:
/WEB-INF/views/下,对应URL的目录中如果有ftl文件,则解析freemarker,并渲染到HttpServletResponse中。
如果没有ftl文件,重定向d(forward)到/WEB-INF/views/下对应的jsp文件。
例如:URL为/user_service/create.htm,对应的模板文件为/WEB-INF/views/user_service/create.ftl或者create.jsp
可以在web.xml中配置模板文件的目录:
MvcFilter
com.github.catstiger.mvc.MvcFilter
pageFolder
/WEB-INF/ftl
####异常处理
可读异常,通常用于处理用户输入错误等,使用com.github.catstiger.mvc.exception.ReadableException抛出。
请求json数据:渲染一个JSON,包括异常说明(message),异常标记(isFailed)等, 例如:
{"errorCode":"-1","failed":true,"msg":"可读异常!"}
请求html数据,以errorMessage为Attribute Name保存在Request中。
后台不会打印异常栈。
不可读异常,通常是系统错误造成,使用RuntimeException抛出
直接返回505错误,异常对象以"javax.servlet.error.exception"保存。
后台记录日志,并打印异常栈。
####自定义解析规则
@API参数reolver指向一个ResponseResolver的实现类,即可实现自定义解析方式:
@API(resolver = MyResolver.class)
public User createUser(@Param("user") User model) {
}