当前位置: 首页 > news >正文

ui设计周末培训学校阿里云网站建设优化

ui设计周末培训学校,阿里云网站建设优化,怎样查网站谁做的,企业网站源码 aspSpringMVC视图解析器 前言 在前一篇博客中讲了SpringMVC的Controller控制器#xff0c;在这篇博客中将接着介绍一下SpringMVC视 图解析器。当我们对SpringMVC控制的资源发起请求时#xff0c;这些请求都会被SpringMVC的DispatcherServlet处理#xff0c;接着 Spring会分析看…SpringMVC视图解析器 前言    在前一篇博客中讲了SpringMVC的Controller控制器在这篇博客中将接着介绍一下SpringMVC视 图解析器。当我们对SpringMVC控制的资源发起请求时这些请求都会被SpringMVC的DispatcherServlet处理接着 Spring会分析看哪一个HandlerMapping定义的所有请求映射中存在对该请求的最合理的映射。然后通过该HandlerMapping取得 其对应的Handler接着再通过相应的HandlerAdapter处理该Handler。HandlerAdapter在对Handler进行处理 之后会返回一个ModelAndView对象。在获得了ModelAndView对象之后Spring就需要把该View渲染给用户即返回给浏览器。 在这个渲染的过程中发挥作用的就是ViewResolver和View。当Handler返回的ModelAndView中不包含真正的视图只返回一 个逻辑视图名称的时候ViewResolver就会把该逻辑视图名称解析为真正的视图View对象。View是真正进行视图渲染把结果返回给浏览器 的。 ViewResolver和View介绍 SpringMVC用于处理视图最重要的两个接口是ViewResolver和View。ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真正的视图SpringMVC中用于把View对象呈现给客户端的是View对象本身而ViewResolver只是把逻辑视图名称解析为对象的View对象。View接口的主要作用是用于处理视图然后返回给客户端。 Spring为我们提供了非常多的视图解析器下面将列举一些视图解析器。 AbstractCachingViewResolver这是一个抽象类这种视图解析器会把它曾经解析过的视图保存起来然后每次要解析视图的时候先从缓存里面找如果找到了对应的视图就直接返回如果没有就创建一个新的视图对象然后把它放到一个用于缓存的map中接着再把新建的视图返回。使用这种视图缓存的方式可以把解析视图的性能问题降到最低。 UrlBasedViewResolver它是对ViewResolver的一种简单实现而且继承了AbstractCachingViewResolver主要就是提供的一种拼接URL的方式来解析视图它可以让我们通过prefix属性指定一个指定的前缀通过suffix属性指定一个指定的后缀然后把返回的逻辑视图名称加上指定的前缀和后缀就是指定的视图URL了。如prefix/WEB-INF/jsps/suffix.jsp返回的视图名称viewNametest/indx则UrlBasedViewResolver解析出来的视图URL就是/WEB-INF/jsps/test/index.jsp。默认的prefix和suffix都是空串。URLBasedViewResolver支持返回的视图名称中包含redirect:前缀这样就可以支持URL在客户端的跳转如当返回的视图名称是”redirect:test.do”的时候URLBasedViewResolver发现返回的视图名称包含”redirect:”前缀于是把返回的视图名称前缀”redirect:”去掉取后面的test.do组成一个RedirectViewRedirectView中将把请求返回的模型属性组合成查询参数的形式组合到redirect的URL后面然后调用HttpServletResponse对象的sendRedirect方法进行重定向。同样URLBasedViewResolver还支持forword:前缀对于视图名称中包含forword:前缀的视图名称将会被封装成一个InternalResourceView对象然后在服务器端利用RequestDispatcher的forword方式跳转到指定的地址。使用UrlBasedViewResolver的时候必须指定属性viewClass表示解析成哪种视图一般使用较多的就是InternalResourceView利用它来展现jsp但是当我们使用JSTL的时候我们必须使用JstlView。下面是一段UrlBasedViewResolver的定义根据该定义当返回的逻辑视图名称是test的时候UrlBasedViewResolver将把逻辑视图名称加上定义好的前缀和后缀即“/WEB-INF/test.jsp”然后新建一个viewClass属性指定的视图类型予以返回即返回一个url为“/WEB-INF/test.jsp”的InternalResourceView对象。 Xml代码   bean     classorg.springframework.web.servlet.view.UrlBasedViewResolver     property nameprefix value/WEB-INF/ /     property namesuffix value.jsp /     property nameviewClass valueorg.springframework.web.servlet.view.InternalResourceView/  /bean     InternalResourceViewResolver它是URLBasedViewResolver的子类所以URLBasedViewResolver支持的特性它都支持。在实际应用中InternalResourceViewResolver也是使用的最广泛的一个视图解析器。那么InternalResourceViewResolver有什么自己独有的特性呢单从字面意思来看我们可以把InternalResourceViewResolver解释为内部资源视图解析器这就是InternalResourceViewResolver的一个特性。InternalResourceViewResolver会把返回的视图名称都解析为InternalResourceView对象InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。比如在InternalResourceViewResolver中定义了prefix/WEB-INF/suffix.jsp然后请求的Controller处理器方法返回的视图名称为test那么这个时候InternalResourceViewResolver就会把test解析为一个InternalResourceView对象先把返回的模型属性都存放到对应的HttpServletRequest属性中然后利用RequestDispatcher在服务器端把请求forword到/WEB-INF/test.jsp。这就是InternalResourceViewResolver一个非常重要的特性我们都知道存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的为了安全性考虑我们通常会把jsp文件放在WEB-INF目录下而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。下面是一个InternalResourceViewResolver的定义根据该定义当返回的逻辑视图名称是test的时候InternalResourceViewResolver会给它加上定义好的前缀和后缀组成“/WEB-INF/test.jsp”的形式然后把它当做一个InternalResourceView的url新建一个InternalResourceView对象返回。 Xml代码   bean classorg.springframework.web.servlet.view.InternalResourceViewResolver     property nameprefix value/WEB-INF//     property namesuffix value.jsp/property  /bean     XmlViewResolver它继承自AbstractCachingViewResolver抽象类所以它也是支持视图缓存的。XmlViewResolver需要给定一个xml配置文件该文件将使用和Spring的bean工厂配置文件一样的DTD定义所以其实该文件就是用来定义视图的bean对象的。在该文件中定义的每一个视图的bean对象都给定一个名字然后XmlViewResolver将根据Controller处理器方法返回的逻辑视图名称到XmlViewResolver指定的配置文件中寻找对应名称的视图bean用于处理视图。该配置文件默认是/WEB-INF/views.xml文件如果不使用默认值的时候可以在XmlViewResolver的location属性中指定它的位置。XmlViewResolver还实现了Ordered接口因此我们可以通过其order属性来指定在ViewResolver链中它所处的位置order的值越小优先级越高。以下是使用XmlViewResolver的一个示例 1在SpringMVC的配置文件中加入XmlViewResolver的bean定义。使用location属性指定其配置文件所在的位置order属性指定当有多个ViewResolver的时候其处理视图的优先级。关于ViewResolver链的问题将在后续内容中讲到。 Xml代码   bean classorg.springframework.web.servlet.view.XmlViewResolver     property namelocation value/WEB-INF/views.xml/     property nameorder value1/  /bean     2在XmlViewResolver对应的配置文件中配置好所需要的视图定义。在下面的代码中我们就配置了一个名为internalResource的InternalResourceView其url属性为“/index.jsp”。 Xml代码   ?xml version1.0 encodingUTF-8?  beans xmlnshttp://www.springframework.org/schema/beans      xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance      xsi:schemaLocationhttp://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd      bean idinternalResource classorg.springframework.web.servlet.view.InternalResourceView         property nameurl value/index.jsp/      /bean  /beans     3定义一个返回的逻辑视图名称为在XmlViewResolver配置文件中定义的视图名称——internalResource。 Java代码   RequestMapping(/xmlViewResolver)  public String testXmlViewResolver() {     return internalResource;  }     4这样当我们访问到上面定义好的testXmlViewResolver处理器方法的时候返回的逻辑视图名称为“internalResource”这时候Spring就会到定义好的views.xml中寻找id或name为“internalResource”的bean对象予以返回这里Spring找到的是一个url为“/index.jsp”的InternalResourceView对象。 BeanNameViewResolver这个视图解析器跟XmlViewResolver有点类似也是通过把返回的逻辑视图名称去匹配定义好的视图bean对象。不同点有二一是BeanNameViewResolver要求视图bean对象都定义在Spring的application context中而XmlViewResolver是在指定的配置文件中寻找视图bean对象二是BeanNameViewResolver不会进行视图缓存。看一个例子在SpringMVC的配置文件中定义了一个BeanNameViewResolver视图解析器和一个id为test的InternalResourceview bean对象。 Xml代码   bean classorg.springframework.web.servlet.view.BeanNameViewResolver     property nameorder value1/  /bean    bean idtest classorg.springframework.web.servlet.view.InternalResourceView     property nameurl value/index.jsp/  /bean     这样当返回的逻辑视图名称是 test的时候就会解析为上面定义好id为test的InternalResourceView。 ResourceBundleViewResolver它和XmlViewResolver一样也是继承自AbstractCachingViewResolver但是它缓存的不是视图这个会在后面有说到。和XmlViewResolver一样它也需要有一个配置文件来定义逻辑视图名称和真正的View对象的对应关系不同的是ResourceBundleViewResolver的配置文件是一个属性文件而且必须是放在classpath路径下面的默认情况下这个配置文件是在classpath根目录下的views.properties文件如果不使用默认值的话则可以通过属性baseName或baseNames来指定。baseName只是指定一个基名称Spring会在指定的classpath根目录下寻找以指定的baseName开始的属性文件进行View解析如指定的baseName是base那么base.properties、baseabc.properties等等以base开始的属性文件都会被Spring当做ResourceBundleViewResolver解析视图的资源文件。ResourceBundleViewResolver使用的属性配置文件的内容类似于这样 Properties代码   resourceBundle.(class)org.springframework.web.servlet.view.InternalResourceView  resourceBundle.url/index.jsp  test.(class)org.springframework.web.servlet.view.InternalResourceView  test.url/test.jsp     在这个配置文件中我们定义了两个InternalResourceView对象一个的名称是resourceBundle对应URL是/index.jsp另一个名称是test对应的URL是/test.jsp。从这个定义来看我们可以知道resourceBundle是对应的视图名称使用resourceBundle.(class)来指定它对应的视图类型resourceBundle.url指定这个视图的url属性。会思考的读者看到这里可能会有这样一个问题为什么resourceBundle的class属性要用小括号包起来而它的url属性就不需要呢这就需要从ResourceBundleViewResolver进行视图解析的方法来说了。ResourceBundleViewResolver还是通过bean工厂来获得对应视图名称的视图bean对象来解析视图的。那么这些bean从哪里来呢就是从我们定义的properties属性文件中来。在ResourceBundleViewResolver第一次进行视图解析的时候会先new一个BeanFactory对象然后把properties文件中定义好的属性按照它自身的规则生成一个个的bean对象注册到该BeanFactory中之后会把该BeanFactory对象保存起来所以ResourceBundleViewResolver缓存的是BeanFactory而不是直接的缓存从BeanFactory中取出的视图bean。然后会从bean工厂中取出名称为逻辑视图名称的视图bean进行返回。接下来就讲讲Spring通过properties文件生成bean的规则。它会把properties文件中定义的属性名称按最后一个点“.”进行分割把点前面的内容当做是bean名称点后面的内容当做是bean的属性。这其中有几个特别的属性Spring把它们用小括号包起来了这些特殊的属性一般是对应的attribute但不是bean对象所有的attribute都可以这样用。其中(class)是一个除了(class)之外还有(scope)、(parent)、(abstract)、(lazy-init)。而除了这些特殊的属性之外的其他属性Spring会把它们当做bean对象的一般属性进行处理就是bean对象对应的property。所以根据上面的属性配置文件将生成如下两个bean对象 Xml代码   bean idresourceBundle classorg.springframework.web.servlet.view.InternalResourceView     property nameurl value/index.jsp/  /bean    bean idtest classorg.springframework.web.servlet.view.InternalResourceView     property nameurl value/test.jsp/  /bean     从ResourceBundleViewResolver使用的配置文件我们可以看出它和XmlViewResolver一样可以解析多种不同类型的View因为它们的View是通过配置的方式指定的这也就意味着我们可以指定A视图是InternalResourceViewB视图是JstlView。 来看下面这个一个例子我在SpringMVC的配置文件中定义了一个ResourceBundleViewResolver对象指定其baseName为views然后order为1。 Xml代码   bean classorg.springframework.web.servlet.view.ResourceBundleViewResolver     property namebasename valueviews/     property nameorder value1/  /bean     我在classpath的根目录下有两个属性文件一个是views.properties一个是views_abc.properties它们的内容分别如下 views.properties Properties代码   resourceBundle.(class)org.springframework.web.servlet.view.InternalResourceView  resourceBundle.url/index.jsp  test.(class)org.springframework.web.servlet.view.InternalResourceView  test.url/test.jsp     views_abc.properties Properties代码   abc.(class)org.springframework.web.servlet.view.InternalResourceView  abc.url/abc.jsp     定义了如下这样一个Controller它有三个处理器方法。 Java代码   Controller  RequestMapping(/mytest)  public class MyController {      RequestMapping(resourceBundle)      public String resourceBundle() {         return resourceBundle;      }        RequestMapping(testResourceBundle)      public String testResourceBundle() {         return test;      }        RequestMapping(abc)      public String abc() {         return abc;      }    }     那么当我们请求/mytest/resourceBundle.do的时候ResourceBundleViewResolver会首先尝试着来解析该视图这里Controller处理器方法返回的逻辑视图名称是resourceBundleResourceBundleViewResolver按照上面提到的解析方法进行解析这个时候它发现它是可以解析的然后就返回了一个url为/index.jsp的InternalResourceView对象。同样请求/mytest/testResourceBundle.do返回的逻辑视图test和/mytest/abc.do返回的逻辑视图abc它都可以解析。当我们把basename指定为包的形式如“com.tiantian.views”的时候Spring会按照点“.”划分为目录的形式到classpath相应目录下去寻找basename开始的配置文件如上面我们指定basename为“com.tiantian.views”那么spring就会到classpath下的com/tiantian目录下寻找文件名以views开始的properties文件作为解析视图的配置文件。 FreeMarkerViewResolver、VolocityViewResolver这两个视图解析器都是UrlBasedViewResolver的子类。FreeMarkerViewResolver会把Controller处理方法返回的逻辑视图解析为FreeMarkerView而VolocityViewResolver会把返回的逻辑视图解析为VolocityView。因为这两个视图解析器类似所以这里我就只挑FreeMarkerViewResolver来做一个简单的讲解。FreeMarkerViewResolver和VilocityViewResolver都继承了UrlBasedViewResolver。 对于FreeMarkerViewResolver而言它会按照UrlBasedViewResolver拼接URL的方式进行视图路径的解析。但是使用FreeMarkerViewResolver的时候不需要我们指定其viewClass因为FreeMarkerViewResolver中已经把viewClass定死为FreeMarkerView了。 我们先在SpringMVC的配置文件里面定义一个FreeMarkerViewResolver视图解析器并定义其解析视图的order顺序为1。 Xml代码   bean classorg.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver     property nameprefix valuefm_/     property namesuffix value.ftl/     property nameorder value1/  /bean     那么当我们请求的处理器方法返回一个逻辑视图名称viewName的时候就会被该视图处理器加上前后缀解析为一个url为“fm_viewName.ftl”的FreeMarkerView对象。对于FreeMarkerView我们需要给定一个FreeMarkerConfig的bean对象来定义FreeMarker的配置信息。FreeMarkerConfig是一个接口Spring已经为我们提供了一个实现它就是FreeMarkerConfigurer。我们可以通过在SpringMVC的配置文件里面定义该bean对象来定义FreeMarker的配置信息该配置信息将会在FreeMarkerView进行渲染的时候使用到。对于FreeMarkerConfigurer而言我们最简单的配置就是配置一个templateLoaderPath告诉Spring应该到哪里寻找FreeMarker的模板文件。这个templateLoaderPath也支持使用“classpath:”和“file:”前缀。当FreeMarker的模板文件放在多个不同的路径下面的时候我们可以使用templateLoaderPaths属性来指定多个路径。在这里我们指定模板文件是放在“/WEB-INF/freemarker/template”下面的。 Xml代码   bean classorg.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer     property nametemplateLoaderPath value/WEB-INF/freemarker/template/  /bean     接下来我们定义如下一个Controller Java代码   Controller  RequestMapping(/mytest)  public class MyController {        RequestMapping(freemarker)      public ModelAndView freemarker() {         ModelAndView mav  new ModelAndView();         mav.addObject(hello, andy);         mav.setViewName(freemarker);         return mav;      }    }     由上面的定义我们可以看到这个Controller的处理器方法freemarker返回的逻辑视图名称是“freemarker”。那么如果我们需要把该freemarker视图交给FreeMarkerViewResolver来解析的话我们就需要根据上面的定义在模板路径下定义视图对应的模板即在“/WEB-INF/freemarker/template”目录下建立fm_freemarker.ftl模板文件。这里我们定义其内容如下 Ftl代码   html      head         titleFreeMarker/title      /head      body         bHello World/b         font colorredHello World!/font         ${hello}      /body  /html     经过上面的定义当我们访问/mytest/freemarker.do的时候就会返回一个逻辑视图名称为“freemarker”的ModelAndView对象根据定义好的视图解析的顺序首先进行视图解析的是FreeMarkerViewResolver这个时候FreeMarkerViewResolver会试着解析该视图根据它自身的定义它会先解析到该视图的URL为fm_freemarker.ftl然后它会看是否能够实例化该视图对象即在定义好的模板路径下是否有该模板存在如果有则返回该模板对应的FreeMarkerView。在这里的话/WEB-INF/freemarker/template目录下是存在模板文件fm_freemarker.ftl的所以会返回一个url为fm_freemarker.ftl的FreeMarkerView对象。接着FreeMarkerView就可以利用该模板文件进行视图的渲染了。所以访问结果应该如下所示    视图解析器链        在SpringMVC中可以同时定义多个ViewResolver视图解析器然后它们会组成一个ViewResolver链。当Controller处理器方法返回一个逻辑视图名称后ViewResolver链将根据其中ViewResolver的优先级来进行处理。所有的ViewResolver都实现了Ordered接口在Spring中实现了这个接口的类都是可以排序的。在ViewResolver中是通过order属性来指定顺序的默认都是最大值。所以我们可以通过指定ViewResolver的order属性来实现ViewResolver的优先级order属性是Integer类型order越小对应的ViewResolver将有越高的解析视图的权利所以第一个进行解析的将是ViewResolver链中order值最小的那个。当一个ViewResolver在进行视图解析后返回的View对象是null的话就表示该ViewResolver不能解析该视图这个时候如果还存在其他order值比它大的ViewResolver就会调用剩余的ViewResolver中的order值最小的那个来解析该视图依此类推。当ViewResolver在进行视图解析后返回的是一个非空的View对象的时候就表示该ViewResolver能够解析该视图那么视图解析这一步就完成了后续的ViewResolver将不会再用来解析该视图。当定义的所有ViewResolver都不能解析该视图的时候Spring就会抛出一个异常。        基于Spring支持的这种ViewResolver链模式我们就可以在SpringMVC应用中同时定义多个ViewResolver给定不同的order值这样我们就可以对特定的视图特定处理以此来支持同一应用中有多种视图类型。注意像InternalResourceViewResolver这种能解析所有的视图即永远能返回一个非空View对象的ViewResolver一定要把它放在ViewResolver链的最后面。   Xml代码   bean classorg.springframework.web.servlet.view.XmlViewResolver     property namelocation value/WEB-INF/views.xml/     property nameorder value1/  /bean    bean     classorg.springframework.web.servlet.view.UrlBasedViewResolver     property nameprefix value/WEB-INF/ /     property namesuffix value.jsp /     property nameviewClass valueorg.springframework.web.servlet.view.InternalResourceView/  /bean  转载于:https://www.cnblogs.com/renpei/p/5682025.html
http://www.pierceye.com/news/89816/

