`
ganqing1234
  • 浏览: 171654 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

nutz源码 mvc 之 url与controller 映射

阅读更多

mvc框架的一个重要的作用就是根据用户的url请求,来调用相应的方法。

 

首先自然是对url进行解析了,这里有两种方法一是采用filter方式,另一种则是servlet方式。

 

采用servlet方式的需要在web.xml进行如下配置:

 

 

<servlet>
        <servlet-name>nutServlet</servlet-name>
        <servlet-class>org.nutz.mvc.NutServlet</servlet-class>
        <init-param>
            <param-name>modules</param-name>
            <param-value>org.nutz.controller.HelloController</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>nutServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

 

这样请求过来后就得先经过NutServlet了。

 

主要的方法是init和service。init进行初始化,将定义好的controller和url的映射关系保存起来,然后在service方法中就可以根据request的path来获取相应的controller的方法处理了。

 

 

NutServlet init方法

 

public void init() throws ServletException {
		if (log.isInfoEnabled()) {
			URL me = Thread.currentThread()
							.getContextClassLoader()
							.getResource(NutServlet.class.getName().replace('.', '/') + ".class");
			log.infof("Nutz Version : %s in %s", Nutz.version(), me);
		}
		config = new ServletNutConfig(getServletConfig());
		Loading ing = Inits.init(config, false);
		urls = ing.getUrls();
		ok = true;
	}

 

NutServlet service方法

 

protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		if (null == urls) {
			if (log.isErrorEnabled())
				log.error("!!!This servlet is destroyed!!! Noting to do!!!");
			return;
		}

		Mvcs.updateRequestAttributes(req);
		String path = Mvcs.getRequestPath(req);

		if (log.isInfoEnabled())
			log.info("HttpServletRequest path = " + path);

		// get Url and invoke it
		ActionInvoking ing = urls.get(path);
		if (null == ing || null == ing.getInvoker())
			resp.setStatus(404);
		else
			ing.invoke(config.getServletContext(), req, resp);
	}
 

 

代码中可以看到contoller和url对应的关系保存到了UrlMap urls对象中。init的关键方法在

 

 

Loading ing = Inits.init(config, false);
urls = ing.getUrls();

 

Inits 的init方法的基本思想就是遍历所有的controller的方法,再根据At注解中定义的响应url来建立url和controller中各个方法的关联关系。

 

这里有个问题就是nutz必须要个maincontroller,其他的controller必须在这个controller里定义,系统才能找到。在上面的web.xml中helloController就是。我们公司的mvc框架则采用其他的方式来寻找系统中的Controller,就是通过一个properties将所有的Controller类定义到里面,init里面遍历这个properties就行了。

 

Inits的init方法:

 

 

......
Class<? extends Loading> loadingType;
			LoadingBy lb = mainModule.getAnnotation(LoadingBy.class);
			if (null != lb)
				loadingType = lb.value();
			else
				loadingType = DefaultLoading.class;
			if (log.isDebugEnabled())
				log.debug("Loading by " + loadingType);
			// Here, we load all Nutz.Mvc configuration
			Loading ing = Mirror.me(loadingType).born();
			ing.load(config, mainModule);
........
 

我们没有写loading的实现,就只得使用defaultLoading了。 进入DefaultLoading类。

 

在这里我们又看到了UrlMap urls变量了,组装好这个变量,NutServlet的 urls就能用了。

 

DefaultLoading 的load方法 还是干了很多事的

 

 

this.mainModule = mainModule;
			createContent(config);
			if (log.isDebugEnabled())
				log.debug("Loading configuration...");
			loadIoc(config);
			loadSubModules(config);
			loadLocalization(config);
			setupServer(config);
			saveResult2Context(config);

 这里主要看loadSubModules。

 

 

protected void loadSubModules(NutConfig config) throws Throwable {
		Views vms = mainModule.getAnnotation(Views.class);

		// Prepare view makers
		List<ViewMaker> makers = new ArrayList<ViewMaker>();
		if (null != vms)
			for (Class<? extends ViewMaker> type : vms.value())
				makers.add(type.newInstance());
		makers.add(new DefaultViewMaker());// 优先使用用户自定义

		// Load modules
		if (log.isDebugEnabled())
			log.debugf("MainModule: <%s>", mainModule.getName());

		urls = makeUrlMap(config, context, mainModule);
		Set<Class<?>> moduleSet = new HashSet<Class<?>>();

		// Add default module
		moduleSet.add(mainModule);

		// Then try to load sub-modules
		Modules modules = mainModule.getAnnotation(Modules.class);
		Class<?>[] moduleRefers;
		if (null == modules || null == modules.value() || modules.value().length == 0)
			moduleRefers = new Class<?>[]{mainModule};
		else
			moduleRefers = modules.value();

		// 扫描所有的
		boolean isNeedScanSubPackages = null == modules ? false : modules.scanPackage();
		for (Class<?> module : moduleRefers) {
			// 扫描这个类同包,以及所有子包的类
			if (isNeedScanSubPackages) {
				if (log.isDebugEnabled())
					log.debugf(" > scan '%s'", module.getPackage().getName());
				List<Class<?>> subs = Scans.me().scanPackage(module);
				for (Class<?> sub : subs) {
					if (isModule(sub)) {
						if (log.isDebugEnabled())
							log.debugf("   >> add '%s'", sub.getName());
						moduleSet.add(sub);
					} else if (log.isTraceEnabled()) {
						log.tracef("   >> ignore '%s'", sub.getName());
					}
				}
			}
			// 仅仅加载自己
			else {
				if (isModule(module)) {
					if (log.isDebugEnabled())
						log.debugf(" > add '%s'", module.getName());
					moduleSet.add(module);
				} else if (log.isTraceEnabled()) {
					log.tracef(" > ignore '%s'", module.getName());
				}
			}
		}

		for (Class<?> module : moduleSet) {
			if (log.isDebugEnabled())
				log.debugf("Module: <%s>", module.getName());

			urls.add(makers, module);
		}
		config.setAttributeIgnoreNull(UrlMap.class.getName(), urls);
	}
 

程序先生成个UrlMap,然后就挨个扫描,把所有的Controller找到,然后再每个Controller单独处理,其实就是读At注解,把要处理的url和method关联起来,这个是在urls.add(makers, module);的时候做的。

里面的代码还是挺烦的,看到NutServlet 的service方法里面的ActionInvoking 对象了吗,urls 添加 module的时候就会为moudule中所有有At注解的方法,生成个这个类型的对象,并和At注解里面定义的path关联起来。

 

Nutz 的Mvc框架大体流程就是这样了。个人觉得还是有些复杂,如果做的更轻量点的话,可以这么做:

 

直接将url分成两个部分moudle和method。

比如url为如下格式:http://www.test.com/home/index.do

 

这样的url会调用HomeController(module)的index(method)来处理。这样path对应于方法的映射关系很简单,一个HashMap就搞定,而且也符合约定优先配置的设计思想。

 

分享到:
评论

相关推荐

    nutz搭建的MVC框架

    Nutz是一个轻量级、高性能的Java开源框架,它提供了丰富的功能,包括MVC(Model-View-Controller)架构支持,使得开发者能够快速构建小型到中型的Web应用。本篇文章将详细介绍如何利用Nutz搭建MVC框架,并探讨其在...

    nutz初使用之MVC HelloWorld (netbeans html,jquery版)

    Nutz使用自动扫描机制找到所有控制器,并根据注解定义的URL映射。你可以在`web.xml`或通过`@Routes`注解来配置路由规则。 4. **创建视图(View)**: 视图通常是HTML文件,可以结合JavaScript库如jQuery来处理动态...

    nutz初使用之MVC HelloWorld (netbeans html,js版)

    【标题】:“nutz初使用之MVC HelloWorld (netbeans html,js版)” 这篇教程主要介绍了如何在NetBeans环境中,结合HTML、JavaScript,利用Nutz框架构建一个简单的MVC模式的“Hello, World”应用。Nutz是一个轻量级...

    nutz初使用之MVC HelloWorld (netbeans jsp版)

    在本文中,我们将深入探讨如何使用Nutz框架创建一个简单的MVC(Model-View-Controller)应用程序,以“HelloWorld”为例。Nutz是一个轻量级的Java开发框架,它提供了全面的MVC支持,使得开发者能够高效地构建Web应用...

    Nutz源码Jdoc在IDE中补全提示时出现乱码解决办法

    标题 "Nutz源码Jdoc在IDE中补全提示时出现乱码解决办法" 涉及的问题是在使用IDE(集成开发环境)查看Nutz框架的源码,并尝试利用Javadoc(Jdoc)进行代码补全提示时遇到了乱码问题。这通常是由于编码设置不正确导致...

    nutz 一个使用简单功能强大的mvc框架

    该框架是一个开源项目,可以免费下载, 集成的DAO,MVC,Spring 等框架的功能 不需要其他jar包 学习容易,好用

    高效,小巧的开源JAVA WEB 开发框架-Nutz (源码,开发文档)

    Mvc 框架 -- Nutz.Mvc Json 解析器 -- Nutz.Json 更多的简化Java语法的函数和类 -- Nutz.Lang 以及 Nutz.Castors 不依赖任何第三方 Jar 包,从而便于程序员建立开发环境,部署,甚至重新编译 Nutz 的源代码。 不幸的...

    Nutz 例子,从mvc ioc 到数据插入

    Nutz是一个轻量级、高性能的Java开发框架,它提供了MVC(Model-View-Controller)模式和IOC(Inversion of Control,控制反转)服务,帮助开发者构建高效、稳定的Web应用。这篇博客“Nutz 例子,从mvc ioc 到数据...

    基于Java全栈开发的Nutz框架:Mvc/Ioc/Aop/Dao/Json一体化设计源码

    该项目为全栈Java开发,采用Nutz框架实现Mvc/Ioc/Aop/Dao/Json一体化设计,源码包含2307个文件,涵盖1742个Java源文件、208个man文档、143个png图片、47个jpg图片、22个js脚本、21个psd设计文件、16个xml文件、13个...

    新框架Nutz

    Nutz是一个轻量级的开源Java开发框架,它将数据持久化、反转控制(IoC)和Web框架(MVC)集成为一个功能完备的工具集,其核心设计目标是提供小巧、易于理解和使用的功能,而不依赖于其他第三方jar包。 数据持久化是...

    wendal-nutz-master.zip

    4. **MVC(Model-View-Controller)**:NUTZ提供了一个简单易用的MVC实现,帮助开发者将业务逻辑、视图呈现和数据模型分离,提高代码可读性和维护性。 5. **DAO(Data Access Object)**:NUTZ的数据库访问层,提供...

    nutz需要的jar包

    Nutz是一个轻量级、高性能的Java开发框架,它提供了丰富的功能,包括MVC、ORM、DAO、AOP、IOC等,使得Java开发者能够快速地构建应用系统。本篇文章将详细探讨Nutz框架中所需的jar包以及它们在项目中的作用。 首先,...

    SpringMVC+Nutz框架介绍.pdf

    SpringMVC与Nutz框架的结合,构建了一种高效、稳定且灵活的企业级开发平台。这个平台基于一系列成熟的技术栈,如Spring MVC、Apache Shiro、Bootstrap UI,旨在提供组织机构管理、角色用户分配、权限授权、数据权限...

    nutz迷你项目

    4. **MVC模式**:Nutz支持Model-View-Controller架构,通过@Route注解可以定义控制器方法的URL路由,实现前后端分离。 5. **AOP(面向切面编程)**:Nutz集成的AOP功能,可以方便地进行日志记录、事务管理等通用...

    nutz生成javabean工具.zip

    作为Nutz框架的一部分,Nutz Codematic可以无缝地与其他Nutz组件(如Nutz ORM)结合使用,实现更高效的开发流程。例如,生成的JavaBean可以直接用于Nutz ORM进行数据库操作,简化数据访问层的开发。 6. **学习与...

    nutz简单综合实例----通过html网页对数据库进行管理操作(MVC,Ioc,Dao)

    【标题】"nutz简单综合实例"涉及到的是一个使用Nutz框架进行Web开发的应用示例,这个示例展示了如何通过HTML网页对数据库进行管理操作,实现了Model-View-Controller(MVC)、Inversion of Control(IoC)以及Data ...

    nutz的freemarker视图插件

    将Nutz与Freemarker结合,可以实现类似Struts2中对Freemarker模板的支持,使开发者能够利用Freemarker的强大功能来构建动态网页。 首先,让我们深入了解Nutz和Freemarker的基本概念: 1. **Nutz**: - Nutz是一个...

    nutz代码生成器

    3. **Nutz MVC**:为Web应用提供了MVC(Model-View-Controller)模式的支持,使业务逻辑、数据展示和用户交互分离,提高了代码可维护性。 在利用Nutz代码生成器时,你需要进行以下步骤: 1. **配置数据源**:设置...

    nutz学习资料2

    标题“nutz学习资料2”表明这是一份关于Nutz框架的学习资源集合,Nutz是一个基于Java的轻量级框架,旨在提供全面的MVC支持和企业级开发工具。通过这个压缩包,我们可以期待深入理解Nutz框架的核心特性和使用方法。 ...

    nutz框架使用手册.zip

    Nutz框架由一系列子项目组成,包括Nutz IOC(依赖注入)、Nutz DAO(数据访问对象)、Nutz MVC(模型视图控制器)等,涵盖了Web开发的多个层面,旨在简化开发流程,提高开发效率。 在"nutz框架使用手册.zip"中,...

Global site tag (gtag.js) - Google Analytics