首页 > 其他分享 >spring的ModelAndView

spring的ModelAndView

时间:2023-07-24 23:05:27浏览次数:35  
标签:URL spring 视图 Controller MVC Spring ModelAndView



Spring入门19 - ModelAndView类别

入门 19 - ModelAndView类别

 ModelAndView类别就如其名称所示,是代表了MVC Web程序中Model与View的对象,不过它只是方便您一次返回这两个对象的holder,Model与View两者仍是分离的概念。
 最简单的ModelAndView是持有View的名称返回,之后View名称被view resolver,也就是实作org.springframework.web.servlet.View接口的实例解析,例如 InternalResourceView或JstlView等等:

ModelAndView(String viewName)

 如果您要返回Model对象,则可以使用Map来收集这些Model对象,然后设定给ModelAndView,使用下面这个版本的ModelAndView:

ModelAndView(String viewName, Map model)

 Map对象中设定好key与value值,之后可以在视图中取出,如果您只是要返回一个Model对象,则可以使用下面这个ModelAndView版本:

ModelAndView(String viewName, String modelName, Object modelObject)

 藉由modelName,您可以在视图中取出Model并显示。
 ModelAndView类别提供实作View接口的对象来作View的参数:

ModelAndView(View view) 
ModelAndView(View view, Map model) 
ModelAndView(View view, String modelName, Object modelObject)

 一个例子是org.springframework.web.servlet.view.RedirectView,ModelAndView预设是使 用forward来转发请求结果至视图,使用RedirectView的话,则会使用redirect将请求重导至视图,例如:

… 
public ModelAndView handleRequest(....) … { 
    .... 
    
    return new ModelAndView(new RedirectView(this.getViewPage())); 
} 
....

 在这边,viewPage的地址是从服务器网页根目录开始指定,而不是Web应用程序的根目录,所以您的getViewPage()传回的地址必须像是 /springapp/pages/index.htm这样的地址,其中springapp是您的Web应用程序目录。
 使用forward的话,网址列上并不会出现被转发的目标地址,而且forward是在Web应用程序之内进行,可以访问Web应用程序的隐藏目录,像是WEB-INF,然而forward只能在Web应用程序中进行,不能指定至其它的Web应用程序地址。
 使用redirect的话,是要求客户端浏览器重新发出一个指定的请求地址,因此网址列上会出现被重导的目录地址,重导的请求是由浏览器发出,所以不能 访问Web应用程序中的隐藏目录,像是WEB-INF,然而重导是重新要求一个网页,所以可以指定至其它的Web应用程序地址。
 DispatcherServlet会根据传回的ModelAndView来解析View名称,并处理给予的Model。View名称的解析是委托给实 作org.springframework.web.servlet.ViewResolver接口的实例,ViewResolver接口定义如下:

public interface ViewResolver { 
    public view resolveViewName(String, Locale locale) throws ServletException; 
}

 ViewResolver的一个实例是InternalResourceViewResolver,名称解析完之后,实际的View绘制与Model转 换处理是交给实作org.springframework.web.servlet.View的实例,View接口如下:

public interface View { 
    public void render(Map model, HttpServletResquest resquest, HttpServletResponse response) throws ServletException, IOException; 
}

 View的实作之前用过org.springframework.web.servlet.view.InternalResourceView,另外也还有JstlView、TilesView、VelocityView等等的实作,分别进行不同的表现展处理。

Spring学习日记 - ModelAndView的构造

    ModelAndView的构造方法有7个。但是它们都是相通的。这里使用无参构造函数来举例说明如何构造ModelAndView实例。
   
