栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring mvc教程(springmvc详解)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring mvc教程(springmvc详解)

文章目录

一、SpringMVC概述

1、SpringMVC简介2、SpringMVC优点3、第一个SpringMVC程序

1、实现步骤

1、加入依赖

SpringMVC依赖Servlet、Jsp依赖 2、在web.xml中注册SpringMVC框架核心对象DispatcherServlet

为什么要创建DispatcherServlet对象的实例呢? 3、创建页面发起请求、接收结果4、创建控制器类5、创建SpringMVC配置文件 2、SpringMVC请求处理流程 二、SpringMVC注解式开发

1、@RequestMapping

1、使用在方法上2、使用在类上 2、处理器方法的参数

1、逐个参数接收

使用示例原理 2、@RequestParam3、对象参数接收4、解决编码问题 3、处理器方法的返回值

1、返回ModelAndView:视图+数据2、返回String:视图3、返回void:null(了解)4、返回对象Object:数据

1、实现步骤2、返回值是自定义对象3、返回值是List4、返回值是String 4、解读url-patten——使用/5、相对路径和绝对路径 三、SSM整合开发

1、分析2、整合步骤

详细步骤pom.xml文件web.xmlSpringMVC配置文件Spring配置文件MyBatis配置文件数据库属性配置文件 四、SpringMVC核心技术

1、请求重定向和转发2、异常处理3、拦截器

一、SpringMVC概述 1、SpringMVC简介

SpringMVC:是基于Spring的一个框架。实际上就是Spring的一个模块,专门是做web开发的,可以理解为是Servlet的一个升级。

Spring的使用原理:

Spring中IOC管理对象,AOP动态代理。SpringMVC也能够创建对象,放入到SpringMVC容器中,区别就是SpringMVC容器中放的是控制器对象。

在SpringMVC中我们使用@Controller注解创建控制器对象,把对象放入到SpringMVC容器中,把创建好的对象当作Servlet使用,即能够接收用户的请求,显示处理结果。

然而我们知道@Controller控制器创建的是普通的控制器对象,并不是Servlet,所以SpringMV赋予了控制器对象一些额外的功能,这样我们才能把它当作Servlet使用。

Web开发的底层是servlet。 在springmvc中有一个对象是servlet:DispatcherServlet(中央调度器)。

    DispatcherServlet叫做中央调度器,是一个servlet,它的父类继承的是HttpServletDispatcherServlet也叫做前端控制器(front controller)DispatcherServlet负责接收用户提交的所有请求。用户把请求给了DispatcherServlet之后,DispatcherServlet会把请求转发给我们的Controller对象,最后是Controller对象处理请求。处理完请求后会将结果返回给DispatcherServlet,DispatcherServlet再将结果返回到请求端。
2、SpringMVC优点

    基于 MVC 架构

    基于 MVC 架构,功能分工明确。解耦合,

    容易理解,上手快;使用简单。

    就可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的,jar 很小。不依赖的 特定的接口和类。

    作 为 Spring 框 架 一 部 分 , 能 够 使 用 Spring 的 IoC 和 Aop 。 方便整合Strtus,MyBatis,Hiberate,JPA 等其他框架。

    SpringMVC 强化注解的使用,在控制器,Service,Dao 都可以使用注解。方便灵活。

    使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource 在控制器类中注入 Service, Service 类中注入 Dao。

3、第一个SpringMVC程序 1、实现步骤 1、加入依赖 SpringMVC依赖

使用SpringMVC时,不需要我们手动加入Spring的依赖,因为SpringMVC本身依赖于Spring,所以根据Maven的依赖传递性会自动帮我们加入Spring的依赖。


    org.springframework
    spring-webmvc
    5.2.5.RELEASE

Servlet、Jsp依赖


    javax.servlet
    javax.servlet-api
    3.1.0
    provided





    javax.servlet.jsp
    jsp-api
    2.1
    provided


2、在web.xml中注册SpringMVC框架核心对象DispatcherServlet
    配置Servlet程序:声明注册DispatcherServlet指定自定义SpringMVC读取配置文件的位置指定创建DispatcherServlet的实例配置Servlet访问地址


    
    
        
        springmvc
        
        
        org.springframework.web.servlet.DispatcherServlet
        
        
        
            contextConfigLocation
            classpath:springmvc.xml
        
        
        
        1
    
    
    
    
        
        springmvc
        
        
        *.do
    

