SpringMVC总结一:快速入门

MVC:

  MVC是一种架构模型,本身没有什么功能,只是让我们的项目结构更加合理,流程控制更加清晰,一般包含三个组件:

  **Model(模型)**:数据模型,用于提供要展示的数据。一般包含数据和行为(也就是业务),在JavaWEB中,数据和业务往往是分离开的。

  **View(视图)**:负责对模型数据进行展示,例如我们看到的网页。概念比较广泛,可以是:html、JSP、excel、Word、PDF、json、XML等

​   **Controller(控制器)**:接收用户请求,委托给模型做处理,处理完毕返回数据,再交给视图做渲染,相当于调度员工作

 

SpringMVC:

  Spring Web MVC是一种基于Java的,实现了Web MVC设计模式的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,采用了松散耦合可插拔组件结构,比其它MVC框架更具扩展性和灵活性。

可以让我们实现:

  • 进行更简洁的Web层的开发;

  • 天生与Spring框架集成(如IoC容器、AOP等);

  • 提供强大的约定大于配置的契约式编程支持;

  • 支持灵活的URL到页面控制器的映射;

  • 非常容易与其他视图技术集成,如Velocity、FreeMarker等等,因为模型数据不放在特定的API里,而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);

  • 非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;

  • 支持Restful风格。

SrpingMVC架构了解一下:

DispatcherServlet  前置控制器
HandlerMapping  处理器映射器
HandlerAdapter  处理器适配器
Controller接口  控制器
ViewResolver  视图解析器

 

流程总结:

流程总结:
1. 用户发起请求到DispatcherServlet(前端控制器)
2. DispatcherServlet通过HandlerMapping(处理映射器)寻找用户要请求的Handler
3. HandlerMapping返回执行链,包含两部分内容:
   a) 处理器对象:Handler
   b) HandlerInterceptor(拦截器)的集合
4. 前端控制器通过HandlerAdapter(处理器适配器)对Handler进行适配包装
5. 调用包装后的Handler中的方法,处理业务
6. 处理业务完成,返回ModelAndView对象,包含两部分
   a) Model:模型数据
   b) View:视图名称,不是真正的视图
7. DispatcherServlet获取处理得到的ModelAndView对象
8. DispatcherServlet将视图名称交给ViewResolver(视图解析器),查找视图
9. ViewResolver返回真正的视图对象给DispatcherServlet
10. DispatcherServlet把Model(数据模型)交给视图对象进行渲染
11. 返回渲染后的视图
12. 将最终的视图返回用户,产生响应
View Code

 

快速入门案例:

首先创建一个java web项目,引入需要的包:

<dependencies>
    <!--spring mvc-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <!--日志-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
    </dependency>
    <!-- JSP相关 -->
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jsp-api</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>
View Code

配置tomcat:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <path>/</path>
                <port>8080</port>
            </configuration>
        </plugin>
    </plugins>
</build>
View Code

编写我们的controller(实现Controller接口)和jsp页面:

package com.zy.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;

public class MyTestController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.setViewName("hello");//设置对应视图的名字
        mv.addObject("msg", "hello springmvc ===" + new Date().toLocaleString());
        return mv;
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>${msg}</h1>
</body>
</html>

 

1,想使用springmvc必须先配置web.xml中的DispatcherServlet:

<?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">
    <servlet>
        <servlet-name>myspringmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--tomcat启动时就创建-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>myspringmvc</servlet-name>
        <!--
            /*     匹配所有请求路径,不要用
            /     匹配除了.jsp以为的所有请求
            *.xxx:    匹配以xxx为后缀的路径
         -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

 

2,创建并配置SpringMVC配置文件:

SpringMVC有自己的配置文件,其实就是类似于Spring的applicationContext.xml的一个配置文件,配置SpringMVC需要使用到的bean,例如HandlerMapping,HandlerAdapter等

这个文件默认是去寻找:WEB-INF/{servletName}-servlet.xml(下面图片可以说明):

刚才在DispatcherServlet中配置的ServletName是 myspringmvc,所以默认是去找WEB-INF/myspringmvc-servlet.xml:

创建好这个文件后,我们需要配置一下其中的HandlerMapping,HandlerAdapter,Handler,viewResolver:

<?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">
    <!--1 配置HandlerMapping 可省略不写-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!--2 配置HandlerAdapter 可省略不写-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!--3 配置业务处理器 handler(我们自己写的controller)-->
    <bean name="/hello.do" class="com.zy.controller.HelloController"/>

    <!--4
        配置 viewResolver 视图解析器: 定位视图的准确位置,
        问题: 根据视图名称,找到 视图对应的位置
         * 例子: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="hello" -> "/WEB-INF/jsp/hello.jsp"
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--指定前缀-->
        <property name="prefix" value="/WEB-INF/views/"/>
        <!--指定后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

运行tomcat即可。

 

注解版案例:

入门案例中,我们自定义控制器类的方式并不好,存在以下问题:

1) 类必须实现Controller接口,不友好。

2) 每个类中只能有一个默认处理方法,只能处理一个用户请求。

3) 每个类需要在配置文件中进行配置,很麻烦。

 

 为了解决上面这些问题,我们使用注解版来改造一下:

1,首先我们的控制器controller:

//加上Controller注解
@Controller
public class HelloController {
    //映射注解
    @RequestMapping("/helloSpringMVC")
    public ModelAndView helloSpringMVC(){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("hello");//设置视图名字
        mv.addObject("msg", "hello springmvc 注解版 ===" + new Date().toLocaleString());
        return mv;
    }
}

2,然后我们的myspringmvc-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="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">

    <!--下面配置HandlerMapping和HandlerAdapter的两步是可以不写的-->
    <!--但是不写的情况下 默认的注解版的是过时的,所以可以写成下面这种推荐版的,也可以写最终这两步结合的简化版-->

    <!--1 因为 默认注解的handlermaping过时了,所以使用推荐版-->
    <!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>-->
    <!--2 因为 默认注解的HandlerAdapter过时了,所以使用推荐版-->
    <!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>-->

    <!--上面注释的两步的结合简化版-->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--由于是注解版的 所以开启扫描包扫描controller-->
    <context:component-scan base-package="com.zy.controller"></context:component-scan>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/views/"></property>
        <!--后缀-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

运行tomcat访问 http://localhost:8080/helloSpringMVC.do 即可。

posted @ 2017-05-04 16:29  青衫仗剑  阅读(417)  评论(0编辑  收藏  举报