ModelAndView()
    这个构造方法构造出来的ModelAndView不能直接使用,应为它没有指定view,也没有绑定对应的model对象。当然,model对象不是必须的,但是view确实必须的。
    用这个构造方法构造的实例主要用来在以后往其中加view设置和model对象。
   
    给ModelAndView实例设置view的方法有两个:setViewName(String viewName) 和 setView(View view)。前者是使用view name,后者是使用预先构造好的View对象。其中前者比较常用。事实上View是一个接口,而不是一个可以构造的具体类,我们只能通过其他途径来获取View的实例。对于view name,它既可以是jsp的名字,也可以是tiles定义的名字,取决于使用的ViewNameResolver如何理解这个view name。

    如何获取View的实例以后再研究。

而对应如何给ModelAndView实例设置model则比较复杂。有三个方法可以使用:

addObject(Object modelObject) 
 
 addObject(String modelName, Object modelObject) 
 
 addAllObjects(Map modelMap)


ModelAndView可以接收Object类型的对象,ModelAndView将它视为其众多model中的一个。当使用Object类型的对象的时候,必须指定一个名字。ModelAndView也可以接收没有明显名字的对象,原因在于ModelAndView将调用spring自己定义的Conventions 类的.getVariableName()方法来为这个model生成一个名字。显然,对model而言,名字是必须的。
Conventions.getVariableName()生成名字的规则是使用对象的类名的小写模式来作model名字。当这个model是集合或数组的时候,使用集合的第一个元素的类名加s来作model的名字。
ModelAndView也可以接收Map类型的对象,ModelAndView将这个Map中的元素视为model,而不是把这个Map本身视为model。但是其他的集合类可以用本身作为model对象。

实际上,ModelAndView对model的支持来自于类ModelMap,这个类继承自HashMap。


 

==============



Spring MVC的实现原理


          Spring提供了DispatcherServlet,这个类不仅负责实现请求转发,还负责启动一个WebApplicationContext容器。 按照Spring一贯的IoC哲学,所有的Controller都是JavaBean,并由IoC容器统一管理。对于View,则采取了更灵活的处理方 式,Spring MVC允许使用不同的View实现,除了JSP外,还可以使用Velocity、Freemaker、XSLT等多种View技术。

总的来讲,要使用Spring MVC框架,需要以下步骤。

① 在web.xml中配置DispatcherServlet及URL映射。

② 编写IoC容器需要的XML配置文件,命名为<servlet-name>-servlet.xml,放到/WEB-INF目录下。例如,如果DispatcherServlet在web.xml中的配置名称为dispatcher,则Spring将寻找dispatcher- servlet.xml配置文件。

③ 在XML配置文件中定义URL映射方式和使用哪种View技术。

我们仍以SimpleMVC为基础,用Spring MVC框架来实现这个Web应用程序。在Eclipse中创建一个SpringMVC项目,结构如图7-21所示。

/web/WEB-INF/lib目录下的jstl.jar和standard.jar是JSP标准标签库,将在JSP视图中用到,/web/WEB-INF/c.tld是标签库的声明文件,稍后我们会在JSP视图文件中用到它们。

一、  配置DispatcherServlet

首先,在web.xml中配置DispatcherServlet,并将所有以“.html”结尾的URL全部映射到DispatcherServlet上,这样,用户仅从URL地址上无法得知服务器端后台使用了何种技术。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <!-- spring dispatch servlet -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</ servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    <!-- 申明taglib,将在JSP中使用 -->
    <taglib>
        <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
        <taglib-location>/WEB-INF/c.tld</taglib-location>
    </taglib>
</web-app>

和普 通的Spring应用程序稍有不同,对于Web应用程序,Spring的ApplicationContext是由DispatcherServlet加 载的,它会在/WEB-INF/下查找一个名称为<servletName> -servlet.xml的XML配置文件来初始化Spring Web应用程序的ApplicationContext。对于上例,我们在web.xml中定义DispatcherServlet的名称为 dispatcher,因此,相应的XML配置文件就必须是/WEB-INF/dispatcher-servlet.xml。

下一步便是编写dispatcher-servlet.xml配置文件,首先定义URL的映射方式(HandlerMapping)。Spring提供了几种常用的HandlerMapping。

