我的mint mvc

2014年的更新:

  1. 取消@Param注解,mint可以直接冲方法中获取参数名
  2. 取消@Post 和 @Get注解,请求方法的定义放在@Mapping注解里: @Mapping(value = "/confirm/{name}/", method="post")
  3. url参数不再使用参数的索引,而是采用参数名字
  4. 取消对guice的依赖
  5. 加入从包扫描action的功能,扫描路劲在web.xml里配

项目来源

mint mvc 并不是我原创的。她的基础是廖雪峰老师的webwind mvc。

webwind是廖老师模仿spring的一个 rest 风格的 mvc 框架,功能简单,但是mvc的核心功能基本具备了,我觉得它的设计思想也很好,很适合想了解mvc的学习者。
我是在这里了解到webwind的: http://www.ibm.com/developerworks/cn/java/j-lo-restmvc/
我是在这里下载到webwind的: http://code.google.com/p/webwind/

因为我平时工作用到的都是php,而我擅长的是java,怕长时间不用生疏了,下班回宿舍就找些java项目练手,所以就拿webwind来练手了。

我的修改

我的修改包括:
  1. 改善了url参数的匹配方式,原来支持9个url参数(1-9),现在支持是个url参数(0-9)。修改之后主要带来两个好处。第一:支持url参数个数增多一个;第二:符合计算机的计数方式,代码中的很多数组不用做特殊的处理,简化了代码. 
  2. 对一些逻辑较复杂的类进行了拆分.
  3.  支持自动获取请求参数并封装到bean内,供action方法使用.目前支持的类型包括:数组类型,基础类型的包装类,普通model类(包含的属性暂时只支持基础类型及其包装类,而且必须有对应的setter方法).如果一个action方法包含了基础类型(非包装类),该方法就不是合法的action方法,这是为了避免反射调用action方法时基础类型参数不能被赋予null值得权宜之举. 
  4.  可以声明一个action方法只能处理特定方法的请求,目前只支持GET和POST方法. 

例子

web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
         version="2.4">
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>mint.mvc.core.ServiceServlet</servlet-class>
        <init-param>
        	<param-name>actionPackages</param-name>
            <param-value>demo;demo.me</param-value>
        </init-param>
        <init-param>
            <param-name>template</param-name>
            <param-value>Jsp</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

一个典型action类如下:

package demo;
import javax.servlet.http.HttpServletRequest;

import mint.mvc.annotation.Mapping;
import mint.mvc.core.ActionContext;

@Mapping("/user")
public class UserAction {
    @Mapping("/login")
    public String hello(String phone, User user) {
        return "<h1>Hello, " + phone + "</h1>";
    }
    
    @Mapping(value = "/confirm/{name}/", method="post")
    public void confirm(String name,User u, String[] hobby, User user){
    	System.out.println(name);
    	
    	if( hobby != null){
			for(String s : hobby){
				System.out.println(s);
			}
    	}
    	
    	System.out.println("name:"+user.getUsername());
    	System.out.println("name:"+user.getPassword());
    	
    	ActionContext context = ActionContext.getActionContext();
    	HttpServletRequest req = context.getHttpServletRequest();
    	
    	
    	System.out.println(req.getParameterMap());
    	//System.out.println("user的类加载器"+user.getClass().getClassLoader());
    }
}
对应jsp如下:
<%@ page language="java" contentType="text/html; charset=utf8" pageEncoding="utf8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8"/>
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/index.css" media="screen" />
</head>
<body>
	<form action='user/confirm/lw/' method="post">
		名字:<input name="user.username" type="text" value=""/><br/>
		密码:<input name="user.password" type="text" value=""/><br/>
		电话:<input name="phone" type="text" value="梁威的电话"/><br/>
		
		爱好:<br/>
		读书<input name="hobby" type="checkbox" value="读书"/>
		音乐<input name="hobby" type="checkbox" value="音乐"/>
		游玩<input name="hobby" type="checkbox" value="游玩"/>
		夏天<input name="hobby" type="checkbox" value="夏天"/>
		
		<button type="submit">登陆</button>
	</form>
	
	<!--<form action='upload' method="post">
		<input type="file" name="file"/>
		<button type="submit">登陆</button>
	</form>-->
</body>
</html>

一些原理图

url匹配的正则表达式:

我的mint mvc_第1张图片

Action类->action方法->方法参数的层次结构,是构造参数注射器(我造的一个名词ParameterInjector)的一个根据:

我的mint mvc_第2张图片

根据请求参数为action方法初始化参数的原理:

我的mint mvc_第3张图片

源码下载

http://git.oschina.net/895925636/mint-mvc

你可能感兴趣的:(我的mint mvc)