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

nutz源码 mvc 之 视图解析

阅读更多

nutz的视图主要是通过controller的ok和fail注解来实现的。比较常用的如jsp形式,这个是默认的,还有就是json。

 

从NutServlet中的service可以看到,最终是执行ActionInvoking 的invoke方法的,我们可以在org.nutz.mvc.invoker.ActionInvokerImpl中找到这个方法的实现。

这个方法主要做了以下一些事:

 

1.设置编码

 

req.setCharacterEncoding(inputCharset);

resp.setCharacterEncoding(outputCharset);
 

2. 执行相关的filter

// Before adapt, run filter
		if (null != filters)
			for (ActionFilter filter : filters) {
				View view = filter.match(sc, req, method);
                                ........
 

3. 参数适配,nutz可以把从request里面获取的参数根据需求适配成需要的对象

Object[] args = adaptor.adapt(sc, req, resp, pathArgs);

 

4. 调用并输出view,这边可以看到我们可以不用OK来定义返回的view,直接返回一个view对象也是可以的

// 调用 module 中的方法
Object re = method.invoke(obj, args);

// 渲染 HTTP 输出流
if (re instanceof View)
     ((View) re).render(req, resp, null);
else
     ok.render(req, resp, re);

 

5. 失败处理,这个是放在catch里面的

fail.render(req, resp, e);
 

6. 清理,这个放在finally里面

if (null != reqContext)
    reqContext.depose();

 

这个方法用到了很多对象,如filter,adaptor,ok视图,fail视图。这些对象都是在构造函数ActionInvokerImpl里面设置的,《nutz源码 mvc 之 url与controller 映射》这篇blog里面提到的urls.add(makers, module)会调用这个构造函数。

我们这里先看看ok和fail视图是如何获取的。

this.ok = evalView(ioc, makers, "@Ok", method.getAnnotation(Ok.class), dftOk);
this.fail = evalView(ioc, makers, "@Fail", method.getAnnotation(Fail.class), dftFail);
 

在evalView里面就根据OK里面的内容来生成视图,一般的OK写成“jsp:jsp/hello.jsp” 这里表示生成jspView 页面为根目录下的jsp/hello.jsp。

String str = (String) Mirror.me(ann.getClass()).invoke(ann, "value");
str = Segments.replace(str, context);
int pos = str.indexOf(':');
String type, value;
if (pos > 0) {
    type = Strings.trim(str.substring(0, pos).toLowerCase());
    value = Strings.trim(pos >= (str.length() - 1) ? null : str.substring(pos + 1));
} else {
    type = str;
    value = null;
}
for (ViewMaker maker : makers) {
    View view = maker.make(ioc, type, value);
    if (null != view)
        return view;

 

ViewMaker 默认的都是采用DefaultViewMaker实现,这个是系统默认实现。里面的代码就是根据type来生成具体的view。nutz本身提供了JspView,UTF8JsonView,HttpStatusView,ServerRedirectView,ForwardView,RawView这几个实现,大体上可以满足需要了,但是缺少了对于tiles和siteMesh这类流行的页面组织框架的支持,这点上我觉得Nutz作为java web开发的一套整体解决方案是必须要考虑的。

以JspView为例,它其实是继承了ForwardView,而ForwardView的实现如下:

 

public void render(HttpServletRequest req, HttpServletResponse resp, Object obj)
			throws Exception {
		// Store object to request
		if (null != obj)
			req.setAttribute(DEFAULT_ATTRIBUTE, obj);
		// Check path
		String thePath = path;
		if (Strings.isBlank(thePath)) {
			thePath = Mvcs.getRequestPath(req);
			thePath = "/WEB-INF/" + Files.renameSuffix(thePath, getExt());
		}
		RequestDispatcher rd = req.getRequestDispatcher(thePath);
		if (rd == null)
			throw Lang.makeThrow("Fail to find Forward '%s'", thePath);
		// Do rendering
		rd.forward(req, resp);
	}
 

 

 

 

 

分享到:
评论

相关推荐

    TT随笔五 Nutz自定义视图以及提示信息的统一管理

    1. 视图解析:在Nutz MVC中,当控制器方法执行完毕后,通常会返回一个视图名,Nutz MVC会根据这个视图名来决定如何渲染页面。默认情况下,Nutz会尝试将视图名解析为一个JSP或者FreeMarker模板文件。然而,开发者可能...

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

    在本文中,我们将深入探讨如何使用Nutz框架创建一个简单的MVC(模型-视图-控制器)应用程序。Nutz是一个轻量级、高效的Java开发框架,适用于快速构建Web应用。我们将通过一个名为"HelloNutz1"的示例项目,学习如何在...

    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 例子,从mvc ioc 到数据插入

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

    wendal-nutz-master.zip

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

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

    IoC,即反转控制,是Spring框架的核心概念之一,但Nutz也实现了类似的功能。在Nutz中,IoC容器负责对象的创建和管理,使得开发者可以声明依赖关系,而不是在代码中直接实例化对象。这样提高了代码的可测试性和可维护...

    新框架Nutz

    同时,Nutz.mvc的配置也是通过Nutz.Ioc进行管理的,意味着控制器、视图和服务等组件都支持依赖注入,并且可以将它们的状态存储在数据库或JSON文件中。此外,Nutz.mvc还提供了权限检查、文件上传和下载等Web应用常用...

    nutz学习资料2

    1. **MVC模式**:Nutz提供了MVC架构支持,允许开发者将业务逻辑、视图和控制逻辑分离,便于维护和扩展。 2. **IoC(Inversion of Control)**:Nutz实现了依赖注入,有助于降低代码间的耦合度,提高组件的可重用性。...

    nutz学习资料4

    6. **源码解析**:深入到Nutz的源代码中,分析其设计模式和关键算法,帮助理解Nutz的运行原理。 7. **调试与优化**:如何对Nutz项目进行调试,以及性能优化的技巧和策略。 以上内容都是Nutz学习过程中可能涵盖的...

    nutz-master

    1. **MVC框架**:Nutz提供了基于注解的MVC模型,使得控制器(Controller)、视图(View)和模型(Model)的划分更为清晰。开发者可以通过注解轻松定义路由、参数绑定和异常处理,极大地提高了开发效率。 2. **DAO...

    nutzdemo

    2. **MVC模式**:Nutz支持MVC架构,学习如何在Nutz中实现模型、视图、控制器的分离,理解路由、控制器方法绑定和视图渲染。 3. **数据库操作**:Nutz的Ioc容器和Dao模块提供了方便的数据访问接口,了解如何进行SQL...

    NutzCN社区

    NutzCN社区的源码可能采用了Nutz MVC来构建Web应用。MVC模式将应用程序分为模型(Model)、视图(View)和控制器(Controller)三个部分,有助于分离关注点,提高代码的组织结构。 5. Web开发实践: 通过分析源码...

    nutz新框架,可替代ssh

    1. **MVC框架**:Nutz提供了类似Struts的MVC(Model-View-Controller)架构,但设计更为简洁,使得控制器(Controller)和视图(View)的分离更加清晰,同时降低了学习和使用成本。 2. **IOC容器**:Nutz的依赖注入...

    Nutz+ExtJS示例教程——后台Service实现

    它提供了丰富的组件库,如表格、表单、面板等,以及强大的数据绑定机制和模型-视图-控制器(MVC)架构。 5. **ExtJS与Nutz的交互** 在前端,我们可以使用ExtJS的Ajax组件,如`Ext.Ajax.request`,来发送HTTP请求到...

    JAVA上百实例源码以及开源项目源代码

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!...

Global site tag (gtag.js) - Google Analytics