1.使用SimpleUrlHandlerMapping

SimpleUrlHandlerMapping提供了最简单的URL映射,通过Properties将URL和Controller对应起来,配置示例如下。

<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet. handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/a.html">controllerA</prop>
            <prop key="/b.html">controllerB</prop>
        </props>
    </property>
</bean>

这种方式和Struts的配置类似。当用户请求一个URL时,Spring就在SimpleUrl HandlerMapping注入的Properties中查找对应的Controller。

2.使用BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping的实现更为简单,每个Controller的URL与其name属性对应,因此,只需要对每个Controller以URL作为name,就可以实现URL映射。配置示例如下。

<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet. handler.BeanNameHandlerMapping" />
<bean name="/a.html" class="example.chapter7.ControllerA" />
<bean name="/a.html" class="example.chapter7.ControllerB" />

之所以用Bean的name作为URL而不是id,是因为XML规范不允许在id标识中使用特殊字符“/”。当用户请求一个URL时,Spring将直接查找name为URL的Controller。

使用 SimpleUrlHandlerMapping的麻烦之处在于,添加或删除Controller时必须要对 SimpleUrlHandlerMapping做相应的修改,而BeanNameUrlHandlerMapping则无需手工编写映射,只需要在每个 Controller中仔细定义name属性。如果使用XDoclet自动生成配置文件,则可以将name在Controller的注释中定义,维护起来 更加方便。因此,我们推荐首先考虑使用BeanNameUrlHandlerMapping。事实上,如果没有在XML配置文件中定义任何 UrlHandlerMapping,则Spring MVC默认使用BeanNameUrlHandlerMapping。

Spring还提供了一个 ControllerClassNameHandlerMapping,它和BeanName UrlHandlerMapping类似,不过是将Controller的ClassName和对应的URL关联起来,由于这种方式灵活性欠佳,实际使用 较少。

也可以混合使用多种 UrlHandlerMapping,但是必须为每个UrlHandlerMapping指定order属性来表示优先级,order值越小优先级越高, Spring会先查询优先级高的UrlHandlerMapping。若找到了对应的Controller,就不再继续查询,否则,按照优先级依次查询, 直到找到为止。若所有的UrlHandlerMapping都无法返回一个合适的Controller,并且没有设置默认的Controller时,就会 返回给客户端一个“404 Not Found”错误,表示不存在这个URL。

下一步需要为Spring MVC指定一个ViewResolver(视图解析器),指示使用何种视图技术,以及如何解析ModelAndView返回的逻辑视图名称。

这里我们直接给出使用JSP视图的配置,对于其他的视图技术将会在后面讲到。

<bean id="viewResolver" class="org.springframework.web.servlet.view. InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet. view.JstlView" />
    <property name="prefix" value="/" />
    <property name="suffix" value=".jsp" />
</bean>

prefix和suffix将和逻辑视图名称一起组合成为实际视图的路径。例如,对于上例,若返回一个new ModelAndView("test", model),则实际的视图路径由prefix+逻辑视图名+suffix这3部分构成。

/test.jsp

定义 前缀(prefix)使得视图文件无论放在何处都可以通过修改前缀来实现位置无关性(当然,必须在web目录内),许多应用程序将其放在/WEB-INF 目录下,使得用户无法通过URL直接访问视图文件以保证视图文件的安全;定义后缀(suffix)可以在将来用另一种视图技术(例如,Velocity) 取代现在的JSP视图,只需将后缀从“.jsp”更改为“.vm”即可,而不必更改源代码中的逻辑视图名。总之,一切目标都是为了实现最大限度的解耦。

二、实现Controller

实现了org.springframework.web.servlet.mvc.Controller接口的Bean都可以作为有效的Controller来处理用户请求。例如,一个最简单的TestController。

public class TestController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServlet Response response) throws Exception {
        String name = request.getParameter("name");
        if(name==null)
            name = "spring";
        Map model = new HashMap();
        model.put("name", name);
        model.put("time", new Date());
        return new ModelAndView("test", model);
    }
}

