精华内容
下载资源
问答
  • WebForms VS MVC

    2016-04-04 14:34:00
    介绍 我做为一名ASP.NET开发人员已经有...2008年,Microsoft首次发布ASP.NET MVC框架。我非常惊讶“为什么需要另一个ASP.NET技术框架”并且很多人和我拥有相同的想法。 很多人说ASP.NET MVC框架将取代ASP.NET W...

    介绍

             我做为一名ASP.NET开发人员已经有很长时间了,并且我非常乐意使用ASP.NET Web Forms开发web应用程序。

             在2008年,Microsoft首次发布ASP.NET MVC框架。我非常惊讶“为什么需要另一个ASP.NET技术框架”并且很多人和我拥有相同的想法。

             很多人说ASP.NET MVC框架将取代ASP.NET Web Forms框架,但是这不是真的。它们各有各的优点和缺点,没有人告诉或教我们什么场景使用哪一种架构,但是我们可以讨论一些事实,这将帮助我们选择最适合项目需求的框架。

     

     

    我们将一起尝试找到一些问题的答案,比如

    l  什么是ASP.NET?

    l  什么是ASP.NET Web Forms?

    l  什么是MVC?

    l  什么是ASP.NET MVC?

     

    如果你是高级或经验丰富的ASP.NET MVC 开发人员,那么你已经知道MVC非常棒了,而这篇文章将帮助你温故这些概念。

     

    讨论内容

     

    提纲

    ü  可视化技术

    ü  Web技术

    ü  Web可视化技术

    ü  什么是ASP.NET?

    ü  什么是Web Forms?

    ü  ASP.NET 4.0

    ü  什么是MVC?

    ü  什么是ASP.NET MVC?

    ü  ASP.NET MVC 是如何工作的?

    ü  什么是ASP.NET Web Forms框架以及什么是ASP.NET MVC框架?

     

     

    1. 可视化技术

     

             微软提出了所谓的“可视化”技术,在这种技术的帮助下微软能快速开发图形用户应用程序。像拖拽和智能提示的特征让开发人员能更关注应用程序的业务功能的实现而不是UI设计。

     

    1. Web技术

    当前比较经典的web技术有:asp,php,jsp,ror,asp.net web forms,asp.net MVC等等。asp是微软引入的一个经典的web技术,asp最大的问题是混乱的code布局和糟糕的可维护性。

    我们假设一个场景,你有一些文本和一个按钮,在按钮点击时在服务器验证数据,如果验证成功就存入数据库,如果验证失败就在表单上用红色标签显示错误信息。你知道这个场景最大的问题是什么吗?你必须自己做很多东西来实现这个效果。

    1)         首先,你要设置表单的action属性,让其指向当前页本身。

    2)         文本框的值将在点击按钮后会自动清空,所以只能自己尝试从提交的数据中恢复。

    3)         如果服务器验证失败,你必须

    a)         从提交的数据中提取相应值设置到对应的文本框中;

    b)         显示错误信息;

    (使用Ajax异步提交是另一种实现方式,但是这里我是为了解释在经典的asp技术中需要耗费大量的人工操作)

     

    1. Web可视化技术

    像Visual Basic技术仅限于单独的应用程序,当涉及到网络,就只有选择微软经典的asp。

     

             当我们讨论Web应用程序和Winform应用程序时,有两个事是应该考虑的:

    1)         状态管理如何工作?

    2)         请求/响应如何工作?

     

    Web应用程序遵循HTTP协议。http协议是无状态的,即同一个客户端的这次请求和上次请求是没有对应关系的,对http服务器来说,它并不知道这两个请求来自同一个客户端。与Winform应用程序不同,没有变量将被保存,也没有完整的事件驱动编程模型。与Winform应用程序相同的是需要等待用户输入,但每个用户的输入和交互将做为一个新的请求(get/post)发送到服务器。

    最终,微软提出了所谓的ASP.NET Web Forms框架,充分考虑了应用程序快速开发的需求和简单易学性。

     

    1. 什么是ASP.NET?

    ASP.NET是Microsoft的web应用程序框架,由公用语言运行库(CLR,Common language runtime)的C#或VB.NET等程序语言构建的动态web站点。它支持两种模式:Web Forms和ASP.NET MVC.

     

     

    1. 什么是Web Forms?

    Microsoft发布的ASP.NET,通过在web的无状态和为开发人员模拟状态的模型上创建更高层次的抽象解决了asp中存在的很多问题。在web forms框架中引入一些新概念比如:“self postback”(提交表单数据到本页)、“ViewState”(在postback回调期间维护视图状态)等。在web forms框架,微软已尝试将可视化模型引入到web应用程序开发中。

     

            

    让我们来讨论下Web Forms框架的优缺点:

    1)         优点:

    a)         Web Forms支持丰富的服务器控件

     

    使用单纯的HTML客户端控件时,你可能会注意到在浏览器终端控件的展现并不总是一致。比如:一个UI在IE浏览器中看起来非常棒,但在Firefox浏览器中却很糟糕。ASP.NET服务器控件会检测到浏览器种类并生成对应的html和javascript。

    很多服务器控件像GridView和ListView可以绑定数据,从而减少了大量的代码编写。

    b)         支持视图状态

    你可能听说过几次“HTTP是无状态的协议”。通常在多个请求之间控件不会保持控件值。但是在Web Forms框架中通过将每个控件状态以“隐藏域”的形式存在当前表单页面来达到“有状态”,这就是视图状态。

    c)         事件驱动编程

     

    它为我们提供:

    l  Code-Behind (代码后植)技术           在ASP.NET中通过ASPX页面指向CS文件的方法实现显示逻辑和处理逻辑的分离,这样有助于web应用程序的创建。比如分工,美工和编程的可以个干各的,不用再像以前asp那样后台代码和html代码都混在一起,难以维护。

    l  自动回发机制(Self postback mechanism)

    l  ViewState(视图状态)

     

    开发人员不再依赖POST,GET方法来处理用户与服务器之间的交互,eg:可以拖控件放到页面上(比如按钮),只需要双击控件以生成对应的后台代码以在服务器上处理用户的点击逻辑。

    d)         快速应用程序开发

    丰富的服务器控件,事件驱动模型和视图状态都很大程度上增加了开发速度,开发者将透明化这背后复杂的实现,从而能更关注应用程序的业务逻辑。

    e)         学习成本低

    使用强大的服务器控件和视图状态的开发者,可以开发实用的应用程序而不需要太多HTML和Javascript技能。

     

    2)         缺点

    a)         项目架构

    当你创建Web Forms应用程序时,没有预定义的项目架构。开发者可以灵活的选择他们想要的项目架构。你可以选择基本的三层架构来将系统分成表现层(UI)、业务逻辑层(BLL)、数据层(DAL)或者更先进的MVP(Model-View-Presenter)架构。你也可以选择只使用code-behind技术,将所有逻辑都写在这,但这并不是一个好的项目架构方案。

    b)         单元测试

    在Web Forms架构的code-behind技术中,使用了大量的事件处理函数,让其不可能进行自动单元测试。

    注意:据我所知,即使借助模拟测试(MOQ或rhinomoq)也不能模拟事件处理程序中的“sender”和“eventargs”两个对象。

    重要的是,现在测试驱动开发和单元测试变得越来越重要了。

     

    c)         性能

    ViewState成功的解决了经典的ASP程序中的一些问题,但也引入了另一些问题。ViewState存储在页面本身,这样增加了页面的大小降低了程序性能。

    d)         可重用性

     

    让我们讨论另一个示例,我们构建两个UI

    l  纳税员工页面

    l  非纳税员工页面

    现在这两个页面将共用大部分后台业务逻辑。创建一个页面后,通过添加一些if判断条件创建第二个页面。 

    这将违反程序设计的单一职责原则,即一个类,只有一个引起它变化的原因。应该只有一个职责。每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性。例如:要实现逻辑和界面的分离。

    e)         不能完全控制HTML

    Web Forms架构中,很多时候我们无法确定服务器控件在终端浏览器中生成的html,这样很难集成第三方JavaScript 库,如jQuery。

    f)          SEO

    URL指向特定的ASPX页面,可能还包含一些查询字符串。这样对于搜索引擎来说是不友好的。更详细请看:《更友好的网站url设计》

    g)         缺少并行开发支持

    ASPX页面和后台代码文件是紧密耦合的,所以不方便2个开发者同时开发页面和后台代码。

     

    1. ASP.NET 4.0

    ASP.NET 4.0 发布了一些新特性来解决上面提到的一些问题。

    1)         ViewState:提供禁用或控制视图状态大小的功能。

    2)         URL路由:使用URL路由功能,我们能提供自己的URL来代替页面的物理路径。

    3)         ID:在ASP.NET4.0中,我们能更好的控制元素的ID属性,以便更好的与其他JavaScript库集成。(不过,我们任然不能完全控制HTML元素的生成)

    尽管在ASP.NET4.0大幅度改进后:

    1)         任然不能解决单元测试的问题。

    2)         我从未见过使用ASP.NET Web Forms架构的开发者会尝试禁用ViewState。(这是个人看法)

    3)         我们能控制元素的ID属性,但是不能完全控制HTML如何生成,所以任然存在结合第三方JavaScript库编程的一些困难。

     

    1. 什么是MVC?

    MVC是一个架构模式,现在已经很多地方使用了。

    很多人在Java中使用它。微软将它引入到ASP.NET MVC架构中。我们今天就来讨论ASP.NET MVC架构,但在此之前我们先了解一些MVC中的术语。

    1)         模式:其实就是解决某一类问题的方法论。把解决某类问题的方法总结归纳到理论高度,那就是模式。模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果。而且会得到解决问题的最佳办法。

    2)         架构模式:架构模式也叫架构风格,一个架构模式描述软件系统里基本的结构组织或纲要,是从子系统级别或模块级别解决我们的问题。我们常常需要构建类库、组建、Web Services等。

    3)         MVC:当我们谈论到应用,就有输入逻辑,业务逻辑,UI逻辑等元素。MVC就是一个架构模式,它让我们在开发应用程序时能将这些逻辑元素保持松散耦合。

    MVC模式的主要意图是分离关注点,它使的展示或UI 与业务或用户交互逻辑分离。

    MVC系统应该分为M(Model),V(View) 和 C(Controller)。

     

    l  Model,被定位为智能或手动的业务规则、逻辑、数据,它独立于MVC的View和Controller部分。

    l  Controller,接收并分配用户交互逻辑或输入逻辑发出的请求,它需要知道MVC的Model和View。

    l  View,被定位为模型数据的输出表现,它可能是一个excel表格,一个显示记录列表的web页面或一个简单的文本。它只需要知道MVC的Model。

     

    1. 什么是ASP.NET MVC?

     

    ASP.NET MVC是微软发布的,用于设计低耦合、可测试的web应用程序框架,它是基于CLR和成熟的MVC架构构建的。ASP.NET MVC不支持ViewState和服务器控件,所以你可能认为又回到了麻烦的原生web应用程序开发。但不是,让我们来讨论下ASP.NET MVC框架的优缺点:

     

    优点:

    1)         项目架构

    ASP.NET MVC架构降低了程序间的耦合性,即M(model)、V(View)、C(Controller)。如图:

     

    2)         测试驱动开发和重用性

    a)         MVC的Controller,是一个独立的类,所以支持测试驱动开发。

    b)         MVC的Controller,不绑定任何特定的View,所以能重用于多个View。

     

    3)         性能

    ASP.NET MVC框架不支持ViewState,所以不会有自动状态管理机制,从而降低了页面传递的尺寸,提高了程序性能。

    4)         完全的HTML控制

    ASP.NET MVC 不支持服务器控件,唯一的选择是使用客户端输入控件,这样我们能完全控制最后展现的html。所以ASP.NET MVC 架构能很容易的与第三方JavaScript库(eg:Jquery)集成开发。

    5)         支持并行开发

    ASP.NET MVC架构中的各层是松散耦合的,所以一个开发者在开发Controller的同时第二个开发者开发View并且第三个开发者开发Model。这就是所谓的并行开发。

    6)         SEO,URL重写和REST

    丰富的路由规则让每个URL被视为一个资源,即支持RESTful

     

    同时,用户用好的、可读的URL能改善SEO。

    7)         可扩展的

    ASP.NET MVC支持多种视图引擎,eg:aspx、razor,如果需要还能开发自己的视图引擎。

    8)         继承ASP.NET特性

    ASP.NET MVC框架构建在成熟的ASP.NET框架之上,所以提供开发者很多好功能,如表单验证、windows身份验证、缓存、会话等等。

    缺点:

    1)         提高了学习成本

    没有事件驱动编程模型和视图状态,使得对于缺少web应用开发经验的开发者来说很难上手。

     

    1. ASP.NET MVC 是如何工作的?

     

    1)         用户通过浏览器URL向服务器请求一些资源。(GET请求)

    2)         路由引擎首先将这个请求传递给对应的Controller。

    3)         如果需要持久化数据,Controller就从Model中获得数据。

    4)         Model访问数据库数据(或其它一些数据资源)并返回数据给Controller。

    5)         Controller将选择适当的View。

    6)         Controller将数据(第四部获取的model)传递给页面(第五部获取的view),数据将填充到页面的指定位置。

    7)         Controller将View返回并呈现给用户。

     

    这是一个GET请求,POST请求的流程类似。唯一不同的是:不是通过在浏览器中输入url触发,而是在页面上做一些操作(eg:点击按钮、改变下拉选项等等)来触发POST请求。

     

             有园友看的好仔细,我都没注意到...哈哈...不改变原来译文了,就在此进行说明吧。

          

     

    1. 什么是ASP.NET Web Forms框架以及什么是ASP.NET MVC框架?

    哪一个才是“最佳选择”?特定的解决方案依赖于应用程序的需求和团队成员的技术背景。当你面临必须在 ASP.NET Web Forms框架和 ASP.NET MVC框架中选择一个的时候,你要明白最重要的权重不是技术,而是其他的。当你做选择时,你需要考虑的两个重要因素:

    1)         快速应用程序开发

    如果你想快速开发任何web程序,那么ASP.NET Web Forms框架是你唯一的选择,你甚至无需考虑如何让 ASP.NET MVC框架快速开发程序。(选择ASP.NET Web Forms框架的原因:需求为快速开发的程序,客户一般不会支付太多money;或者应用程序只使用一、俩个月并且不再需要继续维护的项目)

    2)         单元测试

    如果自动单元测试对你来说非常重要,那么最好选择ASP.NET MVC框架。

     

    除了这些,你能做的是:写下你的项目需求并试图比较ASP.NET Web Forms框架和 ASP.NET MVC框架的优劣。如果可能,就尝试问自己下面这些问题:

    1)         你的团队是否在Web Forms框架或Windows Forms框架上拥有丰富的开发经验?

    如果是,那么学习ASP.NET MVC框架对于团队来说可能是一项乏味的任务。因为开发者已经习惯使用ViewState和事件驱动的编程模型,思维的改变将是一个困难的任务。------ Web Forms框架获得一票。

    2)         你的团队是否在ASP.NET MVC框架上拥有丰富的开发经验?

    如果是,请选择MVC框架。------ ASP.NET MVC 框架获得一票。

    3)         你的团队是否在ASP或非微软技术(如android、ios、jsp、ror、php等)上拥有丰富的开发经验?

    如果你曾使用过JSP或ASP,你可能熟悉HTTP的get和post请求,甚至你可能手写过使用MVC模式的代码,因为这些技术当中大部分都默认使用MVC模式。------ ASP.NET MVC 框架获得一票。

    4)         是否会大量使用JavaScript?

    如果是,选择MVC框架更合适,因为它能完全控制页面的HTML。------ ASP.NET MVC 框架获得一票。

    5)         寻找更好的性能

    不支持ViewState机制的 ASP.NET MVC 框架比ASP.NET Web Forms 框架能提供更好的性能。ASP.NET MVC 框架获得一票。

    6)         计划重用相同的输入逻辑

    如果是,请选择MVC框架。------ ASP.NET MVC 框架获得一票。

    转载于:https://www.cnblogs.com/dekevin/p/5351994.html

    展开全文
  • WebMVC和Spring MVC框架 WebMVC的基本任务 我们先来说一下WebMVC框架的基本任务。在Web应用中,前台负责捕捉用户的动作、展示系统的一般界面和处理结果,后台则主要...这个目的的基础上,我们先来看看Java技术下的...
        

    WebMVC和Spring MVC框架

    WebMVC的基本任务

    我们先来说一下WebMVC框架的基本任务。在Web应用中,前台负责捕捉用户的动作、展示系统的一般界面和处理结果,后台则主要负责系统的逻辑层面的处理,前台和后台一起为系统和用户的交互、数据的处理服务,并最终构建出完整的Web应用。
    在这个目的的基础上,我们先来看看Java技术下的Web应用的早期是怎么处理这个问题的。

    1.servlet时期:Web请求通过前端的html页面提交到后台servlet,servlet对请求进行处理、运行相关逻辑,通过输出html语句生成展示处理结果的页面回到前端,用户和系统之间的交互建立在繁琐的Web页面的生成基础上。
    2.jsp(Java Server Page)时期:Web请求通过前端的jsp页面提交到后台逻辑的servlet或者jsp处理单元(jsp页面和servlet没有本质区别,前者执行的时候是会被编译成后者的),后台处理后处理结果放入相应的http请求数据保存区,再将这个Web请求转发到某个事先写就的jsp页面,jsp页面把需要的数据写入到自身并展示出来(在服务器后台实际上还有这样自动完成的步骤:编译成临时servlet,再通过输出html语句生成展示处理结果的页面回到前端)。这样系统的后台是建立在功能不甚清晰的servlet和jsp处理单元之上的。
    3.servlet+jsp时期:这是MVC思想在Web开发中的起点。servlet只被当作后台处理单元,而jsp页面只被当作前台展示和交互页面而不参与后台逻辑处理。Web请求通过jsp页面提交到后台,后台servlet则负责处理逻辑,后台处理后处理结果放入相应的http请求数据保存区,再将这个Web请求转发到某个事先写就的jsp页面,jsp页面把需要的数据写入到自身并展示出来。和jsp时期虽然看似相同,但是由于清楚划分了servlet的controller控制器作用、jsp的view视图的作用,(当然在后台还有model数据模型),使得Web开发能够结构化地进行,系统层次也更为清晰。

    那么我们来说明一下究竟什么是Web的MVC架构(当然除了在Web领域,大多数的用户系统交互中都会有MVC架构的影子)。M(Model数据模型)V(View视图)C(Controller),是Web应用的开发策略和Web应用实际运行的基本模型,大体说来就是这样的过程:请求通过V发送到后端C,C接收到请求后选择适当的M进行数据处理,处理完毕后C选择合适的V进行展现。
    这个模型称为JSP Model2,是MVC模型的基本原理,如下图所示:

    clipboard.png

    Spring MVC框架的区别和优势

    如上所述的基本MVC框架看起来已经满足我们的一半需求了,那么我们所说的使用包括像Spring MVC这样的WebMVC框架有什么好处呢?

    在JSP Model 2 这个经典WebMVC模型里面,我们的serlet和Web请求是一一映射的并且硬配置在Web应用的配置文件中的,因此系统的需求增加导致映射关系的增加再导致Web应用本身的体积增加,缺乏一般性、易管理性和可重用性。这样的问题势必会增加系统的维护难度。
    所以,使用一个集中控制器对Web请求进行分析并且选择合适的逻辑处理Controller来处理Web请求,将硬编码在配置文件中的映射关系写在这个集中Controller中,这种做法仍然会使得硬编码的问题,只不过是把硬编码转向了集中Controller中。

    Spring MVC在Web请求和我们所说的这个控制器Controller之间使用了一个非常关键的节点--前置控制器(Front Controller),前置控制器的作用是接收所有的Web请求并将请求派发到不同的页面控制器(Page Controller),而页面控制器就是我们前面所说的这种一般意义上的Controller,亦即真正进行后段页面处理逻辑的控制器。由于引入了新的映射处理器、页面渲染器等,存在于JSP Model 2的耦合和硬编码问题能够得以解决,另外加上Spring自身的IOC特性,可以将组件在容器启动的时候就注入,实现组件的初始化前置。
    如下图所示为Spring MVC的模型情况:

    clipboard.png

    Spring MVC框架的IOC加载原理

    Spring MVC结合Spring自身的特性和WebMVC的模型,能够将Web应用的开发实现得更简洁轻快,使得可复用性得到更好的发展。下面是Spring MVC的几个重要角色:

    DispatcherServlet(前置控制器):将Web请求统一发送至此,把请求发送至HandlerMapping
    HandlerMapping(映射处理器):接收请求并分析请求-处理器映射关系,把请求发送到Controller
    Controller(页面控制器):接收被派发的请求,真正处理业务逻辑,并将处理数据发往ViewSolver
    ViewResolver(视图配发器):统一的视图配发器和具体的视图模版技术无关,按照视图配发器的配置项将数据添加到指定视图模版技术的View中
    View(视图):真正展现数据的页面视图
    这些角色参与整个WebMVC的流程如图所示:

    clipboard.png

    在知晓了这些角色之后我们再来说SpringMVC的这些角色在Web容器中的初始化过程,在这里我们使用一个相对有通用性的例子来说明其中非常重要的组件:

    ROOT WebApplicationContext 和 ContextLoaderListener

    像所有的Spring IOC容器启动注入业务组件一样,Spring MVC框架也有一个主要的IOC容器用于加载注入组件,这个IOC容器就是顶层的ROOT WebApplicationContext,它通过默认位置在/WEB-INF路径下的applicationContext作为配置文件来进行加载,加载的契机当然在Web应用启动的时候,因此我们需要在作为这个Web应用的整体描述文件web.xml定义一个监听器ContextLoaderListerner,监听器在Web应用启动之后加载ROOT WebApplicationContext,加载的WebApplicationContext中主要会注入DAO、Services和数据源这些业务对象。

    Spring WebApplicationContext 和 DispatcherServlet

    在SpringMVC架构中加入了一个为SpringWeb应用层组件打造的IOC容器,我们不妨称之为Spring WebApplicationContext,这个IOC容器是ROOT WebApplicationContext的子容器,换言之,它是可以访问到父容器中的注入对象的,也因此,其中注入的页面控制器对象Controller可以注入父容器中已经注入的Services和DAO对象。同样的,我们需要在web.xml中定义一个前置控制器servlet DispatcherServlet来接管所有符合定义的Web请求,并通过默认位置在/WEB-INF路径下的<servlet-name>-servlet作为配置文件来加载Spring WebApplicationContext,这个IOC容器存在的意义在于区分ROOT IOC和Spring IOC的职责需要,主要注入Controller,HandlerMapping,ViewResolver等SpringWeb层服务组件。

    解释了对SpringMVC架构至关重要的两个IOC容器和加载它们的组件、IOC的注入配置文件和注入的组件类型,我们来看看在具体的SpringMVC项目中是怎么写的。

    Spring MVC框架的使用

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app...>
        <!--启动监听器加载ROOT WebApplicationContext-->
        <listener>
            <listener-class>
                org.springframework.Web.context.ContextLoaderListener
            </listener-class>
        </listener>
        <!--前置控制器加载Spring WebApplicationContext-->
        <servlet>
            <servlet-name>
                springDispcher
            </servlet-name>
            <servlet-class>
                org.springframework.Web.servlet.DispatcherServlet
            </servlet-class>
            <load-on-startup>2</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>
                springDispcher
            </servlet-name>
            <url-pattern>
                *.do
            </url-pattern>
        </servlet-mapping>
    </web-app>
    

    /WEB-INF/applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans...>
        <bean id="someService" class="org.myconmpany.service.SomeService">
        </bean>
        <bean id="someDao" class="org.myconmpany.dao.SomeDao">
        </bean>
    </beans>
    

    /WEB-INF/springDispatcher-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans...>
        <bean id="handlerMapping" class="org.springframework.Web.servlet.handler.BeanNameUrlHanlerMapping">
        </bean>
        <bean name="/someLink.do" class="org.myconmpany.controller.SomeController">
        </bean>
        <bean id="viewResolver" class="org.springframework.Web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/*"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    </beans>
    

    这就是Spring MVC的基本概况,但是在精简的开发过程中我们更倾向于使用Spring为我们准备的基于注解的开发,这样做可以大大减少配置文件的规模,让Spring为我们自动完成一些机械性的工作。

    展开全文
  • Stimulsoft Reports.Web,是一...web项目技术框架mvc4+easyui+knockoutjs 1.项目中添加引用 Stimulsoft.Base.dll, Stimulsoft.Report.dll, Stimulsoft.Report.Web.dll, Stimulsoft.Report.WebDesign.dll 2....

    Stimulsoft Reports.Web,是一款可以直接在Web中编辑报表的报表工具

    web项目技术框架mvc4+easyui+knockoutjs

    1.在项目中添加引用

    Stimulsoft.Base.dll,

    Stimulsoft.Report.dll,

    Stimulsoft.Report.Web.dll,

    Stimulsoft.Report.WebDesign.dll

    2.定义模板文件:新建web窗体文件report.aspx

    前台代码:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="report.aspx.cs" Inherits="PE.IEM.Web.report" %>
    <%@ Register  Namespace="Stimulsoft.Report.Web" TagPrefix="cc1"  Assembly="Stimulsoft.Report.Web, Version=2012.3.1500.0, Culture=neutral, PublicKeyToken=096a9279a87304f1"%>
    <%@ Register  Namespace="Stimulsoft.Report.Web" TagPrefix="cc2"  Assembly="Stimulsoft.Report.WebDesign, Version=2012.3.1500.0, Culture=neutral, PublicKeyToken=096a9279a87304f1"%>
    
    <!doctype html>
    <html>
        <head runat="server">
            <title></title>
        </head>
        <body style="background-color: #e8e8e8">
            <form id="form1" runat="server">
            <div style="width: 960px;margin: 0 auto;">
                <cc1:StiWebViewer ID="StiWebViewer1" runat="server"  GlobalizationFile="/Content/page/reports/Localization/zh-CHS.xml" ShowDesignButton="True"  onreportdesign="StiWebViewer1_ReportDesign" Theme="Office2010"  BackColor="#e8e8e8"/>
                <cc2:StiWebDesigner ID="StiWebDesigner1" runat="server" LocalizationDirectory="/Content/page/reports/Localization/" Localization="zh-CHS" onsavereport="StiWebDesigner1_SaveReport" />
            </div>
            </form>
        </body>
    </html>

    后台代码:

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.IO;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Stimulsoft.Report;
    
    namespace PE.IEM.Web
    {
        public partial class report : System.Web.UI.Page
        {
            /// <summary>
            /// 将获取的报表放在阅读器中显示
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void Page_Load(object sender, EventArgs e)
            {
                StiWebViewer1.Report = GetReport();
            }
    
            /// <summary>
            /// 编辑报表
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void StiWebViewer1_ReportDesign(object sender, EventArgs e)
            {
                StiWebDesigner1.Design(GetReport());
            }
    
            /// <summary>
            /// 保存报表
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            protected void StiWebDesigner1_SaveReport(object sender, Stimulsoft.Report.Web.StiWebDesigner.StiSaveReportEventArgs e)
            {
                var report = e.Report;
                report.Save(GetReportPath());
            }
    
            /// <summary>
            /// 获取报表
            /// </summary>
            /// <returns></returns>
            private StiReport GetReport()
            {
                var report = new StiReport();
                //根据路径加载报表文件
                report.Load(GetReportPath());
                //动态改变数据库连接
                ChangeConnectString(report);
                //设置参数等
                report.Compile();
                SetReportParamaters(report);
               
                return report;
            }
    
            private void SetReportParamaters(StiReport report)
            {
                var dataSource = report.CompiledReport.DataSources;
                foreach (Stimulsoft.Report.Dictionary.StiDataSource ds in dataSource)
                {
                    var param = Request.QueryString;
                    foreach (string key in param.Keys)
                    {
                        if (!ds.Parameters.Contains(key)) continue;
                        var p = ds.Parameters[key];
                        var v = param[key];
                        p.ParameterValue = v;
                    }
                }
            }
    
            private string GetReportPath()
            {
                var path = String.Format("~/Areas/{0}/Reports/{1}.mrt",Request["area"], Request["rpt"]);
                path = Server.MapPath(path);
                if (!System.IO.File.Exists(path))
              //如果报表文件不存在,返回默认的报表文件 path
    = Server.MapPath("~/Content/page/reports/helloworld.mrt"); return path; } private void ChangeConnectString(StiReport report) { foreach (Stimulsoft.Report.Dictionary.StiSqlDatabase item in report.Dictionary.Databases) { var prefix = item.Name.Split('_')[0]; item.ConnectionString = ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString; } } } }

     

    就是把阅读器和编辑器放在模板中

    3.注册路由:在App_Start文件夹的RouteConfig中注册报表模板访问路径

    routes.MapPageRoute("Report", "report", "~/Content/page/report.aspx");

    4.js调用:调用报表模板访问路径并传递2个参数,根据传递的参数去查找并加载指定报表文件

    this.printClick = function () {
       parent.wrapper.addTab.apply(this,{
    '打印报表', '/report?area=XX&rpt=helloworld', 'icon-printer_color'});
    };

    5.效果展示

    转载于:https://www.cnblogs.com/mora1988/p/5714817.html

    展开全文
  • web初学之MVC

    2016-02-08 22:26:00
    之前对JavaEE的MVC模式有些许...JavaEE技术在设计程序时,一般会把程序的结构设计成三层。 ●表示层—用户界面和用于生成界面的代码组成。 ●中间层—系统的业务和功能代码。 ●数据层—完成存储数据库的数据和...

          之前对JavaEEMVC模式有些许了解,但一直没有很好的掌握,在读代码时候也很模糊不清。因此对MVC又通过各种资料有了全面的理解。

    一.首先,需要从了解JavaEE技术开始。JavaEE技术在设计程序时,一般会把程序的结构设计成三层。

         ●表示层—用户界面和用于生成界面的代码组成。

         ●中间层—系统的业务和功能代码。

         ●数据层—完成存储数据库的数据和对数据进行封装。

    基于这种程序结构,有了MVCM即为数据层,包括各种JavaBean以及数据库工具。V即为表示层,通常为JspHTML页面,显示在客户端。C即为中间层,一般为Web层的Servlet组件,由它来处理客户端的各种请求以及数据。

    二.MVC的简单应用:

    1)Eclipse中的创建项目,项目名chapter11

    2)模型实体Student

     1 package com.chapter11.bean;
     2 
     3 import java.sql.Date;
     4 
     5 public class Student {
     6     private int id;
     7     private String name;
     8     private Date birthday;
     9     public int getId() {
    10         return id;
    11     }
    12     public void setId(int id) {
    13         this.id = id;
    14     }
    15     public String getName() {
    16         return name;
    17     }
    18     public void setName(String name) {
    19         this.name = name;
    20     }
    21     public Date getBirthday() {
    22         return birthday;
    23     }
    24     public void setBirthday(Date birthday) {
    25         this.birthday = birthday;
    26     }
    27     
    28 
    29 }
    JavaBean

    3)数据库连接工具JdbcUtil

     1 package com.chapter11.util;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.ResultSet;
     6 import java.sql.Statement;
     7 
     8 public class JdbcUtil {
     9     static{
    10         try{
    11             Class.forName("com.mysql.jdbc.driver");
    12         }catch(Exception e)
    13         {
    14             e.printStackTrace();
    15         }
    16     }
    17     public static Connection getConnection()
    18     {
    19         Connection con=null;
    20         try{
    21             con=DriverManager.getConnection("jdbc:mysql://localhost:3306/sms","root","hanzhao1024");
    22         }catch(Exception e){
    23             e.printStackTrace();
    24         }
    25         return con;
    26     }
    27 
    28     public static void release(Connection con,Statement stmt,ResultSet rs)
    29     {
    30         try{
    31             if(rs!=null)
    32             {
    33              rs.close();
    34             }
    35             
    36         }catch(Exception e)
    37         {
    38             e.printStackTrace();
    39             }
    40         try{
    41             if(stmt!=null)
    42             {
    43              stmt.close();
    44             }
    45             
    46         }catch(Exception e)
    47         {
    48             e.printStackTrace();
    49             }
    50         try{
    51             if(con!=null)
    52             {
    53              con.close();
    54             }
    55             
    56         }catch(Exception e)
    57         {
    58             e.printStackTrace();
    59             }
    60         
    61     }
    62     public static void printRs(ResultSet rs)
    63     {
    64         StringBuffer sb=new StringBuffer();
    65         try{
    66             while(rs.next())
    67             {
    68                 sb.append("id="+rs.getInt(1)+"");
    69                 sb.append("name="+rs.getString(2)+"\n");
    70             }
    71             System.out.println(sb.toString());
    72             
    73         }catch(Exception e)
    74         {
    75             e.printStackTrace();
    76         }
    77         
    78     }
    79 
    80 }
    JdbcUtil

    4)数据访问层接口StudentDao

     1 package com.chapter11.dao;
     2 
     3 import java.sql.SQLException;
     4 import java.util.List;
     5 import java.sql.SQLException;
     6 
     7 import com.chapter11.bean.Student;
     8 
     9 public interface StudentDao {
    10     public void insertStudent(Student stu)throws SQLException;
    11     public List queryAllStudents()throws SQLException;
    12     
    13 
    14 }
    StudentDao

    5)数据访问层接口实现类StudentDaoImpl

     1 package com.chapter11.dao;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 import java.sql.SQLException;
     7 import java.util.ArrayList;
     8 import java.util.List;
     9 import com.chapter11.bean.Student;
    10 import com.chapter11.util.JdbcUtil;
    11 
    12 public class StudentDaoImpl implements StudentDao {
    13 
    14     Connection con=null;
    15     public StudentDaoImpl(Connection con)
    16     {
    17         this.con=con;
    18     }
    19     PreparedStatement pstmt=null;
    20     ResultSet rs=null;
    21     public void insertStudent(Student stu)throws SQLException
    22     {
    23         String sql="insert into student(name,birthday) value(?,?)";
    24         pstmt=con.prepareStatement(sql);
    25         pstmt.setString(1, stu.getName());
    26         pstmt.setDate(2, stu.getBirthday());
    27         pstmt.executeUpdate();
    28         JdbcUtil.release(null, pstmt, null);
    29     }
    30     public List queryAllStudents()throws SQLException
    31     {
    32         String sql="select*from student";
    33         List students=new ArrayList();
    34         pstmt=con.prepareStatement(sql);
    35         ResultSet rs=pstmt.executeQuery();
    36         while(rs.next())
    37         {
    38             Student stu=new Student();
    39             stu.setId(rs.getInt("id"));
    40             stu.setName(rs.getString("name"));
    41             stu.setBirthday(rs.getDate("birthday"));
    42             students.add(stu);
    43         }
    44         JdbcUtil.release(null, pstmt, null);
    45         return students;
    46     }
    47     
    48 }
    StudentDaoImpl

    6)增加和删除的业务服务层接口StudentService

    package com.chapter11.service;
    
    import java.sql.SQLException;
    import java.util.List;
    
    import com.chapter11.bean.Student;
    
    public interface StudentService {
        public void addStudent(Student stu)throws SQLException;
        public List findAllStudent()throws SQLException;
    
    }
    StudentService

    7)增加和删除的业务服务层接口StudentServiceImpl

     1 package com.chapter11.service;
     2 
     3 import java.sql.Connection;
     4 import java.sql.SQLException;
     5 import java.util.List; 
     6 
     7 import com.chapter11.bean.Student;
     8 import com.chapter11.dao.StudentDao;
     9 import com.chapter11.dao.StudentDaoImpl;
    10 import com.chapter11.util.JdbcUtil;
    11 
    12 public class StudentServiceImpl implements StudentService{
    13     public void addStudent(Student stu)throws SQLException
    14     {
    15         Connection con=JdbcUtil.getConnection();
    16         try{
    17             con.setAutoCommit(false);
    18             StudentDao sdao=new StudentDaoImpl(con);
    19             sdao.insertStudent(stu);
    20             con.commit();
    21             
    22         }catch(Exception e)
    23         {
    24             e.printStackTrace();
    25         }
    26         
    27 
    28         
    29     }
    30     public List findAllStudent()throws SQLException
    31     
    32     {
    33         Connection con=JdbcUtil.getConnection();
    34         List students=null;
    35         try{
    36             con.setAutoCommit(false);
    37             StudentDao sdao=new StudentDaoImpl(con);
    38             sdao.queryAllStudents();
    39             con.commit();
    40             
    41         }catch(Exception e)
    42         {
    43             e.printStackTrace();
    44         }
    45         
    46         return students;
    47     }
    48 
    49 }
    StudentServiceImpl

    8)Web层控制器Servlet

    package com.chapter11.servlet;
    
    import java.io.IOException;
    import java.sql.Date;
    import java.util.List;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.chapter11.bean.Student;
    import com.chapter11.service.*;
    
    
    @WebServlet("/SMSServletController")
    public class SMSServletController extends HttpServlet {
        private static final long serialVersionUID = 1L;
      
        public SMSServletController() {
            super();
          
        }
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            StudentService ss=new StudentServiceImpl();
            String path=request.getServletPath();
            path=path.substring(0,path.indexOf("."));
            if(path.equalsIgnoreCase("/sms/list"))
            {
                try
                {
                    List students=ss.findAllStudent();
                    request.setAttribute("students", students);
                    forward("list.jsp",request,response);
                    
                            
                }catch(Exception e)
                {
                    throw new ServletException("error when query!");
                }
            }else if(path.equalsIgnoreCase("/sms/add"))
            {
                request.setCharacterEncoding("UTF-8");
                String name=request.getParameter("name");
                String birthday=request.getParameter("birthday");
                Student student=new Student();
                student.setBirthday(Date.valueOf(birthday));
                student.setName(name);
                try{
                    ss.addStudent(student);
                    
                    }catch(Exception e)
                    {
                        e.printStackTrace();
                    }
                response.sendRedirect(request.getContextPath()+"/sms/list.do");
                }
                
            }
    
        private void forward(String url, HttpServletRequest request,
                HttpServletResponse response)throws IOException,ServletException{
            ServletContext application=getServletContext();
            RequestDispatcher ds=application.getRequestDispatcher(url);
            ds.forward(request,response);
        
            
        }
    
    }
    Servlet

    9)Web层表示页面

    整个过程即为一个基本的MVC设计模式以及代码流程。在此还未解决的问题是最后的表示层页面显示,会在此后逐步解决。

     

    转载于:https://www.cnblogs.com/smithhan/p/5185308.html

    展开全文
  • 框架只能在技术层面上给我们帮助,无法思考和过程上帮助我们,而我们很多人都不喜欢思考和尝试。2.实现Web MVC的基础实现Web MVC基础可以概括为1个前段控制器和2个映射。(1)前端控制器FrontControl...
  • Spring Web MVC

    2018-11-27 15:19:05
    摘要:这部分文档介绍了对构建Servlet API上并部署到Servlet容器上的Servlet-stack web应用程序的支持。单独的章节包括Spring MVC、视图技术、CORS支持和WebSocket支持。有关反应堆栈web应用程序,请参见反应堆栈...
  • Java web中的mvc模式

    千次阅读 2013-10-23 22:26:56
    MVC(Model、View、Controller)是软件开发过程中比较流行的设计思想,了解MVC之前,首先我们要知道MVC是一种设计模式,而不是一种编程技术。  在Web开发中,MVC思想的核心概念如下:  M :M对应的是Model...
  • Web框架、MVC和ASP.NET

    2011-07-21 14:15:00
    社区技术预览版发布只后差不多过了一年,微软才第一次发布了真正算得上是试用版的ASP.NET MVC框架。ASP.NET MVC从根本上脱离了过去所提倡的WebForms技术,而被普遍认为是向主流Web编程的回归。MVC模式奠定了许多...
  • 设计模式当前的工程应用中越来越广泛 ,MVC 是软件开发中 的一种重 要的设计 模式 , J2EE 则是开 发高端企 业级应用的成熟技术体系。 软件规模日益庞大的今天 , 这两种技术的结合为大型软件应用的开发提供了成功...
  • Java Web应用开发技术 本章导航 本章将介绍什么是MVC模式通过本章的学习将帮您解决如下几个主要问题 什么是模式 什么是MVC模式 MVC模式有哪几个重要组成部分每部分的功能是什么 MVC模式 Java Web 开发中如何应用 *...
  • 这三者都是由ASP.NET团队研发和支持的技术框架,至于如何选择,取决于你自己的背景. ...Web form适合那些已经习惯于客户端添加各种控件的编程人员.所有控件都必须存放<form>标签内. MVC...
  • 这篇文章主要论述了如何新的Web应用领域中使用设计模式和MVC架构。文章首先介绍了设计模式的概念和特点,以及MVC架构的设计思想,并分析了MVC架构中包含的几种主要的模式。然后根据Web应用系统的特点,就如何应用...
  • Web2.0 技术由于其良好的用户体验被广泛应用于 WEB 应用的展示层。但是传统的 web 开发中,展示层的和业务逻辑层代码大量耦合,使得应用的可扩展性严重降低,同时页面层代码的可复用性也很低。本文用实例介绍,...
  • 参考书籍:《J2EE开源编程精要15讲》 ...Java Web应用程序中,  View部分一般用JSP和HTML构建。客户View部分提交请求,业务逻辑层处理后,把结果返回给View部分显示  Controller部分一般...
  • Web框架、MVC和ASP.NET

    2008-11-10 19:32:00
    http://www.infoq.com/cn/news/2008/10/MVC-Beta社区技术预览版发布只后差不多过了一年,微软才第一次发布了真正算得上是试用版的ASP.NET MVC框架。ASP.NET MVC从根本上脱离了过去所提倡的WebForms技术,而被普遍...
  • 由于是国人开发的,故这两天认真了研究下,打算未来的项目中使用。现将学习成果与园友分享。如果存在不足的地方,希望您指出。  具体的实现步骤如下:  一、准备工作  1.MVC2.0 + jQuery1.4.1 开发环境。  2....
  • Spring MVC 概述、Web环境中的SpringMVC、上下文在Web容器中的启动、Spring MVC的设计与实现、Spring MVC视图的呈现 4.1 SpringMVC概述 使用Spring MVC的时候,需要在web.xml中配置DispatcherServlet,这个...
  • 随着Web的发展和功能的需要,...本文首先介绍了PHP语言的特点和开发流程的发展,然后简明扼要的阐述了MVC思想,最后以制作个人的Blog为例说明如何利用MVC思想进行PHP开发,并对其中的一些技术细节和难点做出了说明。
  • 但由于Web本身和相关一些技术的原因,例如Http的瞬时性和无状态性,与传统的桌面编程有着很大的差别,所以开发过程中也面临着许多新问题,比如仅仅是HTML与代码的分离就有很多讨论与解决方案。同时各种设计模式也...
  •  本篇文章中,主要讲MVC框架,并且介绍如何使用Google的AngulasJS针对单页面的JavaScript应用程序实现这样一种框架。1,软件框架 框架的作用是提高你编写应用程序的效率,与此同时,为应用程序增强一致性,提高...
  • Java Web系列:Spring MVC基础

    千次阅读 2017-02-24 23:19:24
    1.Web MVC基础 ...框架只能在技术层面上给我们帮助,无法思考和过程上帮助我们,而我们很多人都不喜欢思考和尝试。 2.实现Web MVC的基础 实现Web MVC基础可以概括为1个前段控制器和2个映射。
  • WebForms VS. MVC

    2014-10-10 15:47:04
    2008年,微软推出了一个叫Asp.NET MVC的东西,我当时和很多人一样很好奇为什么还要再推出一个全新的Asp.NET技术呢。许多人说Asp.NET MVC代替了Asp.NET WebForms,但事实并非如此。它们两者各有优劣,虽然没有人...
  • 本章主要讲述1、分析Spring的IoC容器是怎样在Web应用环境中发挥作用的 2、分析Spring MVC框架的实现原理 4.2 Web环境中的Spring MVC 如果要在Web环境中使用IoC容器,需要Spring为IoC设计一个启动过程。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,171
精华内容 1,668
关键字:

web技术在mvc