`
2277259257
  • 浏览: 515157 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SpringMVC----入门

 
阅读更多

Spring mvc在Spring特征里面处于满核心的地位,在官网上的对Spring 特征(FEATURES)罗列中,对应这是“MODERN WEB”(现代web),也就是Spring特征的第一项。也反映了其重要作用,另一方面也是因为mvc在Spring项目中诞生比较早。

只要是同网络应用相关的,无论是有同用户互动的(带UI的)或者没有互动的情况,spring mvc都是种成熟、功能齐全的架构。阅读下面的内容需要对java、spring(依赖注入dependency injection)、servlet需要有些基本的了解。

       Spring的MVC框架如下图所示:

 

在Spring MVC中前端的控制器就是DispatcherServlet这个Servlet来掌管着用户的请求及最后的系统回应。这个DispatcherServlet同具体的业务逻辑一点都不着边,而是把所有的事情委派给控制器去做(Controller),当然DispatcherServlet是知道该把当前的事情交个那个控制器去做,这个后面会讲;然后当控制器把事情都做完了后,这个时候轮到视图(View)上场了,简单的理解好比我们做PPT,那么这里的视图好比PPT里面的模板,它可以把数据以不同的展现形式交给客户,可以是jsp、xml、json等等。下面来看看如何具体实现的:

 

1、Servlet部分上面说到前端控制器是DispatcherServlet这个Servlet,那很显然需要在web.xml中加入一个servlet,然后把用户的请求都让DispatcherServlet去处理,下面是

web.xml文件:
     <servlet> 
        <servlet-name>appServlet</servlet-name> 
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
        <init-param> 
            <param-name>contextConfigLocation</param-name> 
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> 
        </init-param> 
        <load-on-startup>1</load-on-startup> 
    </servlet>        
  
    <servlet-mapping> 
        <servlet-name>appServlet</servlet-name> 
        <url-pattern>/</url-pattern> 
    </servlet-mapping> 
< /web-app> 

这里有个地方就是contextConfigLocation,这个是个初始化参数(init-param),在servlet进行初始化的时候可以设置它的值,而这个值定义了spring应用上下文(context—上下文,指的是一种环境,主要是各种bean,可以理解为各种component)的配置文件(XML格式)的位置,这个上下文会被DispatcherServlet加载进来,这样Dispatcher工作起来时会依照这个上下文的内容进行分配任务。

具体原理可以参考下面这个图:

关于上下文的配置,这里使用的是xml的配置方式,上面代码指定了配置文件是/WEB-INF/spring/appServlet/servlet-context.xml,这个也可以使用java的配置方式,这里需要在DispatcherServlet的初始参数中加入AnnotationConfigWebApplicationContext。另外在下面的例子中我们会看到组件即可以在XML中配置但也可以使用java代码来做。接下来看看第一个controller

 

2、Controller类,下面是一个最mini的控制类了:
 @Controller 
public class HomeController { 
  
    @RequestMapping(value = "/") 
    public String home() { 
        System.out.println("HomeController: Passing through..."); 
        return "WEB-INF/views/home.jsp"; 
    } 

上面这个类中有几个注意的地方:
1、使用了@Controller这个annotation(这个可以翻译成“注释”,表示下面的类的作用)来表示HomeController

      这个类是作为Spring MVC中的Controller(控制器),根据上面的那个图也就是表示这个类具有处理用户请

      求的能力。

      另外@Controller是@Component这个annotation中的特定annotation(有点类似@Component是

      @Controller的父类一样,@Component相当于抽象程度比较高,@Controller是属于一种特定的

      @Component),所以这里HomeController也是作为一个组件(Component),在Spring初始化扫描的时候

      它会被自动检测到并且加入到Spring container中(Spring容器或者叫Spring上下文,都是类似的概念),然

      后生成对应的类实例,最后像其他任何Spring组件一样允许注入到系统中。

2、home这个方法使用了@RequestMapping这个注释,表示home这个方法可以用来处理对应于路径“/”(根

      路径)的用户请求

3、这里home的处理就是在log中打印一个字符串,然后返回WEB-INF/views/home.jsp,这个是交给View去

      处理的,这里就是个jsp文件,默认情况下,如果我们没有设置特定的View的话,Spring会使用默认View

      来处理WEB-INF/views/home.jsp这个Response(回应);对应View在后面将详细讲,这里只要知道View会

      把系统的home.jsp这个文件呈现给客户就好

下面是对应的home.jsp文件:
< %@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
< %@ page session="false" %> 
< html> 
    <head> 
        <title>Home</title> 
    </head> 
    <body> 
        <h1>Hello world!</h1> 
    </body> 
< /html> 


3、配置Spring上下文上面在Servlet中提到的Spring上下文还没有创建(/WEB-INF/spring/appServlet/servlet-context.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" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
  
    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->   
    <!-- Scans within the base package of the application for @Components to configure as beans --> 
    <!-- @Controller, @Service, @Configuration, etc. --> 
    <context:component-scan base-package="xyz.sample.baremvc" /> 
  
    <!-- Enables the Spring MVC @Controller programming model --> 
    <mvc:annotation-driven />   
< /beans> 
1、看到这里xml的根元素是<beans>,所以这里主要涉及创建各种bean,这里的bean其实就是component了

    (组件)。
2、这里一共有三个名字空间,第一个是默认的beans、然后是mvc和context。

3、<context:component-scan/>表示要求Spring 容器(Spring container)对类进行扫描、检查,这样所有代码

     中包含有属于@Component子类型的注释(例如上面的@Controller就是属于@Component的子类型)都会

     被检查到,然后为了提高效率,这里自动检查的范围只在xyz..sample.baremvc这个包下面进行。

4、<mvc:annotation-driven />,表示可以使用annotation来进行工作,也就是支持Spring MVC将请求转给

     @Controller去处理;当然还可以涉及到如转换、格式化、有效性通过上面的几个步骤后,启动服务器,在

     地址栏输入http://localhost:8080/baremvc,可以看到下面的效果:

 

上面的这个例子十分简单但是却涉及到了Spring MVC应用的关键部分应用的调用流程

A、当Tomcat启动,我们的Spring MVC应用被启动起来,DispatcherServlet被加载进来,这是因为我们在

      Web.xml中定了这个Servlet。

B、DispatcherServlet去加载基于注释(annotation)的Spring应用上下文,这里是通过对指定的包(指定的包可

      以使用正则表达式)进行scan的方式来获得带注释的组件。

C、这些带注释的组件被Spring 的 container检测到。

D、http://localhost:8080/baremvc的HTTP请求匹配了我们DispatcherServlet中的servlet-mapping,所以

      DispatcherServlet将去处理这个HTTP请求

E、在上面的HTTP请求中暗示着用户的请求路径为“/”,然后DispatcherServlet发现他里面有相应该路径请求

      的映射(这个其实是我们第二张图里面的那个Handler Mapping)

F、Dispatcher进行决定要如何处理请求,它使用到的策略叫做HandlerAdapter,这个可以这么理解,对于

      request(请求)来说必须要有对应的handler(处理办法)去处理,而这些handler可能根据当前

      所处的不同情况,而使用不同类别的handler,所以这里还需要一个HandlerAdapter来作为不同情况下的

      来转换不同类别的handler去处理request。这个HandlerAdapter(或者多个,可以将它们链接起来)我们可

      以去指定,但是没有指定的情况下将使用系统默认的HandlerAdapter,这里就是使用注释驱动

      (annotation-based)的策略了。这里就是把请求转给@Controller,然后找到匹配对应路径的

      @RequestMapping方法,将输入的参数给该方法,并让该方法处理请求。使用其他HandlerAdapter的例

      子还没做,但是暂时我们不去关心这些,只要有个了解就ok了

G、然后home这个方法做它的事情,打印一个log,然后返回一个字符串,这个字符串暗示了要呈现给用户的

      东西,也帮助View选择合适呈现方式。

H、然后从第一个图中我们知道,Controller做完事情后,任务又交到DispatcherServlet手上了,对于如何选

      择合适的视图,同样DispatcherServlet需要策略,这次的策略叫做ViewResolver,通过这个

      ViewResolver(视图仲裁员)去仲裁那个视图(View)将回应呈现给用户,这个ViewResolver也是可以自己

      定义的。如果默认没有配置的情况下系统将使用InternalResourceViewResolver,这个ViewResolver将创

      建一个JSTLView,而这个View只是简单的把任务委托给Servlet内部的RequestDispatcher去呈现资源,

      所以这种View很适合于使用JSP或者HTML页面的情况

I、 最后Servlet将回应通过制定的jsp呈现给用户

 

4、对View进行抽象让Controller返回一个纯粹的逻辑性的名称。

上面的home函数中我们看到返回的是个纯粹的物理地址,为了减少耦合,让应用有更好的弹性,当然是不能使用这种硬编码的方式;要让Controller返回一个逻辑的名称,而最终的物理路径由View来决定,这样让Controller只关心逻辑上的处理,把展示留给View去做,真正做到C和V分离。看下改造了得Controller:
 @Controller 
public class HomeController { 
  
    @RequestMapping(value = "/") 
    public String home() { 
        System.out.println("HomeController: Passing through..."); 
        return "home"; 
    } 

上面home函数里面返回一个逻辑名称“home”,也就是好像告诉系统需要调用一个叫做“home“的view给用户,但是具体这个”home“的view具体是什么样子完全由系统自己去决定,当然我们知道这里是有ViewResolver去决定的。当然我们可以把这些View的名称统一到一起,上面的这种直接”home“还是有点”生硬“。
接下来我们要做的就是把”home“这个名称映射到”WEB-INF/views/home.jsp“这个文件上面。上面我们说过默认情况下这种映射是通过InternalResourceViewResolver类来处理的。我们可以使用自己的ViewResolver来处理这种逻辑到物理的映射,但是这个例子里面我们只需要对InternalResourceViewResolver做一点点调整就可以达到我们的目的了。
InternalResourceViewResolver对Controller返回过来(其实最后是DispatcherServlet发过来的)的名称,只是在其前后加上可选的前后缀(默认情况为空),然后把这个字符串交给由它自己创建的JSTLView,然后JSTLView再委托Servlet引擎中的RequestDispatcher去干真正的活,呈现视图模板,这里是jsp做视图的模板。这个例子里比较简单,只要对View的名称返回增加相应的前后缀就可以了,前缀”WEB-INF/views/“,后缀".jsp"。一种简单的配置ViewResolver的方式是使用以java为基本的容器配置(另外就是以XML为基础的容器配置/上下文配置),把我们的Resolver定义为一个Bean,下面是对应的代码: 

[java方式定义ViewResolver方法,Controller 返回的逻辑页面:] 
@Configuration 
public class AppConfig {   
     // Resolve logical view names to .jsp resources in the /WEB-INF/views directory 
    @Bean 
    ViewResolver viewResolver() { 
        InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
        resolver.setPrefix("WEB-INF/views/"); 
        resolver.setSuffix(".jsp"); 
        return resolver; 
    } 

上面的代码需要cglib库的支持,这个可以网上下载也可以到我的资源里去下cglib。由于@Configuration也是一个@Component,所以扫描的时候也会被扫描到,然后这个配置组件(Configuration)会被加入到Spring容器中,Spring容器还会扫描所有的Bean并发现ViewResolver(也就是我们的容器里多了个由viewResolver函数里面创建的resolver,作为一个bean),然后使用这个ViewResolver来处理逻辑的View名称。

上面的使用的是java的方式,有些人喜欢xml的方式,如下面:

[xml的方式定义ViewResolver方法,Controller 返回的逻辑页面:] 
< !-- Resolve logical view names to .jsp resources in the /WEB-INF/views directory --> 
< bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/views/" /> 
    <property name="suffix" value=".jsp" /> 
< /bean> 
这个效果也是一样的创建一个InternalResourceViewResolver类型的bean,设置其bean的属性用来处理View名称。


5、处理用户输入

我们总是要和用户互动的,让我们看看如何处理些简单的用户输入,然后再输出结果给用户。在Spring MVC中有多种输入、输出的方式,让我们看看最简单的一种。这里我们把上面的HomeController中增加一个的处理请求的方法,让它能获得两个用户输入的字符,然后进行比较,并且把结果通过jsp输出给用户,看看增加的方法: 
@Controller 
public class HomeController { 
  
    @Autowired 
    Comparator<String> comparator; 
  
    @RequestMapping(value = "/") 
    public String home() { 
        System.out.println("HomeController: Passing through..."); 
        return "home"; 
    } 
  
    @RequestMapping(value = "/compare", method = RequestMethod.GET) 
    public String compare(@RequestParam("input1") String input1, 
            @RequestParam("input2") String input2, Model model) { 
  
        int result = comparator.compare(input1, input2); 
        String inEnglish = (result < 0) ? "less than" : (result > 0 ? "greater than" : "equal to"); 
  
        String output = "According to our Comparator, '" + input1 + "' is " + inEnglish + "'" + input2 + "'"; 
  
        model.addAttribute("output", output); 
        return "compareResult"; 
    } 

1、增加了一个compare函数,当用户请求”/compare“这个路径的时候,这个函数会用来处理用户请求
2、这个函数希望用户通过GET请求的方式传入两个字符作为其参数,如果用户没有传两个指定名称(input1

     和input2)的字符串来,则会提示HTTP 400的错误,然后这里compare函数获得用户GET请求中的参数是

     通过@RequestParam这个注释来实现的。

3、我们使用自己定义的比较器来比较这两个字符串。这里注意到@Autowired,也就Spring通过在container

     中寻找类型同comparator相同(Comparator<String>)的组件,然后wired(连接)到comparator上面(可以理

     解为调用setComparator这样)

4、最后我们使用了Model来放置比较的结果,这样View将可以获得放在Model中的结果,这里只要把Model

     看做一个HashMap就可以了,名称->数据的一个对应。放到Model中的数据主要为了View能够访问这些有

     用的数据。上面的例子中只是个字符串,将来呈现到jsp上面。

我们创建一个对应的jsp文件来显示结果,WEB-INF/views/compareResult.jsp:
< %@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
< %@ page session="false" %> 
< html> 
    <head> 
        <title>Result</title> 
    </head> 
    <body> 
        <h1><c:out value="${output}"></c:out></h1> 
    </body> 
< /html> 
现在我们还需要创建一个给Controller中comparator注入的组件,下面是这个组件的代码:
 @Service 
public class CaseInsensitiveComparator implements Comparator<String> { 
    public int compare(String s1, String s2) { 
        assert s1 != null && s2 != null; 
        return String.CASE_INSENSITIVE_ORDER.compare(s1, s2); 
    } 

这个比较器是个很简单的比较器,实现了Comparator<String>这个接口,这样就可以注入到Controller中comparator去了。因为@Service也是@Component的一种,因此也是可以被自动扫描到的。当然我们也注意到了,有人要问这个可以不可以通过上面的@Configuration中的@Bean定义来做,当然答案是肯定得,同样也是可以在XML中进行定义的。不同的定义方式让这些类提供的控制层次会有高低不同之分。这个应该参考对应的annotation。
\">
 
最后想了解更多Spring MVC的特性的话,可以看看这个 show case

  • 大小: 71.3 KB
  • 大小: 46.2 KB
分享到:
评论

相关推荐

    springmvc-base-quick.rar

    《Spring MVC 快速入门详解》 Spring MVC 是 Spring 框架的一个模块,主要用于构建 Web 应用程序。它提供了模型-视图-控制器(MVC)架构,简化了 Web 开发流程,使得开发者可以专注于业务逻辑,而无需过多关注底层...

    springmvc-helloworld

    **SpringMVC 框架入门详解** SpringMVC 是 Spring 框架的一个模块,专为构建基于 Java 的 Web 应用程序提供模型-视图-控制器(MVC)架构。它简化了开发过程,提供了强大的依赖注入、数据验证、国际化等功能。本教程...

    SpringMVC-MyBatis入门例子

    "SpringMVC-MyBatis入门例子"提供了学习和实践这两个框架的起点。通过理解SpringMVC的请求处理流程和MyBatis的数据库操作方式,开发者可以更好地掌握Java Web开发。这个例子程序涵盖了从基础配置到实际应用的关键...

    springmvc-demo01-start.zip

    在本入门案例 "springmvc-demo01-start.zip" 中,我们将探索如何设置和运行一个基本的 Spring MVC 项目。 首先,创建 Spring MVC 项目时,我们需要以下组件: 1. **Spring Framework**:这是基础,提供了丰富的库...

    SpringMVC-Helloworld

    "SpringMVC-Helloworld"示例是入门SpringMVC的常见起点,它帮助开发者理解如何配置和运行一个基本的Spring MVC应用。 在"SpringMVCLearningChapter1"中,我们可能找到了以下几个关键知识点: 1. **SpringMVC架构**...

    Java_SpringMvc-maven.rar_springmvc_springmvc框架

    这个名为"Java_SpringMvc-maven.rar_springmvc_springmvc框架"的压缩包显然是一个教学资源,旨在帮助初学者快速入门Spring MVC的使用。下面我们将详细探讨Spring MVC的核心概念、工作原理以及如何通过Maven进行项目...

    Springmvc-helloword简单例子

    【SpringMVC 框架入门详解】 SpringMVC 是 Spring 框架的一个模块,主要负责处理 Web 请求。它是一个轻量级的、模型-视图-控制器(MVC)架构,使得开发者可以轻松地将业务逻辑与展示层分离,从而实现更高效的开发。...

    springmvc-base.zip

    Spring MVC 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-...这个基础包是一个很好的起点,它提供了构建 Spring MVC 项目所需的最小配置和示例代码,有助于快速入门。

    韩顺平 Java工程师课程-SpringMVC-v2.pdf

    SpringMVC 介绍与快速入门 SpringMVC 是一个基于 Spring 的 Web 层 MVC 框架,旨在简化 Web 应用程序的开发。SpringMVC 的主要特点包括易用性、高效率、低耦合设计、支持 REST 风格的 URL 请求等。下面是 SpringMVC...

    SpringMVC-HelloWord

    下面,我们将深入探讨SpringMVC的核心概念、工作原理以及如何通过"SpringMVC-HelloWorld"来入门。 首先,让我们理解MVC架构。模型(Model)负责业务逻辑,存储和处理数据;视图(View)用于展示数据;控制器...

    SpringMVC-01教案1

    SpringMVC 的入门程序通常包括以下几个步骤: 1. **需求分析**:确定要实现的功能和应用场景。 2. **开发环境搭建**:安装配置 JDK、Tomcat、IDE(如 IntelliJ IDEA 或 Eclipse)、SpringMVC 相关依赖库。 3. **入门...

    springmvc-starter-project:这是 spring mvc 入门项目的集合。 所有项目都有最少的配置来开始在你的项目中使用 spring mvc

    这是 spring mvc 入门项目的集合。 所有项目都有最少的配置来开始在你的项目中使用 spring mvc。 使用 spring 框架时最艰巨的任务是设置配置,希望这个启动项目能帮助更快地完成配置任务。 jpa-javaconfig 这个...

    SpringMVC入门->网站的初级框架

    在“SpringMVC入门-&gt;网站的初级框架”中,我们将探讨如何使用SpringMVC构建一个简单的网站登录功能。 首先,我们需要理解SpringMVC的工作流程。当用户通过浏览器发送一个HTTP请求到`localhost:8080/ws/web/login`...

    spring-boot-springmvc-mybatis.zip

    该代码为springboot初学者提供了一个快速实践案例,工程使用springboot+Springmvc+mytabis的架构搭建了一套主流的java web项目,参照代码初学者可以快速入门当前主流web开发。

    SpringMVC-REST风格和SSM整合(注解版)彩色PPT版本.pptx

    Spring整合SpringMVC RESTful标准控制器开发 6、表现层数据封装 表现层数据封装 Result Code 7、异常处理器 8、项目异常处理方案 异常处理器 自定义异常 异常编码 自定义消息 8、案例:SSM整合标准开发

    sample-springmvc-portlet:像附加组件一样打包的 Spring MVC Portlet 示例

    本示例中使用了以下功能: Spring MVC Portlet 动作和渲染映射依赖注入(使用@Inject) 表单绑定表单验证(Hibernate Validator)入门第 1 步:安装先决条件:安装(EXO_TOMCAT_ROOT_FOLDER 将用于指定 eXo Tomcat ...

    springmvc-data-mongodb-tiles-thymeleaf-starter:与 DataMongoDB、Tiles 和 Thymeleaf 集成的 Spring MVC 入门设置

    springmvc-data-mongodb-tiles-thymeleaf-starter 与 DataMongoDB、Tiles 和 Thymeleaf 集成的 Spring MVC 的入门设置。 里面也有 BootstrapJS 和 AngularJS。 这是我在 Github 上克隆的一些项目的副本,但由于个人...

    springMvc-rest

    描述中提到的是一个简单的入门级别的例子,这意味着这个项目是为了初学者了解和学习Spring MVC和如何构建REST API而设计的。在这样的项目中,通常会包含基本的CRUD(创建、读取、更新、删除)操作,以及JSON数据的...

Global site tag (gtag.js) - Google Analytics