注 意,上例的Controller接口和返回值ModelAndView都是在Spring框架中定义的,这和SimpleMVC项目中我们自己定义的 Controller接口和ModelAndView类所在的包是不同的。在SimpleMVC项目中,我们并没有使用Spring MVC,而是借用Spring MVC的概念自定义接口。在现在的SpringMVC项目中,我们没有自定义任何接口,而是直接使用Spring MVC框架来实现Web应用程序,这一点请读者务必区分清楚。

另外需要注意的是,ModelAndView返回的逻辑视图是“test”,还记得在viewResolver中定义的prefix和suffix吗?实际的视图名称由这3部分构成便是“/test.jsp”。

最后将这个TestController作为Bean定义在dispatcher-servlet.xml中,由于我们准备使用默认的BeanNameUrlHandlerMapping,因此,需要在Bean的name中指定URL。

<bean name="/test.html" class="example.chapter7.TestController" />
完整的dispatcher-servlet.xml配置文件的内容如下。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="/test.html" class="example.chapter7.TestController" />
    <bean id="viewResolver" class="org.springframework.web.servlet.view. InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet. view.JstlView" />
        <property name="prefix" value="/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

注意,我们没有指定UrlHandlerMapping,Spring会自动使用默认的BeanNameUrl HandlerMapping。

三、  实现View

到目前为止,我们已经编写了 Controller的实现和配置文件,最后一步是编写一个JSP文件作为视图。由于采用了MVC架构,视图的任务只有一个,就是将Controller 返回的Model渲染出来。Spring MVC会将Model中的所有数据全部绑定到HttpServlet Request中,然后将其转发给JSP,JSP只需将数据显示出来即可。

通过JSTL标签库能进一步简化显示逻辑,我们看看如何显示TestController返回的Model。test.jsp文件的内容如下。

<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<html>
    <head>
        <title>SpringMVC</title>
    </head>
    <body>
        <h3>Hello, <c:out value="${name}" />,
        it is <c:out value="${time}" /></h3>
    </body>
</html>

现在,Spring MVC所需的所有组件都已编写并配置完毕,我们先来回顾一下Spring MVC的处理流程,如图7-22所示。

将SpringMVC工程的编译输出目录设置为/web/WEB-INF/classes,然后编译工程,打开浏览器,测试我们编写的SpringMVC,结果如图7-23所示。

图7-23

现在,读者对Spring的MVC框架应该有了一个初步的认识。实际上,除了基本的MVC标准流程外,Spring MVC还提供了相当多的功能,下面我们将逐一介绍Spring MVC提供的各种丰富的Controller、拦截器和异常处理机制。


 

          Spring提供了DispatcherServlet,这个类不仅负责实现请求转发,还负责启动一个WebApplicationContext容器。 按照Spring一贯的IoC哲学,所有的Controller都是JavaBean,并由IoC容器统一管理。对于View,则采取了更灵活的处理方 式,Spring MVC允许使用不同的View实现,除了JSP外,还可以使用Velocity、Freemaker、XSLT等多种View技术。

总的来讲,要使用Spring MVC框架,需要以下步骤。

① 在web.xml中配置DispatcherServlet及URL映射。

② 编写IoC容器需要的XML配置文件,命名为<servlet-name>-servlet.xml,放到/WEB-INF目录下。例如,如果DispatcherServlet在web.xml中的配置名称为dispatcher,则Spring将寻找dispatcher- servlet.xml配置文件。

③ 在XML配置文件中定义URL映射方式和使用哪种View技术。

我们仍以SimpleMVC为基础,用Spring MVC框架来实现这个Web应用程序。在Eclipse中创建一个SpringMVC项目,结构如图7-21所示。

