精华内容
下载资源
问答
  • Web API属于ASP.NET核心平台的一部分,它利用MVC框架的底层功能方便我们快速的开发部署WEB服务。 我们可以在常规MVC应用通过添加API控制器来创建web api服务, 普通MVC应用程序控制器根据用户请求的action方法返回...

    Web API属于ASP.NET核心平台的一部分,它利用MVC框架的底层功能方便我们快速的开发部署WEB服务。

    我们可以在常规MVC应用通过添加API控制器来创建web api服务,

    普通MVC应用程序控制器根据用户请求的action方法返回ActionResult,

    而web api服务返回的则是json封装的模型数据。

    和MVC控制器通过URL选择action方法不同,

    API控制器根据HTTP请求方法的不同来选择API控制器方法。
    API控制器方法的命名规则一般是HTTP方法作为前缀加上控制器的名称,比如GetReservation(这只是常规做法,DoGetReservation、ThisIsTheGetAction都是允许的),

    我们从浏览器访问/api/reservation所用的HTTP方法为GET,

    API控制器会查找所有包含GET的所有控制器方法,GetReservation和GetAllReservations都在考虑之类,但是具体选择哪个还参考了所带的参数,访问/api/reservation没有任何参数,因此API控制器选择了GetAllReservations,访问/api/reservation/3自然就选择了GetReservation。

    由此我们也知道PostReservation、PutReservation、DeleteReservation分别对应HTTP的Post、Put、Delete三种方法(WEB API的Representation State Transfer - REST)。



    一个完整的API控制类类似:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;

    namespace MvcApplication1.Controllers
    {
        public class ValuesController1 : ApiController
        {
            // GET api/<controller>
            public IEnumerable<string> Get()
            {
                return new string[] { "value1", "value2" };
            }

            // GET api/<controller>/5
            public string Get(int id)
            {
                return "value";
            }

            // POST api/<controller>
            public void Post([FromBody]string value)
            {
            }

            // PUT api/<controller>/5
            public void Put(int id, [FromBody]string value)
            {
            }

            // DELETE api/<controller>/5
            public void Delete(int id)
            {
            }
        }
    }
     

    从框架的本质区别:

    这里写图片描述 

    用上区分,mvc主要用于建站web api主要用于构建http服务,当然你非要用mvc来构建Uri式的Api也行,不过显然是没有这个必要的,一个不恰当的比喻就像是你也可以玩破解版的单机游戏,也可以通过平台进行联机,但是始终不如steam上来得爽是吧。

    自身实现上区分的话,两种框架主要是在Asp .Net的基础上进行改造,主要是对HttpModuleHttpHandler做了扩展,实现方法是不一样的,比如说前者更像是在一层上建了第二层,引伸出更强大的路由机制,实现了诸如MvcHandlerControllerFactory这种消息处理和后台控制器方法选择机制,Web Api除了扩展了前者以外,另外写出了一套独立的,独立于Asp .Net的消息处理管道,就像是借鉴原来房子的模型,重新设计出了另外一套别墅。这也很好地解释了为什么Web Api可以寄宿在不同的宿主上(寄宿的本质就是利用一个具体的应用程序为Web Api提供一个运行的环境,并解决请求的接收和响应的回复),如Web HostSelf Host方式,这和WCF是相似的。而MVC只能寄宿于IIS上(不考虑.net core),就像Webform的寄宿方式。何况它们两者虽然都有ControllerAction,但是请求的实现和响应的回复机制也是不同的,比如说Web Api处理消息有两个核心类是HttpRequestMessageHttpResponseMessage。这两种框架最多只能说是模式上类似,实现上还是有很大差别的。不过两者都是Asp .Net的组成成员,图上表现得很清楚了。

    首先,两者的主要解决的问题不同!
    MVC的主要使用场景在于Web站点的开发,他在后端实现了一套完整的MVC开发框架,能提供方便的页面开发,默认使用Razor视图引擎,提供了后端html构造,用户可以方便地开发出带页面的站点。

    而WebAPI主演提供了一套RestfulAPI的开发框架,提供了较为完整的http语义支持,主要用来做开放API,更抽象,更不注重View的生成。

    从实现的角度看,虽然他俩捆绑在一起,但是两者处理管线还是不同的。
    如果你对http有较为深入理解后,你就会发现,其实他俩的界限没那么明显,那么你也许会觉得mvc做的事webAPI都能做,因为他更抽象,有时候你又不想把两者的界限搞得那么清晰

    展开全文
  • WEB应用中使用MVC模式

    千次阅读 2006-01-03 14:37:00
    观点:在WEB应用中使用MVC模式如今的商业世界里,厂商们在他们的服务和生产线方面做了很大的努力。陈列展示和客户交互变成了以Internet为中心的一种模式。公司们正在逐步建立Web展示平台以吸引更多新客户,并使之...
    观点:在WEB应用中使用MVC模式

    如今的商业世界里,厂商们在他们的服务和生产线方面做了很大的努力。陈列展示和客户交互变成了以Internet为中心的一种模式。公司们正在逐步建立Web展示平台以吸引更多新客户,并使之多元化。且简化了和现有客户群体的交互方式,也使得基于B2B的通讯更加便利,使得在老的服务上推新更加容易了。现在,实际上每个银行都提供了在线储蓄的方式;每个财政机构和经纪行都重新编写了自己的贸易系统来允许全球的访问,能够和任何已连上Internet的地方进行交易。在航空,国防,制药,资料管理和其他工业领域,都已经将Web接口加入到它们的商业模式中。

    随着基于Web的服务和应用迅速地壮大,Web应用开发领域有了巨大的进步和发展。现有的编程方法学,设计模式,代码库都已经被重新应用(或者重写),使得它们都和基于Web的应用相关联。甚至还创建了整个框架(frameworks)来减少开发时间,缩短维护周期,简化在线应用程序的代码。因为Model-View-Controller (MVC)设计范例的主要目的是分离业务逻辑层和表示逻辑层,因为它在整合各种Web程序方面显得游刃有余,所以在基于Web的应用和服务方面,它是首选。Apache的Struts实际上是JAVA中的一种MVC实现框架。FuseBox是另一个MVC的实现,它是在多个Web技术的技术上实现的,如ColdFusion, PHP, Java, ASP和Lasso。

    在这篇文章中,我会告诉你如何在基于Web的项目中使用MVC。我的控制器(controller)将依赖反射API(Reflection API)来动态调用行为方法(action methods),并重定向到适当的视图(View), 调整表示逻辑和模型(Model)之间的数据流。

    因为是一个Web项目,所以我会使用Servlets做服务端处理和控制器(controller)实现,JavaBean做模型(Model)层,JSP作为表示(presentation)层。如果你不熟悉Servlets,JSP和J2EE组件开发,请先阅读本文末尾的参考教程。

    如果要测试我的项目或者想在一个大的程序中将它作为核心程序,你需要配置支持J2EE的应用服务器(application server)。这里我使用免费的Tomcat,但是在一个企业环境中,你可能会使用IBM WebSphere 或者BEA WebLogic作为商业的J2EE应用服务和EJB/JSP容器。应用服务器的安装超过了本文的范围,但是项目的源程序是用XML配置描叙文件包裹为J2EE应用程序WAR(Web压缩)文件的;因此,要在一个已配置的服务器上运行它,你所需要做的是将它drop到一个适当的位置。而且,如果你想投入更多点的时间,不编写自己的控制器层(Controller layer),那么你可能还需要考虑一下Apache Struts框架,该框架伴随有一个巨大的JSP标签库,可以提供你需要的各种类型的功能。

    项目

    要演示如何在Web应用中使用MVC模式,我创建了一个简单的项目,该项目包含一些JSP视图(JSP Views)----在任何一个浏览器中可视----一些助手bean,行为类(action classes),一个Servlet controller类。项目的目的是要基于用户的邮政编码或者城市名来显示天气信息。这个项目的架构是要使任何类型的大型在线应用程序更容易和更方便修改。企业级的应用程序在后台通常有个数据库,在视图中取出动态数据,即所谓的三层架构所组成----客户应用程序,服务器处理,企业数据服务。我这次是要将所有的数据信息都存储到一个HashMap对象中。

    架构图

     

    主要的控制器

    任何MVC设计的主要控制器是负责协调模型和视图层之间的数据流,响应用户的请求和用行为管理模型数据。这个是Model-View-Controller在Web应用中合适的原因。如果控制器被完好的编写,它就会引导请求数据,针对各种数量和类型的视图调用行为。因此,你能很容易的应用同一个控制器到任何项目中,然后添加你需要的视图就可以了。

    我把我的控制器Servlet叫“MainServlet”,并在一个XML配置描叙文件添加了它的定义,该描叙文件在我的应用服务器一个称为WeatherAppWeb的新的Web应用(webapp)下。

    <web-app id="WebApp">

    <display-name>WeatherAppWeb</display-name>
    <servlet>
    <servlet-name>MainServlet</servlet-name>
    <display-name>MainServlet</display-name>
    <servlet-class>sys.MainServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>MainServlet</servlet-name>
    <url-pattern>/MainServlet</url-pattern>
    </servlet-mapping>
    ...

    Servlet有标准的doGet和doPost方法。但是,它也有HashMap,用来动态存储行为对象,该对象是从JSP视图传递的键值所创建的。

    我没有用一个属性文件来匹配执行行为的键值或者用来显示的JSP视图,取而代之,我将行为键作为隐藏变量(hidden varivables)放入到JSP本身中,来指出控制器接下来会做什么。

    当JSP提交自己的数据到控制器时,主要的“魔术”发生在doPost方法中。我使用反射API来实例化Action类,(首先我检查它是否已存在)。然后通过一个参数键值调用一个方法。Actio n类被控制器Controller使用来执行各种类型的行为。所有的行为类都实现一个空的ActionIn terface,以致能够使用反射(Reflection),并通过JSP表单传回的参数键值来实例化它们。 Action调用返回后, 我重定位到另一个视图----这个取决与在finally从句中传递过来的第二个键参数。

    JSP视图

    该视图是一个用户可以在任何Web浏览器中看到的简单HTML页面。它们是由JSP应用服务器生成的。Post视图有一个HTML表单,其中有个提交行为指向控制器Servlet。

    <FORM action="../MainServlet" method="post">

    两个关键参数指出控制器指出控制器做什么和重定向到哪里。

    <input type="hidden" name="ACTIONKEY" value="WeatherAction.viewByZip">
    <input type="hidden" name="REDIRECTKEY" value="weather_data">

    在本例中,一个JSP视图取得邮政编码(ZIP code)并将它提交到控制器,使用第一个键值WeatherAction来实例化Action类,并通过传递到一个请求对象来调用viewByZip方法。从请求的对象中,我得到了所有的参数并在Data Store WeatherData对象中使用邮政编码方式进行查找。结果bean的引用被放回到请求的对象。(看 Listing 1)方法完成后,控制器Controller Servlet通过第二个键值重定向到“weather_data.jsp”。(看Listing 2)

    正如你能够从上面的架构图表中看到的,我有两个JSP视图(一个是取Zip code,一个取City字符串),它们都有第二个键值用来指向第三个JSP页面(weather_data),我们可以看到检索结果。通过遵守该模式的规则,你能够使用适当的键值添加任何数量的视图和模型,控制器将不费力气的协调它们之间的数据流,而不用知道有关视图或响应模型的具体细节。

    最后一个关于JSP视图的是,我使用服务器端的JSP标签库(Tag Library)来验证ZIP和City字段的合法性。代码如下:

    <%@ taglib uri="/WEB-INF/validtag.tld" prefix="valTags" %>

    如果你不熟悉JSP标签,不用担心。我会在我的下一篇文章“在MVC视图中使用JSP标签库验证用户输入”中详细描叙如何使用它们进行数据验证的。



    Java Bean 模型层

    在我的Web MVC项目中,model层包含容纳数据的助手beans。它们仅有实例字段,getter和方法。它们位于“beans”包中,在Action类下面。当控制器执行一个行为行为方法时,行为可能放住一个bean或者做一些其他的操作。在一个企业项目里,行为可能做更多的事情:连接到RDBMS,mainframe,或者其他数据源获得数据。发送数据到数据源,更新数据,做一些安全性检查和一些其他任务。行为实际上是控制器助手类,但是它们也属于模型层,因为它们控制模型数据状态和响应用户的请求。

    结论

    结论

    正如你看到的, MVC 确实很适合Web应用的开发。一旦控制器被做好,程序员们可以创建很多视图针对用户的情况和一些特殊的需求来响应模型(action+beans)。 因为控制器可以在新的应用中简单的重新使用,所以开发时间缩短了很多,使得能够花更多时间编写业务逻辑和模型表示的功能。视图能够作为原型(prototype)被创建,整个创建过程先用HTML完成,再转化到JSP或者被另一种技术代码所代替。关于这篇文章的任何可以e-mail我:vlad_kofman@yahoo.com

    Code Listings
    Listing 1
    public void doPost(HttpServletRequest req,HttpServletResponse res)
      throws ServletException, IOException{
        res.setContentType("text/html");
        String action = (String) req.getParameter("ACTIONKEY");
        String redirect = (String) req.getParameter("REDIRECTKEY");
        ActionInterface actionInterface = null;
        HttpSession session = req.getSession();

    try {
      String classNameStr = action.substring(0, action.indexOf("."));
      String methodName = action.substring(action.indexOf(".") + 1);
      // if action exists - get it,
      actionInterface = (ActionInterface) actions.get(classNameStr);
      // if null - instantiate it
      if
        (actionInterface == null) {
        className = Class.forName("actions." + classNameStr);
        actionInterface = (ActionInterface) className.newInstance();
        actions.put(classNameStr, actionInterface);
        }

        method = actionInterface.getClass().getMethod(methodName,
                                                      new
        Class[] { o.getClass(), o.getClass()});
        method.invoke(actionInterface, new
        Object[] { req, res });

        } catch (Exception e) {
        session.setAttribute(
        "msg",
        "Problem in MainController Servlet doPost/n" + e);
        System.out.println(
        "Problem in MainController Servlet doPost/n" + e);
        } finally {
        this
        .getServletContext()
        .getRequestDispatcher("/jsp/" + redirect + ".jsp")
        .include(req, res);
        }
      }

    Listing 2
    public synchronized void viewByZip(Object reqO, Object resO) {

      HttpServletRequest req = (HttpServletRequest) reqO;
      HttpServletResponse res = (HttpServletResponse) resO;
      String zip = (String) req.getParameter("ZIP");
      String data = (String) WeatherData.getData(zip);

      if (data == null)
      data = "Sorry; no weather data is available for zip:" + zip;
      // fill new bean
      WeatherBean wb = new WeatherBean();
      wb.setZip(zip);
      wb.setData(data);
      // put bean in to request user's object
      req.setAttribute("weather", wb);
      }

    Listing 3
    <BODY>
    <% beans.WeatherBean wb =
      (beans.WeatherBean)request.getAttribute("weather"); %>
    <P>Weather information for <%=wb.getZip() %></P>
      <%=wb.getData() %>
    <P>
    <% if (session.getAttribute("msg") == null)
          { session.setAttribute("msg", "& "); } %>
    <%=session.getAttribute("msg") %>
    <% session.setAttribute("msg", "& "); %>
    </P>
      <backTags:BackLink text="<- Back" />
    </BODY>

    关于作者

    Vlad Kofman is a System Architect currently working on projects under government defense contracts. He also has been involved with enterprise-level projects for major Wall Street firms and the U.S. government. His main interests are object-oriented programming methodologies and design patterns.

    参考书籍

    Java Servlet Technology by Stephanie Bodoff
    http://java.sun.com/webservices/docs/1.0/tutorial/doc/Servlets.html

    Servlets and JavaServer Pages (JSP) 1.0: A Tutorial
    http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/

    Sun Reflection API by Dale Green
    http://java.sun.com/docs/books/tutorial/reflect/

    WebSphere Studio Application Developer Version 5 Programming Guide
    By Ueli Wahli, Ian Brown, Fabio Ferraz, Maik Schumacher, and Henrik Sjostrand
    IBM Redbook SG24-6957-00, May 9, 2003
    http://www.redbooks.ibm.com/

    Core Java 2, Volume II: Advanced Features (5th Edition)
    by Cay Horstmann, Gary Cornell
    Publisher: Prentice Hall; 5th edition (December 10, 2001)

    Translated by Willpower,2003.12.3

    注:本文是著名开发者网站developer.com于2003年12月2日刊登发表的一篇文章。


    相关文章
    展开全文
  • MVC WebApi的两种访问方法

    千次阅读 2018-04-25 22:15:42
    //UserInfoControllerusing ClassLibrary;using System;using System.Collections.Generic;using System.Linq;using System.Net;...using System.Web.Http;namespace WebApiExam.Controllers{ ...

    //UserInfoController

    using ClassLibrary;

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;


    namespace WebApiExam.Controllers
    {
        public class UserInfoController : ApiController
        {
            // GET: api/UserInfo
            public IEnumerable<UserInfo> Get()
            {
                List<UserInfo> list = new List<UserInfo>();
                list.Add(new UserInfo() { Id = 1, Name = "zhangsan" });
                list.Add(new UserInfo() { Id = 2, Name = "lisi" });
                list.Add(new UserInfo() { Id = 3, Name = "wangwu" });
                return list;
                //return new string[] { "value1", "value2" };
            }


            // GET: api/UserInfo/5
            public string Get(int id)
            {
                return "value";
            }


            // POST: api/UserInfo
            public void Post([FromBody]string value)
            {
            }


            // PUT: api/UserInfo/5
            public void Put(int id, [FromBody]string value)
            {
            }


            // DELETE: api/UserInfo/5
            public void Delete(int id)
            {
            }
        }

    }

    //客户端访问,只能在本域中

    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
    <meta charset="utf-8" />


        <script src="Scripts/jquery-1.10.2.min.js"></script>
        <script>
            $(function () {
                loadList();
            });
            function loadList() {
                $.ajax({
                    type: 'get',
                    data: '{}',
                    url:'http://localhost:10536/api/UserInfo',
                    contentType: 'application/json;charset=utf-8',
                    dataType: 'json',
                    success: function (list) {
                        listBody = $('#listBody');
                        listBody.empty();
                        $.each(list, function (index,item) {
                            listBody.append('<tr><td>' + item.Id + '</td><td>' + item.Name + '</td></tr>');


                        })
                    }

                    });
            }
        </script>
    </head>
    <body>
        <table border="1">
            <tr>
                <th>编号</th>
                <th>姓名</th>
            </tr>
            <tbody id="listBody">


            </tbody>

        </table>
    </body>

    </html>

    //使用HttpClient访问,可以跨域

    using ClassLibrary;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Web;
    using System.Web.Mvc;


    namespace WebApiClient.Controllers
    {
        public class HomeController : Controller
        {
            // GET: Home
            public ActionResult Index()
            {
                HttpClient client = new HttpClient();
                client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

                HttpResponseMessage response = client.GetAsync("http://localhost:10536/api/UserInfo").Result;

    //方法ReadAsAsync(),必须引用项目Packages里面的System.Net.Http.Formatting.dll才可以使用

                var list = response.Content.ReadAsAsync<List<UserInfo>>().Result;
                ViewData.Model = list;
                return View();
            }
        }

    }


    //Index.cshtml

    @model List<ClassLibrary.UserInfo>
    @{
        Layout = null;
    }


    <!DOCTYPE html>


    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
    </head>
    <body>
        <div> 
            <table border="1">
                <tr>
                    <th>编号</th>
                    <th>名字</th>
                </tr>
                @foreach(ClassLibrary.UserInfo user in Model)
                {
                    <tr>
                        <td>@user.Id</td>
                        <td>@user.Name</td>
                    </tr>
                }
            </table>
        </div>
    </body>
    </html>

    展开全文
  • WEB应用中使用MVC模式

    千次阅读 2008-01-09 22:19:00
    陈列展示和客户交互变成了以Internet为中心的一种模式。公司们正在逐步建立Web展示平台以吸引更多新客户,并使之多元化。且简化了和现有客户群体的交互方式,也使得基于B2B的通讯更加便利,使得在老的服务上推新更加...
    如今的商业世界里,厂商们在他们的服务和生产线方面做了很大的努力。陈列展示和客户交互变成了以Internet为中心的一种模式。公司们正在逐步建立Web展示平台以吸引更多新客户,并使之多元化。且简化了和现有客户群体的交互方式,也使得基于B2B的通讯更加便利,使得在老的服务上推新更加容易了。现在,实际上每个银行都提供了在线储蓄的方式;每个财政机构和经纪行都重新编写了自己的贸易系统来允许全球的访问,能够和任何已连上Internet的地方进行交易。在航空,国防,制药,资料管理和其他工业领域,都已经将Web接口加入到它们的商业模式中。
    

    随着基于Web的服务和应用迅速地壮大,Web应用开发领域有了巨大的进步和发展。现有的编程方法学,设计模式,代码库都已经被重新应用(或者重写),使得它们都和基于Web的应用相关联。甚至还创建了整个框架(frameworks)来减少开发时间,缩短维护周期,简化在线应用程序的代码。因为Model-View-Controller (MVC)设计范例的主要目的是分离业务逻辑层和表示逻辑层,因为它在整合各种Web程序方面显得游刃有余,所以在基于Web的应用和服务方面,它是首选。Apache的Struts实际上是JAVA中的一种MVC实现框架。FuseBox是另一个MVC的实现,它是在多个Web技术的技术上实现的,如ColdFusion, PHP, Java, ASP和Lasso。

    在这篇文章中,我会告诉你如何在基于Web的项目中使用MVC。我的控制器(controller)将依赖反射API(Reflection API)来动态调用行为方法(action methods),并重定向到适当的视图(View), 调整表示逻辑和模型(Model)之间的数据流。

    因为是一个Web项目,所以我会使用Servlets做服务端处理和控制器(controller)实现,JavaBean做模型(Model)层,JSP作为表示(presentation)层。如果你不熟悉Servlets,JSP和J2EE组件开发,请先阅读本文末尾的参考教程。

    如果要测试我的项目或者想在一个大的程序中将它作为核心程序,你需要配置支持J2EE的应用服务器(application server)。这里我使用免费的Tomcat,但是在一个企业环境中,你可能会使用IBM WebSphere 或者BEA WebLogic作为商业的J2EE应用服务和EJB/JSP容器。应用服务器的安装超过了本文的范围,但是项目的源程序是用XML配置描叙文件包裹为J2EE应用程序WAR(Web压缩)文件的;因此,要在一个已配置的服务器上运行它,你所需要做的是将它drop到一个适当的位置。而且,如果你想投入更多点的时间,不编写自己的控制器层(Controller layer),那么你可能还需要考虑一下Apache Struts框架,该框架伴随有一个巨大的JSP标签库,可以提供你需要的各种类型的功能。

    项目

    要演示如何在Web应用中使用MVC模式,我创建了一个简单的项目,该项目包含一些JSP视图(JSP Views)----在任何一个浏览器中可视----一些助手bean,行为类(action classes),一个Servlet controller类。项目的目的是要基于用户的邮政编码或者城市名来显示天气信息。这个项目的架构是要使任何类型的大型在线应用程序更容易和更方便修改。企业级的应用程序在后台通常有个数据库,在视图中取出动态数据,即所谓的三层架构所组成----客户应用程序,服务器处理,企业数据服务。我这次是要将所有的数据信息都存储到一个HashMap对象中。

    架构图

     

    主要的控制器

    任何MVC设计的主要控制器是负责协调模型和视图层之间的数据流,响应用户的请求和用行为管理模型数据。这个是Model-View-Controller在Web应用中合适的原因。如果控制器被完好的编写,它就会引导请求数据,针对各种数量和类型的视图调用行为。因此,你能很容易的应用同一个控制器到任何项目中,然后添加你需要的视图就可以了。

    我把我的控制器Servlet叫“MainServlet”,并在一个XML配置描叙文件添加了它的定义,该描叙文件在我的应用服务器一个称为WeatherAppWeb的新的Web应用(webapp)下。

    <web-app id="WebApp">

    <display-name>WeatherAppWeb</display-name>
    <
    servlet>
    <
    servlet-name>MainServlet</servlet-name>
    <
    display-name>MainServlet</display-name>
    <
    servlet-class>sys.MainServlet</servlet-class>
    </
    servlet>
    <
    servlet-mapping>
    <
    servlet-name>MainServlet</servlet-name>
    <
    url-pattern>/MainServlet</url-pattern>
    </
    servlet-mapping>
    ...

    Servlet有标准的doGet和doPost方法。但是,它也有HashMap,用来动态存储行为对象,该对象是从JSP视图传递的键值所创建的。

    我没有用一个属性文件来匹配执行行为的键值或者用来显示的JSP视图,取而代之,我将行为键作为隐藏变量(hidden varivables)放入到JSP本身中,来指出控制器接下来会做什么。

    当JSP提交自己的数据到控制器时,主要的“魔术”发生在doPost方法中。我使用反射API来实例化Action类,(首先我检查它是否已存在)。然后通过一个参数键值调用一个方法。Actio n类被控制器Controller使用来执行各种类型的行为。所有的行为类都实现一个空的ActionIn terface,以致能够使用反射(Reflection),并通过JSP表单传回的参数键值来实例化它们。 Action调用返回后, 我重定位到另一个视图----这个取决与在finally从句中传递过来的第二个键参数。

    JSP视图

    该视图是一个用户可以在任何Web浏览器中看到的简单HTML页面。它们是由JSP应用服务器生成的。Post视图有一个HTML表单,其中有个提交行为指向控制器Servlet。

    <FORM action="../MainServlet" method="post">

    两个关键参数指出控制器指出控制器做什么和重定向到哪里。

    <input type="hidden" name="ACTIONKEY" value="WeatherAction.viewByZip">
    <
    input type="hidden" name="REDIRECTKEY" value="weather_data">

    在本例中,一个JSP视图取得邮政编码(ZIP code)并将它提交到控制器,使用第一个键值WeatherAction来实例化Action类,并通过传递到一个请求对象来调用viewByZip方法。从请求的对象中,我得到了所有的参数并在Data Store WeatherData对象中使用邮政编码方式进行查找。结果bean的引用被放回到请求的对象。(看 Listing 1)方法完成后,控制器Controller Servlet通过第二个键值重定向到“weather_data.jsp”。(看Listing 2)

    正如你能够从上面的架构图表中看到的,我有两个JSP视图(一个是取Zip code,一个取City字符串),它们都有第二个键值用来指向第三个JSP页面(weather_data),我们可以看到检索结果。通过遵守该模式的规则,你能够使用适当的键值添加任何数量的视图和模型,控制器将不费力气的协调它们之间的数据流,而不用知道有关视图或响应模型的具体细节。

    最后一个关于JSP视图的是,我使用服务器端的JSP标签库(Tag Library)来验证ZIP和City字段的合法性。代码如下:

    <%@ taglib uri="/WEB-INF/validtag.tld" prefix="valTags" %>

    如果你不熟悉JSP标签,不用担心。我会在我的下一篇文章“在MVC视图中使用JSP标签库验证用户输入”中详细描叙如何使用它们进行数据验证的。



    Java Bean 模型层

    在我的Web MVC项目中,model层包含容纳数据的助手beans。它们仅有实例字段,getter和方法。它们位于“beans”包中,在Action类下面。当控制器执行一个行为行为方法时,行为可能放住一个bean或者做一些其他的操作。在一个企业项目里,行为可能做更多的事情:连接到RDBMS,mainframe,或者其他数据源获得数据。发送数据到数据源,更新数据,做一些安全性检查和一些其他任务。行为实际上是控制器助手类,但是它们也属于模型层,因为它们控制模型数据状态和响应用户的请求。

     

    正如你看到的, MVC 确实很适合Web应用的开发。一旦控制器被做好,程序员们可以创建很多视图针对用户的情况和一些特殊的需求来响应模型(action+beans)。 因为控制器可以在新的应用中简单的重新使用,所以开发时间缩短了很多,使得能够花更多时间编写业务逻辑和模型表示的功能。视图能够作为原型(prototype)被创建,整个创建过程先用HTML完成,再转化到JSP或者被另一种技术代码所代替。关于这篇文章的任何可以e-mail我:vlad_kofman@yahoo.com

    Code Listings
    Listing 1
    public void doPost(HttpServletRequest req,HttpServletResponse res)
      throws ServletException, IOException{
        res.setContentType("text/html");
        String action = (String) req.getParameter("ACTIONKEY");
        String redirect = (String) req.getParameter("REDIRECTKEY");
        ActionInterface actionInterface = null;
        HttpSession session = req.getSession();

    try {
      String classNameStr = action.substring(0, action.indexOf("."));
      String methodName = action.substring(action.indexOf(".") + 1);
      // if action exists - get it,
      actionInterface = (ActionInterface) actions.get(classNameStr);
      // if null - instantiate it
      if
        (actionInterface == null) {
        className = Class.forName("actions." + classNameStr);
        actionInterface = (ActionInterface) className.newInstance();
        actions.put(classNameStr, actionInterface);
        }

        method = actionInterface.getClass().getMethod(methodName,
                                                      new
        Class[] { o.getClass(), o.getClass()});
        method.invoke(actionInterface, new
        Object[] { req, res });

        } catch (Exception e) {
        session.setAttribute(
        "msg",
        "Problem in MainController Servlet doPost/n" + e);
        System.out.println(
        "Problem in MainController Servlet doPost/n" + e);
        } finally {
        this
        .getServletContext()
        .getRequestDispatcher("/jsp/" + redirect + ".jsp")
        .include(req, res);
        }
      }

    Listing 2
    public synchronized void viewByZip(Object reqO, Object resO) {

      HttpServletRequest req = (HttpServletRequest) reqO;
      HttpServletResponse res = (HttpServletResponse) resO;
      String zip = (String) req.getParameter("ZIP");
      String data = (String) WeatherData.getData(zip);

      if (data == null)
      data = "Sorry; no weather data is available for zip:" + zip;
      // fill new bean
      WeatherBean wb = new WeatherBean();
      wb.setZip(zip);
      wb.setData(data);
      // put bean in to request user's object
      req.setAttribute("weather", wb);
      }

    Listing 3
    <BODY>
    <% beans.WeatherBean wb =
      (beans.WeatherBean)request.getAttribute("weather"); %>
    <P>Weather information for <%=wb.getZip() %></P>
      <%=wb.getData() %>
    <P>
    <% if (session.getAttribute("msg") == null)
          { session.setAttribute("msg", "& "); } %>
    <%=session.getAttribute("msg") %>
    <% session.setAttribute("msg", "& "); %>
    </P>
      <backTags:BackLink text="<- Back" />
    </BODY>

    关于作者

    Vlad Kofman is a System Architect currently working on projects under government defense contracts. He also has been involved with enterprise-level projects for major Wall Street firms and the U.S. government. His main interests are object-oriented programming methodologies and design patterns.

    参考书籍

    Java Servlet Technology by Stephanie Bodoff
    http://java.sun.com/webservices/docs/1.0/tutorial/doc/Servlets.html

    Servlets and JavaServer Pages (JSP) 1.0: A Tutorial
    http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/

    Sun Reflection API by Dale Green
    http://java.sun.com/docs/books/tutorial/reflect/

    WebSphere Studio Application Developer Version 5 Programming Guide
    By Ueli Wahli, Ian Brown, Fabio Ferraz, Maik Schumacher, and Henrik Sjostrand
    IBM Redbook SG24-6957-00, May 9, 2003
    http://www.redbooks.ibm.com/

    Core Java 2, Volume II: Advanced Features (5th Edition)
    by Cay Horstmann, Gary Cornell
    Publisher: Prentice Hall; 5th edition (December 10, 2001)

     结论
    展开全文
  • 观点:在WEB应用中使用MVC模式

    千次阅读 2003-12-04 21:01:00
    观点:在WEB应用中使用MVC模式如今的商业世界里,厂商们在他们的服务和生产线方面做了很大的努力。陈列展示和客户交互变成了以Internet为中心的一种模式。公司们正在逐步建立Web展示平台以吸引更多新客户,并使之...
  • Java Web中的MVC框架模式

    千次阅读 2019-05-22 21:43:00
    首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),即为MVC。它是一种软件设计的典范...
  • java Web MVC模式简介

    2013-04-11 20:01:57
    1、 Web浏览器(如IE)发起请求,如访问http://sishuok.com 2、 Web服务器(如Tomcat)接收请求,处理请求(比如用户新增,则将把用户保存一下),最后产生响应(一般为html)。 3、web服务器处理完成后,...
  • MVC模式

    千次阅读 2008-05-28 12:34:00
    MVC模式 MVC模式 MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了...
  • Webapi也是一种服务,是属于服务端的,供客户端调用,类似webservice,但是与mvc请求方式不一样(MVC通过路由controller/action请求),Webapi通过不同的HTTP请求(get(查询)、put(更新)、post(增加)、delete...
  • MVC模式

    2009-10-12 18:24:00
    MVC模式 MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的...
  • 使用webapi做rest的服务接口时,有些读取数据表的操作,数据本身变化不频繁,但是访问量却不小,比如频道分类,地市选择信息等等等等。这时,必然想到使用缓存。  在普通controller下,由于controller实现了一堆...
  • Web Api简单用法

    千次阅读 2015-08-07 22:59:52
    ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器、移动设备等多种客户端的 Http 服务的新框架, ASP.NET Web API 也是构建 RESTful 服务的理想平台。 使用前请安装AspNetMVC4Setup.exe...
  • 基于MVC设计模式WEB应用框架研究

    千次阅读 2011-04-18 10:12:00
    本文简要介绍了MVC设计模式和Struts 框架,并提出了一种基于MVC模式的新型WEB应用开发框架——WebFramework,并对该框架的各个层次的组成、功能进行了详细的描述。  关键词 MVC设计模式; J2EE;框架; Struts
  • MVC 设计模式概述

    万次阅读 多人点赞 2016-11-22 21:54:13
    MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型 (Model)、视图(View)和控制器(Controller)。MVC模式最早为Trygve Reenskaug提出,为施乐帕罗奥多研究...
  • MVC模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者...
  • 就是使用asp.net core使用c#创建Restful服务,就是webapi,如果要使用webapi控制器 webapi中的控制器是派生自ControllerBase的类, ControllerBase类 不要通过从 Controller 类派生来创建 Web API 控制器。 ...
  • Spring MVC 访问不同路径的页面

    万次阅读 2020-01-14 17:34:15
    MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:Model(模型)表示应用程序核心(比如数据库记录列表)。是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象...
  • WebAPI接口调试技巧

    万次阅读 2017-09-05 17:01:45
    接口模式:基于MVC4.0的WebAPI 承载协议:HTTP 跟踪工具:IE11 请求方式:POST 请求URL:IP:Port/Application/Controller/ActionName/Parameters 请求参数:一串由JSON对象转化而成的字符串 响应状态:200(OK) ...
  • mvc模式

    千次阅读 2010-03-16 13:20:00
    使用由用户部件根据模板配置组成的组合页面,它增强了可重用 性,并原型化了站点的布局。  视图部分大致处理流程如下:首先,页面模板定义了页面的布局;页面配置文件定义视图标签的具体 内容(用户部件...
  • Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发...
  • MVC模式简介

    千次阅读 2012-02-24 10:52:28
    但是,我们已经总结出了很多可靠的设计模式,多种设计模式结合在一起,使MVC架构的实现变得相对简单易行。Views可以看作一棵树,显然可以用Composite Pattern来实现。Views和Models之间的关系可以用Observer ...
  • Java Web自定义MVC框架详解

    万次阅读 多人点赞 2015-01-16 10:56:01
    最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架。但是突然发现百度上能搜索到的靠谱的资料并不是很多,有些只是原理没有代码实现,有些有代码实现但是对于初学者来说理解起来还是比较...
  • <学习笔记>Servlet+JSP+JavaBean(MVC)模式适合开发较复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javaBean负责封装数据,各个模块之间层次清晰。软件三层结构为Web层、业务逻辑层...
  • .netcore下使用Swagger生成webapi文档

    千次阅读 2018-08-29 18:51:26
    1.新建一个.netcore webapi项目 2.添加一个Model子项目用于存放输入输出类 在解决方案中添加一个.netcore类库子项目,命名为Test.Model,用于存放API接口的输入输出参数类 3.在Test.Model子项目中新建两个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,127
精华内容 14,050
关键字:

webapi使用mvc模式访问页面