为什么要创建DispatcherServlet对象的实例呢?

因为DispatcherServlet在创建过程中,会同时创建SpringMVC容器对象读取SpringMVC的配置文件,把配置文件中的对象都创建好,当用户发起请求时就可以直接使用对象了。

DispatcherServlet的初始化会执行init()方法:

init(...){
    // 创建容器,读取配置文件
    WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
    //把容器对象放入到ServletContext中
    getServletContext().setAttribute(key,ctx);
}

创建DispatcherServlet的过程中,创建容器对象时默认读取的配置文件是**/WEB-INF/-servlet.xml**
例如:

springmvc
org.springframework.web.servlet.DispatcherServlet

这里的默认配置文件名为:springmvc-servlet.xml

我们可以使用标签自定义springmvc读取配置文件的位置。


3、创建页面发起请求、接收结果

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    请求


访问/WEB-INF/view/下的show.jsp页面

show.jsp 在/WEB-INF/view/目录下创建

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    受保护的页面


您目前访问量的是/WEB-INF/view/show.jsp页面
${msg}



4、创建控制器类
    在类的上面加上@Controller注解,创建对象并放到SpringMVC容器中在类的上面加上@RequestMapping注解
package com.study.controller;

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

@Controller
public class TestController {
    
    @RequestMapping(value = "/show.do")
    public ModelAndView doSome(){
        
        ModelAndView mv = new ModelAndView();
        // 添加数据。框架最后会把数据放入到request作用域
        mv.addObject("msg","Hello,SpringMVC!");
        
        mv.setViewName("show");
        return mv;
    }
}

5、创建SpringMVC配置文件

SpringMVC的配置文件和Spring的配置文件是一样的。

    声明组件扫描器,指定@contorller注解所在的包名

    声明视图解析器。用于指定视图文件的路径。

    什么是视图?就是页面。当我们点击跳转的时候,是跳转到了另外一个页面,可是如果我们直接访问跳转目标地址呢?当然我们也会访问到相应的页面,可这是属于非法访问,也就是没有按照我们正常的规矩来,所以为了防止这样的事情发生,我们一般会将需要保护的页面放到项目的WEB-INF目录下:/WEB-INF/view/。因为WEB-INF目录下的文件默认是受保护的。

springmvc.xml




    
    
    
    
    
        
        
        
        
    


2、SpringMVC请求处理流程

组件说明
DispatcherServlet中央调度器web.xml中配置到的访问地址都会交由中央调度器处理转发
HandleMapping处理器映射器springmvc框架中的一种对象,框架把实现了HandlerMapping接口的类都叫做映射器(多个);
映射器会根据请求,从springmvc容器对象中获取处理器对象,即Conteoller类对象。获取到的对象会放到处理器执行链中保存。
处理器执行链框架中的一个类,叫做HandlerExecutionChain。它里面会存储 Controller对象 和 项目中所有的拦截器
HandleAdaptor处理器适配器springmvc框架中的对象,需要实现HandlerAdapter接口。
作用:执行处理器方法,并将结果返回给中央调度器(调用Controller类中的方法,得到返回值ModelAndview)
ViewResolver视图解析器springmvc框架中的对象,需要实现ViewResolver接口。
作用:组成视图完整的路径(前缀+传过来的值+后缀),并创建View对象返回给中央调度器。
View是一个接口,表示视图的,在框架中jsp、html不是String表示的,而是使用View和它的实现类表示视图的。例如:jsp对应的就是InternalResourceView实现类。
    index.jsp发起请求。请求地址:some.dotomcat(根据web.xml中的url-pattern知道*.do的请求给DispatcherServlet)DispatcherServlet(根据springmvc.xml配置知道some.do请求由doSome()方法处理)DispatcherServlet把some.do转发给TestController类中的doSome()方法框架执行doSome()把得到的ModelAndView进行处理,转发到index.jsp

二、SpringMVC注解式开发

前面第一个SpringMVC程序我们已经使用到了@RequestMapping和@Controller两个注解,接下来我们将详细介绍SpringMVC中常用的几种注解。

1、@RequestMapping 1、使用在方法上

