zoukankan      html  css  js  c++  java
  • spring mvc 原理及应用

    一,前言

    近年来,Struts因为其各种优异的属性,成为风靡全球的时兴技术,而这里要讨论的不是Struts,而是同样提供web 前端解决方案的框架:springMVC;

    springMVC作为spring的一部分,继承了spring轻量级,高度可配置性,良好的拓展性和兼容性等特征,使其成为企业的新选择。

    二,springMVC工作原理(括号内为相关接口)

    SpringMVC主要由调度器(DispatcherServlet)、处理器映射(HanderMapping)、处理器 (HandlerAdapter)、拦截器(HandlerInterceptor )、控制器(Controller)、视图解析器(ViewResolver)、视图(View)这几部分构成。下面根据springMVC的工作流程依 次介绍以上接口。

    一个请求到达服务器,首先经过的是DispacherServlet,它是springMVC的入口,也是核心所在,主要职责是:

    1,截获相应请求(具体将在下面配置中讲到).

    2,初始化其WebApplicationContext上下文.

    3,初始springMVC各个组件,并装配到DispacherServlet.

    DispacherServlet拿到请求后,根据配置的处理器映射,将去寻找HanderMapping.HanderMapping有两个实现:

    1,SimpleUrlHandlerMapping 通过配置文件,把一个URL映射到Controller

    2,DefaultAnnotationHandlerMapping 通过注解,把一个URL映射到Controller类上

     

    接下下来是根据注解或者配置找到对应的Controller,执行其业务逻辑(若有拦截器,当然先走拦截器,springMVC拦截器类型不同,此处暂不 提,下面有讲到)。Controller里面的方法返回值类型有String,ModelAndView,View,json等等。它的返回值包含了响应 所需数据和url等信息。

     

    接下来将到达ViewResolver(这个过程是DispacherServlet定位到ViewResolver还是框架既定的步骤?求解),根据配置的ViewResolver将找到对应的View,然后构造response呈递给浏览器。

    大致步骤就是这样子。

     

    三,入门小例子

    下面我们来做个springMVC的小东西.

    首先到spring官网下载jar包,附上地址:

    http://www.springsource.org/download/community

    环境:eclipse4.2,tomcat;

    1,新建一个web项目,这里我们取名为demo,打开web.xml,配置DispacherServlet,内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>demo</display-name>

     <servlet>
      <servlet-name>spring</servlet-name><!-- 此处指定servlet的名字,它将决定springmvc配置文件的名字,
      默认是[servletName-servlet.xml],也可以自定义。-->
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>1</load-on-startup><!-- 该值用于确定优先级;正数值越小优先级越高 -->
     </servlet>

     <servlet-mapping>
      <servlet-name>spring</servlet-name>
      <url-pattern>/</url-pattern><!-- 这里表示DispacherServlet所拦截的请求,拦截方式很多,以下分别讲到 -->
     </servlet-mapping>

      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

    自定义springmvc配置文件名字:通过为servlet指定init-param实现,如下:

     <servlet>
      <servlet-name>spring</servlet-name><!-- 此处指定servlet的名字,它将决定springmvc配置文件的名字,
      默认是[servletName-servlet.xml],也可以自定义。-->
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath*:/springMVC.xml</param-value>
      </init-param>

      <load-on-startup>1</load-on-startup><!-- 该值用于确定优先级;正数值越小优先级越高 -->
     </servlet>
    此处指定的文件是web根目录下的叫做springMVC.xml

     

    拦截地址:

      <url-pattern>/</url-pattern>:这种方式拦截了类似/user/login的地址;会导致静态资源无法访问。

      <url-pattern>/*</url-pattern>:错误的拦截方式,可以走到Action中,但转发到jsp时再次被拦截,不能访问到jsp。

      <url-pattern>/path/*</url-pattern>:拦截包含/path/路径的请求。

      <url-pattern>*.do</url-pattern>:简单,实用的拦截方式,不存在静态资源访问的问题。

     

    好了,接下来就在WEB-INF目录下新建springmvc的配置文件。名字根据以上配置取。我使用的默认配置,所以我的配置文件名字就是:spring-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:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
            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
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

        <!-- 自动扫描的包名 -->
        <context:component-scan base-package="com.my.test" />
        <!-- 配置使用注解 -->    
        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
            
        <!-- 视图解释类 -->  
       <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
            <property name="prefix" value="/jsp/"/>  
            <property name="suffix" value=".jsp"/>
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />  
       </bean>  
       
    </beans>

    来解释下:

        <context:component-scan base-package="com.my.test" />这句指定springmvc扫描的包名,在该目录下的都将被扫描~也可以写*,比如:com.*.test

        <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />这句启用springmvc注解功能,网络上还有一种配置方式:

    1. <!-- 默认的注解映射的支持 -->  
    2.    <mvc:annotation-driven /> 

    不知道是版本还是其他原因,这种方式我用不了, o(╯□╰)o


    下面是指定物理目录用的, springmvc将根据controller里面方法的返回值查找物理路径,规则是这样的:

    项目路径下/[prefix的value]+[controller的返回值]+[suffix指定的后缀]

    比如我的controller里面某个方法返回index,那么,springmvc所找的页面就是:demo/jsp/index.jsp


    好了接下来写一个Controller,代码如下:

    package com.my.test;

    import javax.servlet.http.HttpServletRequest;

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

    @Controller
    public class MainController
    {
        @RequestMapping(value = "/test/dotest")
        public String refreshmeta(Model model,HttpServletRequest request)
        {
            request.setAttribute("name","susan");
            return "index";
        }

    }
    简单得很,能说明大致工作原理就成了。

    顺便说几句吧:

        @RequestMapping(value = "/test/dotest")表示将处理为/test/dotest的请求,也可以在后面加上请求类型,像这 样:,@RequestMapping(value="/test/dotest/",method = RequestMethod.GET);也可以一个方法拦截多个请求,像这样:    @RequestMapping(value = { "/test/dotest", "/test/mytest" })

        public String refreshmeta(Model model,HttpServletRequest request)
    这句方法名可以任意,后面的参数,Model是spring封装的一个request对象,把他当成request用没一点问题;后米娜的HttpServletRequest都清楚,不必多说了~其实还可以在后面参数中加入从表单取值的东西,比如这样写:    public String refreshmeta(Model model,HttpServletRequest request@RequestParam(required = false) String email),这里的email是可以直接拿来用的,它的值对应于页面中的email元素的值。

            return "index";
    这句上面有提到,springMVC通过这个返回值来确定需要返回的视图的物理路径,按照我们spring-servlet.xml的配置,框架去找的物理路径就是:/demo/jsp/index.jsp

    好吧,物理路径是这个,那么就在这个路径下建一个jsp页面,内容够简洁:

    <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>Insert title here</title>
    </head>
    <body>
        welcome to spring mvc ,your name is  ${name}
    </body>
    </html>
  • 相关阅读:
    MySQL8.0.x安装和基本设置说明
    centos怎么解压zip格式文件
    MySQL数据插入
    linux下防火墙开放3306端口
    Linux Tomcat 进程与端口占用的查看与处理
    MySQL游标简介【8】
    centos7修改网卡名【2】
    CentOS安装NVIDIA显卡驱动方法
    长沙市轨道交通工程BIM应用招标公告
    问题若干
  • 原文地址:https://www.cnblogs.com/Struggles/p/4109804.html
Copyright © 2011-2022 走看看