/web/WEB-INF/lib目录下的jstl.jar和standard.jar是JSP标准标签库,将在JSP视图中用到,/web/WEB-INF/c.tld是标签库的声明文件,稍后我们会在JSP视图文件中用到它们。

一、  配置DispatcherServlet

首先,在web.xml中配置DispatcherServlet,并将所有以“.html”结尾的URL全部映射到DispatcherServlet上,这样,用户仅从URL地址上无法得知服务器端后台使用了何种技术。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <!-- spring dispatch servlet -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</ servlet-class>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    <!-- 申明taglib,将在JSP中使用 -->
    <taglib>
        <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
        <taglib-location>/WEB-INF/c.tld</taglib-location>
    </taglib>
</web-app>

和普 通的Spring应用程序稍有不同,对于Web应用程序,Spring的ApplicationContext是由DispatcherServlet加 载的,它会在/WEB-INF/下查找一个名称为<servletName> -servlet.xml的XML配置文件来初始化Spring Web应用程序的ApplicationContext。对于上例,我们在web.xml中定义DispatcherServlet的名称为 dispatcher,因此,相应的XML配置文件就必须是/WEB-INF/dispatcher-servlet.xml。

下一步便是编写dispatcher-servlet.xml配置文件,首先定义URL的映射方式(HandlerMapping)。Spring提供了几种常用的HandlerMapping。

1.使用SimpleUrlHandlerMapping

SimpleUrlHandlerMapping提供了最简单的URL映射,通过Properties将URL和Controller对应起来,配置示例如下。

<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet. handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/a.html">controllerA</prop>
            <prop key="/b.html">controllerB</prop>
        </props>
    </property>
</bean>

这种方式和Struts的配置类似。当用户请求一个URL时,Spring就在SimpleUrl HandlerMapping注入的Properties中查找对应的Controller。

2.使用BeanNameUrlHandlerMapping

BeanNameUrlHandlerMapping的实现更为简单,每个Controller的URL与其name属性对应,因此,只需要对每个Controller以URL作为name,就可以实现URL映射。配置示例如下。

<bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet. handler.BeanNameHandlerMapping" />
<bean name="/a.html" class="example.chapter7.ControllerA" />
<bean name="/a.html" class="example.chapter7.ControllerB" />

之所以用Bean的name作为URL而不是id,是因为XML规范不允许在id标识中使用特殊字符“/”。当用户请求一个URL时,Spring将直接查找name为URL的Controller。

使用 SimpleUrlHandlerMapping的麻烦之处在于,添加或删除Controller时必须要对 SimpleUrlHandlerMapping做相应的修改,而BeanNameUrlHandlerMapping则无需手工编写映射,只需要在每个 Controller中仔细定义name属性。如果使用XDoclet自动生成配置文件,则可以将name在Controller的注释中定义,维护起来 更加方便。因此,我们推荐首先考虑使用BeanNameUrlHandlerMapping。事实上,如果没有在XML配置文件中定义任何 UrlHandlerMapping,则Spring MVC默认使用BeanNameUrlHandlerMapping。

Spring还提供了一个 ControllerClassNameHandlerMapping,它和BeanName UrlHandlerMapping类似,不过是将Controller的ClassName和对应的URL关联起来,由于这种方式灵活性欠佳,实际使用 较少。

也可以混合使用多种 UrlHandlerMapping,但是必须为每个UrlHandlerMapping指定order属性来表示优先级,order值越小优先级越高, Spring会先查询优先级高的UrlHandlerMapping。若找到了对应的Controller,就不再继续查询,否则,按照优先级依次查询, 直到找到为止。若所有的UrlHandlerMapping都无法返回一个合适的Controller,并且没有设置默认的Controller时,就会 返回给客户端一个“404 Not Found”错误,表示不存在这个URL。

下一步需要为Spring MVC指定一个ViewResolver(视图解析器),指示使用何种视图技术,以及如何解析ModelAndView返回的逻辑视图名称。

这里我们直接给出使用JSP视图的配置,对于其他的视图技术将会在后面讲到。