@RequestMapping:请求映射,可以定义处理器对于请求的映射规则,如把一个请求地址和方法绑定在一起。一个请求一个方法处理。被@RequestMapping修饰的方法叫做处理器方法或控制器方法。类似于Servlet的doGet、doPost方法。

属性:

value:请求的uri地址,值唯一,不能重复。

可以是一个字符串,常以“/”开始;也可以是一个数组,这样该控制类就有多个访问入口了。

method:指定请求方式。值为RequestMethod类枚举值。

get:RequestMethod.GET

post:RequestMethod.POST

@RequestMapping(value = "/show.do", method = RequestMethod.GET)
public ModelAndView doSome(){...}

@RequestMapping(value = {"/show.do","/other.do"})
public ModelAndView doSome(){...}
2、使用在类上

@RequestMapping:请求映射,当这里和使用在方法上不一样,这里是声明请求地址的公共部分的。

例如:类中的方法的访问地址为:/test/some.do、/test/other.do等等,他们都有/test/部分,那么这一部分就可以使用@RequestMapping进行统一声明、定义。

属性:

value:所有请求地址的公共部分

@Controller
@RequestMapping("/test")
public class TestController {
    @RequestMapping(value = "/show.do")
    public ModelAndView doSome(){
        ModelAndView mv = new ModelAndView();
        mv.setViewName("show");
        return mv;
    }
}

这样doSome方法的访问地址为:/test/show.do


2、处理器方法的参数

处理器方法可以包含以下四类参数,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用。

    HttpServletRequestHttpServletResponseHttpSession请求中所携带的请求参数

HttpServletRequest、HttpServletResponse和HttpSession三个和Servlet中的使用方法是一样的,不做赘述。

请求中所携带的请求参数分为两类情况:逐个参数接收、对象参数接收。

1、逐个参数接收

使用这种方式的前提是:请求中的参数名和处理器方法的形参名一样。

使用示例

页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    请求


    
姓名:
年龄:

处理器方法

