- 浏览: 171654 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
lb10001:
不错,正好需要这个知识
img src的特殊使用 -
923080512:
lz下面这句话写错了: Read Uncommitted ...
Spring事务隔离级别和传播行为 -
hucc:
good
img src的特殊使用 -
恶魔眼睛:
经常出现:
WARN | S-0:0:0:0:0:0:0:1 ...
pushlet 学习二 -
gaboolic:
ganqing1234 写道zhangyao 写道 retur ...
pushlet 学习二
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就搞定,而且也符合约定优先配置的设计思想。
发表评论
-
《how tomcat works》读书笔记
2012-02-09 15:39 1518一 简单web服务 客户 ... -
Xpath使用,从 Java 程序中查询 XML
2011-12-14 09:45 1469转自:http://www.ibm.com/de ... -
从google code获取源码
2011-10-14 16:03 1879最近想学习python,找到了jaikuengine项目,一个 ... -
CXF几种客户端调用性能
2011-09-21 12:26 8119转自:http://blog.csdn.net/li ... -
java 路径、className.class.getResourceAsStream()、ClassLoader.getSystemResourceAsStr
2011-09-17 15:34 0className.class.getResourceAs ... -
java classLoader 体系结构
2011-09-17 15:27 1008java classLoader 体系结构 发表于:20 ... -
Jar命令 Manifest.mf的用法
2011-08-02 16:27 2227转自: http://hi.baidu.com/echo ... -
Java Http连接中(HttpURLConnection)中使用代理(Proxy)及其验证(Authentication)
2011-07-28 14:45 6156转自: http://blog.csdn.net/red ... -
白痴理解的SOAP/Web Service/WSDL关系
2011-07-27 17:01 1277转自: http://www.cnblogs.com/z ... -
JNDI 介绍
2011-04-09 20:12 1606转自http://blog.csdn.net/zhao ... -
Nutz源码之 Ioc 加载
2011-01-30 15:09 0Ioc 即为控制反转,放在spring里面叫 依赖注入,其实就 ... -
nutz源码 mvc 之 视图解析
2011-01-27 11:36 3481nutz的视图主要是通过con ... -
nutz源码之aop实现
2011-01-10 10:13 0jjj -
pushlet 学习三 跨域实现
2010-11-02 20:14 0pushlet 的 ajax.js 是以ajax 轮询来实现 ... -
pushlet 学习二
2010-11-02 20:09 5299pushlet 的官网上有很多例子,可以参见http:/ ... -
利用slor实现索引查询
2009-06-19 10:43 3667项目里有一个查询模块,就是从特定的ftp站点扫描,然后利用so ... -
java 反射机制
2009-02-07 15:01 0RTTI(运行时类型检查)同reflection的真正区别在于 ... -
servlet的session管理
2009-01-09 14:53 1862在servlet里调用httpsession方法是 reque ... -
Spring--quartz中cronExpression配置说明
2008-12-12 13:48 1122Spring--quartz中cronExpression配置 ... -
java volatile关键字
2008-12-01 16:46 1355最近看LumaQQ的源码发现一个volatile(中文意思是“ ...
相关推荐
Nutz是一个轻量级、高性能的Java开源框架,它提供了丰富的功能,包括MVC(Model-View-Controller)架构支持,使得开发者能够快速构建小型到中型的Web应用。本篇文章将详细介绍如何利用Nutz搭建MVC框架,并探讨其在...
Nutz使用自动扫描机制找到所有控制器,并根据注解定义的URL映射。你可以在`web.xml`或通过`@Routes`注解来配置路由规则。 4. **创建视图(View)**: 视图通常是HTML文件,可以结合JavaScript库如jQuery来处理动态...
【标题】:“nutz初使用之MVC HelloWorld (netbeans html,js版)” 这篇教程主要介绍了如何在NetBeans环境中,结合HTML、JavaScript,利用Nutz框架构建一个简单的MVC模式的“Hello, World”应用。Nutz是一个轻量级...
在本文中,我们将深入探讨如何使用Nutz框架创建一个简单的MVC(Model-View-Controller)应用程序,以“HelloWorld”为例。Nutz是一个轻量级的Java开发框架,它提供了全面的MVC支持,使得开发者能够高效地构建Web应用...
标题 "Nutz源码Jdoc在IDE中补全提示时出现乱码解决办法" 涉及的问题是在使用IDE(集成开发环境)查看Nutz框架的源码,并尝试利用Javadoc(Jdoc)进行代码补全提示时遇到了乱码问题。这通常是由于编码设置不正确导致...
该框架是一个开源项目,可以免费下载, 集成的DAO,MVC,Spring 等框架的功能 不需要其他jar包 学习容易,好用
Mvc 框架 -- Nutz.Mvc Json 解析器 -- Nutz.Json 更多的简化Java语法的函数和类 -- Nutz.Lang 以及 Nutz.Castors 不依赖任何第三方 Jar 包,从而便于程序员建立开发环境,部署,甚至重新编译 Nutz 的源代码。 不幸的...
Nutz是一个轻量级、高性能的Java开发框架,它提供了MVC(Model-View-Controller)模式和IOC(Inversion of Control,控制反转)服务,帮助开发者构建高效、稳定的Web应用。这篇博客“Nutz 例子,从mvc ioc 到数据...
该项目为全栈Java开发,采用Nutz框架实现Mvc/Ioc/Aop/Dao/Json一体化设计,源码包含2307个文件,涵盖1742个Java源文件、208个man文档、143个png图片、47个jpg图片、22个js脚本、21个psd设计文件、16个xml文件、13个...
Nutz是一个轻量级的开源Java开发框架,它将数据持久化、反转控制(IoC)和Web框架(MVC)集成为一个功能完备的工具集,其核心设计目标是提供小巧、易于理解和使用的功能,而不依赖于其他第三方jar包。 数据持久化是...
4. **MVC(Model-View-Controller)**:NUTZ提供了一个简单易用的MVC实现,帮助开发者将业务逻辑、视图呈现和数据模型分离,提高代码可读性和维护性。 5. **DAO(Data Access Object)**:NUTZ的数据库访问层,提供...
Nutz是一个轻量级、高性能的Java开发框架,它提供了丰富的功能,包括MVC、ORM、DAO、AOP、IOC等,使得Java开发者能够快速地构建应用系统。本篇文章将详细探讨Nutz框架中所需的jar包以及它们在项目中的作用。 首先,...
SpringMVC与Nutz框架的结合,构建了一种高效、稳定且灵活的企业级开发平台。这个平台基于一系列成熟的技术栈,如Spring MVC、Apache Shiro、Bootstrap UI,旨在提供组织机构管理、角色用户分配、权限授权、数据权限...
4. **MVC模式**:Nutz支持Model-View-Controller架构,通过@Route注解可以定义控制器方法的URL路由,实现前后端分离。 5. **AOP(面向切面编程)**:Nutz集成的AOP功能,可以方便地进行日志记录、事务管理等通用...
作为Nutz框架的一部分,Nutz Codematic可以无缝地与其他Nutz组件(如Nutz ORM)结合使用,实现更高效的开发流程。例如,生成的JavaBean可以直接用于Nutz ORM进行数据库操作,简化数据访问层的开发。 6. **学习与...
【标题】"nutz简单综合实例"涉及到的是一个使用Nutz框架进行Web开发的应用示例,这个示例展示了如何通过HTML网页对数据库进行管理操作,实现了Model-View-Controller(MVC)、Inversion of Control(IoC)以及Data ...
将Nutz与Freemarker结合,可以实现类似Struts2中对Freemarker模板的支持,使开发者能够利用Freemarker的强大功能来构建动态网页。 首先,让我们深入了解Nutz和Freemarker的基本概念: 1. **Nutz**: - Nutz是一个...
3. **Nutz MVC**:为Web应用提供了MVC(Model-View-Controller)模式的支持,使业务逻辑、数据展示和用户交互分离,提高了代码可维护性。 在利用Nutz代码生成器时,你需要进行以下步骤: 1. **配置数据源**:设置...
标题“nutz学习资料2”表明这是一份关于Nutz框架的学习资源集合,Nutz是一个基于Java的轻量级框架,旨在提供全面的MVC支持和企业级开发工具。通过这个压缩包,我们可以期待深入理解Nutz框架的核心特性和使用方法。 ...
Nutz框架由一系列子项目组成,包括Nutz IOC(依赖注入)、Nutz DAO(数据访问对象)、Nutz MVC(模型视图控制器)等,涵盖了Web开发的多个层面,旨在简化开发流程,提高开发效率。 在"nutz框架使用手册.zip"中,...