<bean id="viewResolver" class="org.springframework.web.servlet.view. InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet. view.JstlView" />
    <property name="prefix" value="/" />
    <property name="suffix" value=".jsp" />
</bean>

prefix和suffix将和逻辑视图名称一起组合成为实际视图的路径。例如,对于上例,若返回一个new ModelAndView("test", model),则实际的视图路径由prefix+逻辑视图名+suffix这3部分构成。

/test.jsp

定义 前缀(prefix)使得视图文件无论放在何处都可以通过修改前缀来实现位置无关性(当然,必须在web目录内),许多应用程序将其放在/WEB-INF 目录下,使得用户无法通过URL直接访问视图文件以保证视图文件的安全;定义后缀(suffix)可以在将来用另一种视图技术(例如,Velocity) 取代现在的JSP视图,只需将后缀从“.jsp”更改为“.vm”即可,而不必更改源代码中的逻辑视图名。总之,一切目标都是为了实现最大限度的解耦。

二、实现Controller

实现了org.springframework.web.servlet.mvc.Controller接口的Bean都可以作为有效的Controller来处理用户请求。例如,一个最简单的TestController。

public class TestController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request, HttpServlet Response response) throws Exception {
        String name = request.getParameter("name");
        if(name==null)
            name = "spring";
        Map model = new HashMap();
        model.put("name", name);
        model.put("time", new Date());
        return new ModelAndView("test", model);
    }
}

注 意,上例的Controller接口和返回值ModelAndView都是在Spring框架中定义的,这和SimpleMVC项目中我们自己定义的 Controller接口和ModelAndView类所在的包是不同的。在SimpleMVC项目中,我们并没有使用Spring MVC,而是借用Spring MVC的概念自定义接口。在现在的SpringMVC项目中,我们没有自定义任何接口,而是直接使用Spring MVC框架来实现Web应用程序,这一点请读者务必区分清楚。

另外需要注意的是,ModelAndView返回的逻辑视图是“test”,还记得在viewResolver中定义的prefix和suffix吗?实际的视图名称由这3部分构成便是“/test.jsp”。

最后将这个TestController作为Bean定义在dispatcher-servlet.xml中,由于我们准备使用默认的BeanNameUrlHandlerMapping,因此,需要在Bean的name中指定URL。

<bean name="/test.html" class="example.chapter7.TestController" />
完整的dispatcher-servlet.xml配置文件的内容如下。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean name="/test.html" class="example.chapter7.TestController" />
    <bean id="viewResolver" class="org.springframework.web.servlet.view. InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet. view.JstlView" />
        <property name="prefix" value="/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

注意,我们没有指定UrlHandlerMapping,Spring会自动使用默认的BeanNameUrl HandlerMapping。

三、  实现View

到目前为止,我们已经编写了 Controller的实现和配置文件,最后一步是编写一个JSP文件作为视图。由于采用了MVC架构,视图的任务只有一个,就是将Controller 返回的Model渲染出来。Spring MVC会将Model中的所有数据全部绑定到HttpServlet Request中,然后将其转发给JSP,JSP只需将数据显示出来即可。

通过JSTL标签库能进一步简化显示逻辑,我们看看如何显示TestController返回的Model。test.jsp文件的内容如下。

<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<html>
    <head>
        <title>SpringMVC</title>
    </head>
    <body>
        <h3>Hello, <c:out value="${name}" />,
        it is <c:out value="${time}" /></h3>
    </body>
</html>

现在,Spring MVC所需的所有组件都已编写并配置完毕,我们先来回顾一下Spring MVC的处理流程,如图7-22所示。

将SpringMVC工程的编译输出目录设置为/web/WEB-INF/classes,然后编译工程,打开浏览器,测试我们编写的SpringMVC,结果如图7-23所示。

图7-23