@RequestMapping(value = "/form.do")
public ModelAndView doForm(String name, int age) {	// 参数名和表单中的属性名一样
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("name", name);
    modelAndView.addObject("age", age);
    modelAndView.setViewName("show");
    return modelAndView;
}
原理

    框架使用request对象接收请求参数

    String strName = request.getParameter("name");
    String strAge = request.getParameter("age");
    

    SpringMVC框架通过DispatcherServlet调用Controller类中的doForm方法,调用时按名称对应把接收的参数赋值给形参

    doForm(strName, Integer.valueOf(strAge);
    

2、@RequestParam

如果逐个接收参数时,请求中参数和处理器方法形参名不一样,可以使用@RequestParam进行配置,使其一一对应。

属性:

    value:请求参数名。配上后会和形参一一对应接收。

    required:boolean类型,默认是true。

    true:请求中必须包含此参数;

    false:请求中可以不包含此参数。

@RequestMapping(value = "/form.do")
public ModelAndView doForm(@RequestParam(value = "userName")String name,
                           @RequestParam(value = "userAge")int age) {...}

3、对象参数接收

将处理器方法的参数定义为一个对象,只要保证请求参数名与这个对象的属性同名即可。

框架会创建形参的Java对象,然后给属性赋值。例如,请求中的参数是name,则会调用setName方法赋值。

注意:这种放方式接收值,是不能使用@RequestParam注解的。


4、解决编码问题

当使用GET请求时,中文不会出现编码问题;而使用POST请求时,则会出现编码问题。我们需要使用过滤器处理乱码的问题。

我们可以使用自定义的过滤器,也可以使用框架中的过滤器。当然我们选择框架中的过滤器,因为方便。

框架中的过滤器:CharacterEncodingFilter

在web.xml文件中声明使用:


    characterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
    
        encoding
        utf-8
    
    
    
        forceRequestEncoding
        true
    
    
    
        forceResponseEncoding
        true
    


    characterEncodingFilter
    
3、返回值是List

页面中得到的数据就会是,json数组,每一个元素都是对象,在页面中循环遍历即可使用

4、返回值是String

这里返回String表示的是数据,不是视图。

怎么区分?就看你的处理器方法上是否有@ResponseBody注解,如果有就返回的是数据;没有返回的就是视图。

注意:返回String时默认使用的是"text/plain;charset=ISO-8859-1"作为contentType(数据类型/编码),导致中文有乱码

解决方法:在@RequestMapping注解中添加一个produce属性即可

@RequestMapping(value = "/form.do", produce="text/plain;charset=utf-8")

4、解读url-patten——使用/

web.xml



    
    
        
        springmvc
        
        
        org.springframework.web.servlet.DispatcherServlet
        
        
        
            contextConfigLocation
            classpath:springmvc.xml
        
        
        
        1
    
    
    
    
        
        springmvc
        
        
        *.do
    

前面在web.xml中给控制器类配置访问地址时使用的是*.do的方式,我们还可以使用/的方式,但是会和tomcat中的一个默认的servlet冲突:

静态资源:html、js、css、图片等等

静态资源请求:比如我们前端显示的页面,都是从服务端请求过来的,也是url请求得到的

TomCat中有一个默认的Servlet,叫default,在 Tomcat 安装目录/conf/web.xml。除了由我们自定义Servlet(处理器方法)处理的请求,其余的一切静态资源请求 以及 未映射到其他Servlet的请求都由default Servlet处理。

tomcat中默认的servlet

    default
    org.apache.catalina.servlets.DefaultServlet
    
        debug
        0
    
    
        listings
        false
    
    1




    default
    /

如果我们这里也使用了/,则tomcat中的servlet就被覆盖了,所有的静态资源请求就会走我们配置的servlet了。最终会导致静态资源显示不了。

解决方式:

1、在SpringMVC配置文件中加入+注解驱动。

原理:声明了后 , springmvc 框 架 会 在 容 器 中 创 建 DefaultServletHttpRequestHandler 处理器对象。它会像一个检查员,对进入 DispatcherServlet 的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的 Servlet 处理。一般的服务器都有默认的 Servlet。

注意:这里也需要加上注解驱动:,因为default-servlet-handler和@RequestMapping注解有冲突,如果没有注解驱动,则所有的请求都会给tomcat中的default Servlet了。即加上注解驱动后,注解的优先级就高于default-servlet-handler了。

2、使用

如果我们的Web应用服务器没有默认的Servlet呢?或者我们不想依赖Web应用服务器默认的Servlet?

我们就可以使用mvc:resources标签,在 Spring3.0 版本后,Spring 定义了专门用于处理静态资源访问请求的处理器ResourceHttpRequestHandler,它不会依赖于Web应用服务器默认的Servlet。并且添加了标签,专门用于解决静态资源无法访问问题。需要在springmvc 配置文件中添加如下形式的配置:

 

3、拦截器

SpringMVC 中的 Interceptor 拦截器是非常重要和相当有用的,它的**主要作用是拦截指定 Java 框架 SpringMVC的用户请求,并进行相应的预处理与后处理**。

拦截器执行时间点:

    在请求处理之前,也就是controller类中的方法执行之前先被拦截。

    在控制器方法执行之后也会执行拦截器。

    在请求处理完成后也会执行拦截器。

    请求处理完:视图处理完成后,对试图执行了forward,就认为请求处理完成。

多个拦截器执行的顺序:

先声明先执行

在框架中保存拦截器实际上使用的是一个ArrayList,按照声明的现后顺序存储到ArrayList中

拦截器和过滤器的区别:

    过滤器是servlet中的对象,由tomcat服务器创建;拦截器是框架中的对象,在springmvc容器中创建;

    过滤器实现Filter接口的对象,拦截器是实现HandlerInterceptor

    过滤器是用来设置request,response的参数,属性,编码字符集的,侧重对数据过滤;
    拦截器是用来验证请求的,能截断请求,一般用在用户登陆处理、权限检查、记录日志等方面;

    过滤器在拦截器之前先执行;

    过滤器是一个执行时间点;拦截器有三个执行时间点;

    过滤器可以处理jsp,js,html等等;
    拦截器是侧重拦截对Controller的对象。如果你的请求不能被DispatcherServlet接收,这个请求不会执行拦截器内容;

    拦截器拦截普通类方法执行,过滤器过滤servlet请求响应。

拦截器的使用步骤:

    定义类实现HandlerInterceptor接口,实现接口中的三个方法在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在。
public class MyInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("【拦截器】预处理方法preHandle");
        return true;
    }

    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("【拦截器】后处理方法preHandle");
    }

    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("【拦截器】最后执行方法afterCompletion");
    }
}

    
        
        
        
        
    

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/773283.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号