Spring MVC 入门指南(一):HelloWorld

感谢原作者:https://my.oschina.net/kolbe/blog/509686

SprigMVC—理解MVC及快速入门

说明:

  传统MVC——>JSPModel2——>Front Controller + Application Controller + Page Controller + Context 三种模式是JavaWeb设计模式的逐渐适配和演进。本文分别讲述了这三种模式,作为了解即可。SpringMVC正是采用了第三种设计模式。


传统MVC:

MVC是Xerox PARC在20世纪80年代为编程语言SmallTalk发明的一种软件设计模式。

MVC是一种设计模式,它强制性地把应用程序的数据展示、数据处理和流程控制分开。

MVC将应用程序分成3个核心模块:模型、视图、控制器,他们相互联结又分别担当不同的任务,如图示所示。



JSPModel2:

在早期的Web应用中,JSP负责处理业务逻辑、控制网页流程并创建HTML页面。基本上JSP包揽的所有的模块,这无疑造成了不少的困扰:
  比如:
    ☐可维护性差
    ☐调试困难
    ☐ HTML与Java程序代码强耦合在一起
    ☐ 内嵌的流程控制逻辑,要理解应用程序的逻辑必须浏览所有的JSP页面。
  为了解决这些问题,SUN公司先后制定了两种设计模式,分别为Model1和Model2。虽然Model1在一定程序上实现了MVC中的视图和模型,但是他的运用并不理想,知道Model2的出现才改变了这种局面。
  Model2中用JSP技术实现了视图的功能、用Servlet技术实现了控制器的功能、用JavaBean技术实现了模型的功能。



Front Controller + Application Controller + Page Controller + Context:

前端控制器+应用控制器+页面控制器(也有称其为动作)+上下文,也是一种WebMVC模型,只是责任更加明确,SpringMVC正是这种模式。


职责
  Front Controller:
前端控制器,负责为表现层提供统一访问点,从而避免Model2中出现的重复的控制逻辑(由前端控制器统一回调相应的功能方法,如前边的根据submitFlag=login转调login方法);并且可以为多个请求提供共用的逻辑(如准备上下文等等),将选择具体视图和具体的功能处理(如login里边封装请求参数到模型,并调用业务逻辑对象)分离。
 
  Application Controller:
应用控制器,前端控制器分离选择具体视图和具体的功能处理之后,需要有人来管理,应用控制器就是用来选择具体视图技术(视图的管理)和具体的功能处理(页面控制器/命令对象/动作管理),一种策略设计模式的应用,可以很容易的切换视图/页面控制器,相互不产生影响。
 
  Page Controller(Command):
页面控制器/动作/处理器:功能处理代码,收集参数、封装参数到模型,转调业务对象处理模型,返回逻辑视图名交给前端控制器(和具体的视图技术解耦),由前端控制器委托给应用控制器选择具体的视图来展示,可以是命令设计模式的实现。页面控制器也被称为处理器或动作。
 

  Context:上下文,还记得Model2中为视图准备要展示的模型数据吗,我们直接放在request中(Servlet API相关),有了上下文之后,我们就可以将相关数据放置在上下文,从而与协议无关(如Servlet API)的访问/设置模型数据,一般通过ThreadLocal模式实现。


实例:

 0.项目结构



 1.加入Jar包(Maven)

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.14.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.3.14.RELEASE</version>
    </dependency>


2.配置Web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- 配置DispatcherServlet -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!-- 配置DispatcherServlet的一个初始化参数,作用是配置SpringMVC配置文件的位置和名称 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!-- classpath表示类路径下的dispatcherServlet-servlet.xml文件 -->
            <param-value>classpath:dispatcherServlet-servlet.xml</param-value>
        </init-param>
        <!-- load-on-startup 表示在web应用启动时,即加载该DispatcherServlet,而不是等到首次请求再中载 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- 表示哪些请求需要交给Spring Web MVC处理,/是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求 -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

请求处理流程:



3.配置dispatcherServlet-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"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:mac="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 自动扫描 com.ray 下的带有Spring组件注解的类 -->
    <context:component-scan base-package="com.ray"/>

    <!-- 配置视图解析器:将控制器方法返回值解析为实际物理视图 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 假设控制器返回 success 字符串,该视图解析器将自动进行装配,具体的视图将为:prefix + 返回的字符串 + suffix = /WEB-INF/views/success.jsp -->
        <!-- prefix表示前缀 -->
        <property name="prefix" value="/WEB-INF/views/"/>
        <!-- suffix表示后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

4.创建请求处理器类(helloworld.class)

package com.ray;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Created by Ray on 2018/4/17 0017.
 */
@Controller
public class helloworld {

    /**
     * 1. 使用 @RequestMapping 注解来映射请求的URL(相当于web.xml中的servlet-mapping元素的url-pattern)
     * 2. 返回值会通过视图解析器解析为实际的物理视图,具体看第三步中的InternalResourceViewResolver配置信息
     */
    @RequestMapping("/helloworld")
    public String hello(){
        System.out.println("控制台输出:hello world");
        return "success";
    }
}

说明:
  这里我们使用了注解@Controller ,可以表明了该类作为一个控制器,而不需要你扩展任何控制器基类或者引用ServletAPI。当然,如果需要还是可以引用特定Servlet功能。注解@Controller的基本目标是担任所注解的类的原型的角色,指明它的职责。

  所注解的控制器Bean可以被显示定义。@Controller也允许自动侦测。要实现队所注解的控制器的自动侦测,必须要像配置中加入组件扫描的部分的语句。

<!-- 配置自动扫描的包 -->
    <context:component-scan base-package="com.ray"/>


5.编写JSP页面(success.jsp)

/WEB-INF/views/success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <base href="<%=basePath%>">
    <title>SpringMVC:学习笔记(1)——理解MVC及快速入门</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
</head>
<body>
    Hello,world
</body>
</html>

6.简单测试

http://localhost:8080/StringMVC/helloworld

控制器return返回了视图的名称,我们在SpringMVC 中设置了如何解析处理器返回值为视图。
所以当我们访问/helloworld后我们会被处理器跳转到success.jsp页面。


猜你喜欢

转载自blog.csdn.net/q343509740/article/details/79977620
今日推荐