现在,读者对Spring的MVC框架应该有了一个初步的认识。实际上,除了基本的MVC标准流程外,Spring MVC还提供了相当多的功能,下面我们将逐一介绍Spring MVC提供的各种丰富的Controller、拦截器和异常处理机制。

标签:URL,spring,视图,Controller,MVC,Spring,ModelAndView
From: https://blog.51cto.com/u_16174476/6840237

相关文章

  • spring的view
    http://book.51cto.com/art/200908/147512.htm24.5.1View实现原理回顾总地来说,当前绝大多数的视图渲染技术都是构建在模板的原理上。我们回想一下,这种基于模板的视图生成方式在我们的生活中到处可见。厨师为了能够提供统一样式的蛋糕,会使用模子来制作,只要提供不同成分的面团,经过......
  • springcloudalibaba 从入门到精通进阶学习路线?深入细化讲解
    springcloudalibaba从入门到精通进阶学习路线?深入细化讲解下面是深入细化的SpringCloudAlibaba学习路线:1.学习SpringBoot和SpringCloud基础知识:在开始学习SpringCloudAlibaba之前,你需要先掌握SpringBoot和SpringCloud的基础知识。学习SpringBoot的核心概念、注解、配......
  • SpringMVC
    SpringMVC什么是MVC模型(dao,service)、视图(jsp)、控制器(servlet)假设:你的项目架构,是设计好的还是演进的?演进的回顾ServletMVVM:MVVMViewModel:双向绑定什么是SpringMVCSpringMVC是SpringFramework的一部分,是基于Java实现MVC的轻量级Web框架官方文档:https:......
  • SpringBoot工程官网创建方式
          ......
  • linux下载安装fastdfs和fastdfs与nginx整合、springboot访问fastdfs
    文章目录需求分析分布式文件系统1FastDFS安装FastDFS和nginx整合2.整合java访问fastdfs服务文件上传查询下载测试整合springboot需求分析搭建fastDFS文件服务器1)安装fastDFStracker和storage2)在storageserver上安装nginx在storageserver上安装nginx的目的是对外通过http访问......
  • 1分布式微服务技术栈-SpringCloud<Eureka,Ribbon,nacos>
    微服务技术栈一、微服务介绍了解1架构结构案例与springboot兼容关系拆分案例拆分服务拆分-服务远程调用2eureka注册中心Eureka-提供者与消费者Eureka-eureka原理分析Eureka-搭建eureka服务Eureka-服务注册Eureka-服务发现3Ribbon组件负载均衡Ribbon-负载均衡原理Ribbon-负载......
  • SpringMvc介绍。
    目录1、SpringMvc概述1、基本介绍2、工作流程 3、bean加载控制 二、请求1、请求映射路径2、请求方式3、请求参数4、请求参数(传递json数据)5、日期类型参数传递三、响应四、REST风格1、REST简介2、RESTful入门案例3、RESTful快速开发五、拦截器1、拦截器概念2、拦截器开发3、拦截器......
  • Spring Boot :项目属性配置
        这两天通过查阅了各种资料丰富了之前学习的了SpringBoot的各种东西,浅浅写一篇随笔结合之前学习的基本配置总结下吧。一、SpringBoot的项目属性配置    在之前的学习中很多时候会用到配置的信息,这些信息在测试环境和生产环境中总会有很多不同的配置,在配置完......
  • 连接池与Spring,Hibernate结合
        前几篇关于Java连接池的介绍都是基于Java应用的,而我们常用的场景是与Spring和ORM框架结合,下面就利用实例学习一下这方面的配置。       1.下载相关内容:       c3p0下载地址:http://sourceforge.net/projects/c3p0/       Proxool下载地址:http:/......
  • Caching with Spring Data Redis
    by JoshuaWhite on January25,2013 in JAVAIntheexamplebelow,I’llshowyouhowtousetheSpringData–RedisprojectasacachingproviderfortheSpringCacheAbstractionthatwasintroducedinSpring3.1.Igetalotofquestionsabouthowt......