Code Monkey home page Code Monkey logo

mvc's Introduction

一个不超过5000行代码的,快速,简单,易用的MVC框架。

我们的目的是:

  • 让MVC回归其最初的目的。
  • 因简单而快速,超过目前各种主流MVC。
  • 零侵入,零配置,易于测试,并且让开发者感觉不到MVC的存在
  • 可以单独使用,也可以和Spring整合使用。
  • 飞快的json解析,也支持jsp和freemarker(推荐)。

我们的目的不是:

  • 各种标准,各种用法,20+ Annotations, 超强扩展.... SpringMVC做的足够了。
  • Multipart, 上传这样的需求应该是单独的、通用的,而不是和业务混在一起,邮箱用过吧...
  • 验证,简单的非空验证远远不能满足实际需要,复杂的验证框架做不到。验证应该交给业务逻辑来做,而不是框架。

Getting Started

在此之前,请准备好:

  • Java JDK 8
  • Maven3

1.在您的POM中加入一个repository:

       <repository>
        <id>Honqun Nexus 3dp</id>
        <name>Honqun Repository</name>
        <url>http://115.28.55.60:8081/nexus/content/repositories/thirdparty/</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>

2.POM中加入依赖

    <dependency>
		  <groupId>com.github.catstiger</groupId>
		  <artifactId>catstiger-mvc</artifactId>
		  <version>0.1</version>
		</dependency>

3.配置web.xml,加入MvcFilter:

      <filter>
          <filter-name>MvcFilter</filter-name>
          <filter-class>com.github.catstiger.mvc.MvcFilter</filter-class>
          <init-param>
              <!--您的类在哪个package下?类似spring 的component scan-->
              <param-name>basePackage</param-name>
              <param-value>org.honqun</param-value>
          </init-param>
      </filter>
      <filter-mapping>
          <filter-name>MvcFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>

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

5.在浏览器中访问:http://IP:PORT/user_service/create?id=1试试吧。

手册

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<User> 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中配置模板文件的目录:
     <filter>
           <filter-name>MvcFilter</filter-name>
           <filter-class>com.github.catstiger.mvc.MvcFilter</filter-class>
           <init-param>
     	  <param-name>pageFolder</param-name>
     	  <param-value>/WEB-INF/ftl</param-value>
           </init-param>
         </filter>

####异常处理

  • 可读异常,通常用于处理用户输入错误等,使用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) {
}

mvc's People

Contributors

catstiger avatar

Watchers

Jlynx avatar

Forkers

mxthinker

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.