相关文章:

  • 网站怎么盈利好的外贸网站特点
  • 苏州市住房城乡建设局网站个人博客模板
  • 网站开发流程说明上市公司中 哪家网站做的好
  • 天津网站优化公司哪家好wordpress安装出问题
  • ps做网站ui左右布局的网站
  • 电子产品网站设计珠海找工作哪个网站好
  • 烟台专业做网站推介网官网
  • 学院网站群建设福建抖音代运营开户
  • 站长工具之家seo查询开发工具在哪里找
  • 网站开发搜索功能怎样搭建免费网站
  • 做服务的网站吗wordpress调用最新文章模板
  • 做兼职的国外网站经典广告
  • 公司网站自己可以学习优化吗最优秀的佛山网站建设
  • 多元网站收费网站怎么做
  • 国外数据网站seo公司赚钱吗
  • 青岛网站设计公司哪家好jsp网站开发实训
  • 集团制度建设网站app网站开发哪家好
  • 南京做网站设计网站开发可行性分析报告范文
  • 网站建设的税率是多少wordpress wp-config
  • html网站引导页模板龙岗中学
  • 观澜网站制作国家商标注册查询网
  • 财政局网站建设方案移动端是不是手机端
  • 自己做的网站怎么上传网络wordpress super cache
  • php做网站用什么软件好广州优俊网站制作公司
  • 建筑资源网站福田网站开发
  • 网站站点风格网站建设的seo策略
  • 网站建设计划 文库如何在电脑上打开自己做的网站
  • 无极网站网站访问流程
  • 为什么要建设就业指导网站轻量wordpress主题
  • 做兼职打字员的网站多媒体网站建设