欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringMVC的配置与应用

程序员文章站 2022-10-03 20:22:16
1. SpirngMVC概述什么是SpringMVC?SpringMVC是Spring 提供的一个实现了Web MVC设计模式的轻量级Web框架。它与Strust2框架一样,都属于MVC框架,但其使用和特性方面比Strusts2更加优异。SpringMVC具有以下特点是Spring框架的一部分,可以方便得利用Spring所提供的其他功能。灵活性强,易于与其他框架集成。提供了一个前端控制器DispatcherServlet, 使开发人员无需额外开发控制器对象。可自动绑定用户输入,并能正确的转换...

1. SpirngMVC概述

什么是SpringMVC?

SpringMVC是Spring 提供的一个实现了Web MVC设计模式的轻量级Web框架。它与Strust2框架一样,都属于MVC框架,但其使用和特性方面比Strusts2更加优异。

SpringMVC具有以下特点

  1. 是Spring框架的一部分,可以方便得利用Spring所提供的其他功能。
  2. 灵活性强,易于与其他框架集成。
  3. 提供了一个前端控制器DispatcherServlet, 使开发人员无需额外开发控制器对象。
  4. 可自动绑定用户输入,并能正确的转换数据类型。
  5. 内置了常见的校验器,可以校验用户输入。如果校验不能过,那么就会重定向到输入表单。
  6. 支持国际化。可以根据用户区域显示多国语言。
  7. 支持多种视图技术。它支持JSP、Velocity和FreeMarker等视图技术。
  8. 使用基于XML的配置文件,在编辑后,不需要重新编译应用程序。

2.创建Spring程序

1.使用idea创建maven工程

SpringMVC的配置与应用

技术支持:由于有些IDEA或者Eclipse 版本或者安装问题,不能在本地的 .m2仓库中找到settings文件,所以在设置maven驱动的时候,要选择本地自己安装的maven驱动下的settings文件路径。 关于如何搭建maven在之前的博客中已经介绍了。

SpringMVC的配置与应用
SpringMVC的配置与应用

2.导入依赖

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spirng.version>5.0.16.RELEASE</spirng.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>



    <!--  添加 servlet 依赖 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>

    <!--  ioc 相关-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spirng.version}</version>
    </dependency>

    <!--aop 相关 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spirng.version}</version>
    </dependency>


    <!-- aop**** aspectj 相关  -->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.6.12</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.6.12</version>
    </dependency>


    <!-- springmvc 相关 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spirng.version}</version>
    </dependency>


  </dependencies>

3.导入第2步的依赖后,IDEA自动创建srcjava,resource文件夹,并标注

SpringMVC的配置与应用
SpringMVC的配置与应用

4.com.aaa.springmvc.controller 下创建HelloServlet控制器

代码
配置tomcat就能自动跳转到该页面显示helloword

package com.aaa.springmvc.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * ClassName:helloController
 * Package:com.aaa.springmvc.controller
 * Description:
 *
 * @date:2020/7/20 19:34
 * @author:lee907463383@qq.com
 */
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().print("hello Servlet");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

5.src/main/webapp/WEB-INF/web.xml

声明DispatcherServlet 前端控制器,springmvc 容器配置默认文件名 springmvc-servlet.xml

/ springmvc 会拦截 /下路径,如果 /路径没有找到对应servlet 就走当前/servlet 相当于默认路径

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.aaa.springmvc.controller.HelloServlet</servlet-class>
  </servlet>

  
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!--  springmvc  容器配置默认文件名  springmvc-servlet.xml
         如果不是 springmvc-servlet.xml  必须在<init-param> 配置contextConfigLocation
         -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc-servlet.xml</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>
   <!--  进行过滤拦截,也就是说只要是经过该路径都要用前端控制器 DispatcherServlet  -->
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  
</web-app>

6.springmvc-servlet.xml 配置

1.包扫描路径 让注解生效,
2.配置mvc 注解驱动,
3.将路径 /helloController 和 HelloController 控制器进行绑定,
4.那么springmvc 在初始化时, 会默认给我们在容器中注入以下三个bean,BeanNameUrlHandlerMapping(映射处理器),SimpleControllerHandlerAdapter(处理器配置器),InternalResourceViewResolver(视图解析器),
5.为返回的jsp路径增加前缀和后缀

<?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:task="http://www.springframework.org/schema/task"

       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">

    <!--  包扫描路径  让注解生效  -->
     <context:component-scan base-package="com.aaa.springmvc.controller"></context:component-scan>
    <!--  配置mvc 注解驱动  -->
    <mvc:annotation-driven></mvc:annotation-driven>


   <!--将路径 /helloController   和 HelloController 控制器进行绑定-->

    <!-- 访问页面路径 name="/helloController"  得到的都是controller层处理过的数据,然后渲染了的jsp页面  算是静态的
       name="/helloController"   是指访问controller 层HelloController的路径
      以前都是从***.jsp中访问控制器,现在直接从name路径访问控制层 -->
    <bean name="/helloController" class="com.aaa.springmvc.controller.HelloController">

    </bean>
      <!-- 如果开发者,没有明示写出这三个Bean, 那么springmvc 在初始化时, 会默认给我们在容器中注入以下三个bean  -->
    <!--  将bean的name作为路径 key 和 Controller value  做一个map映射  -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
    <!-- 向容器注入一个处理器配置器 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    <!--向容器注入视图解析器   将model解析为浏览器识别的html-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <!--  &lt;!&ndash;为返回的jsp路径配置前缀&ndash;&gt;
        <property name="prefix" value="/jsp/"></property>
        &lt;!&ndash;为返回的jsp配置后缀&ndash;&gt;
        <property name="suffix" value=".jsp"></property>-->
    </bean>
</beans>

7.com.aaa.springmvc.controller层,创建HelloController 控制器

** 个人理解:通过设置的 在springmvc-servlet.xml,中创建的bean对象: ,去控制层,然后跳转到jsp页面,否则只单独的跳转到jsp/hello.jsp页面,里面是没有数据的 **

获取数据的流程图

SpringMVC的配置与应用

package com.aaa.springmvc.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * ClassName:HelloController
 * Package:com.aaa.springmvc.controller
 * Description:
 *
 * @date:2020/7/20 20:18
 * @author:lee907463383@qq.com
 */
public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        /*ModelAndView 模板和视图类  idea自带自带的类   声明一个modelAndView对象  set路径,add(kev,value)*/
        ModelAndView modelAndView = new ModelAndView();
        /*连接jsp前台页面的路径*/
        modelAndView.setViewName("/jsp/hello.jsp");
        /*给前台页面数据赋值*/
        modelAndView.addObject("msg","helloController");
        return modelAndView;
    }
}

8.创建src/main/webapp/jsp/hello.jsp

<%--
  Created by IntelliJ IDEA.
  User: 90746
  Date: 2020/7/20
  Time: 20:21
  To change this template use File | Settings | File Templates.
--%>
<%-- isELIgnored 解决el表达式不生效问题--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    msg:${msg}

</body>
</html>

9.com.aaa.springmvc.controller层,创建FirstController控制器(使用了注解)

在springmvc-servlet.xml编写代码

<!--  配置包扫描路径  让注解生效  -->
    <context:component-scan base-package="com.aaa.springmvc.controller"></context:component-scan>
    <!--  配置mvc 注解驱动  -->
    <mvc:annotation-driven></mvc:annotation-driven>

**FirstController层代码: 用到的注解:
1.@Controller //标记当前类是个控制类,
2.@RequestMapping("/test") //标记在类上, 表示当前类下所有的映射路径 都在前面追加路径 /test/firstA, **
SpringMVC的配置与应用

3. @RequestMapping("/first") //将我们对应处理器 配置一个路径 绑定DispatcherServlet处理器,
SpringMVC的配置与应用

5. @RequestMapping(value = {"/firstA","/firstB"}) //可以为一个处理器 配置多个路径,
6. @RequestMapping(path = {"/firstA","/firstB"},method = RequestMethod.GET) //标记当前method方法只支持get,改成POST也没用会报错,
SpringMVC的配置与应用SpringMVC的配置与应用

6. @GetMapping(path = {"/secondA","/secondB"}) //要求处理器支持method=get 请求,等价于@RequestMapping(path = {"/firstA","/firstB"},method = RequestMethod.GET),
SpringMVC的配置与应用

7. 带有HttpServletRequest 请求意味这能得到前台 所有的数据 (HttpServletRequest servletRequest)
SpringMVC的配置与应用
SpringMVC的配置与应用

8. @GetMapping("/third") 有参数(HttpServletRequest servletRequest, Model model, Map map) //返回值 string 代表返回时的 jsp 的路径,
SpringMVC的配置与应用
SpringMVC的配置与应用

9. @GetMapping("/four") 有参数 httpServletResponse.getWriter().println(“four1111”);
SpringMVC的配置与应用

10. @GetMapping("/forwardTest") 转发 返回Sting 是url 1.发生在应用内部,2浏览器url没有改变 3可以通过HttpServletRequst 增加属性

SpringMVC的配置与应用

11. @GetMapping("/redirectTest") 重定向: 1.url 改变(将url发给客户端,客户端重新发起请求) 2.参数丢失 3.访问外部项目

package com.aaa.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

/**
 * ClassName:FirstController
 * Package:com.aaa.springmvc.controller
 * Description:
 *
 * @date:2020/7/20 20:57
 * @author:lee907463383@qq.com
 */
@Controller   //标记当前类是个控制类
@RequestMapping("/test")  //标记在类上,   表示当前类下所有的映射路径  都在前面追加路径 /test/firstA
public class FirstController {

//    @RequestMapping("/first") //将我们对应处理器 配置一个路径  绑定DispatcherServlet处理器
   // @RequestMapping(value = {"/firstA","/firstB"})   //可以为一个处理器  配置多个路径
    @RequestMapping(path = {"/firstA","/firstB"},method = RequestMethod.GET)   //标记当前method方法只支持get,改成POST也没用会报错
    public ModelAndView first(){
        /*ModelAndView 模板和视图类  idea自带自带的类   声明一个modelAndView对象  set路径,add(kev,value)*/
        ModelAndView modelAndView = new ModelAndView();

        /*连接jsp前台页面的路径*/
        modelAndView.setViewName("/jsp/hello.jsp");
        /*给前台页面数据赋值*/
        modelAndView.addObject("msg","helloController");
        return modelAndView;
    }

    @GetMapping(path = {"/secondA","/secondB"})  //要求处理器支持method=get 请求,等价于@RequestMapping(path = {"/firstA","/firstB"},method = RequestMethod.GET)
    public ModelAndView second(HttpServletRequest servletRequest){
        /*这里添加了参数  HttpServletRequest  servletRequest
        * 有了servletRequest 请求就意味这能得到前台     所有的数据
        *
        * */
        String param = servletRequest.getParameter("param");
        /*ModelAndView 模板和视图类  idea自带自带的类   声明一个modelAndView对象  set路径,add(kev,value)*/

        ModelAndView modelAndView = new ModelAndView();

        /*连接jsp前台页面的路径*/
        modelAndView.setViewName("/jsp/hello.jsp");
        /*给前台页面数据赋值*/
        modelAndView.addObject("msg","second --- param:"+param);

        return modelAndView;

}
        @GetMapping("/third")
        //返回值   string 代表返回时的 jsp 的路径
        public String third(HttpServletRequest servletRequest, Model model, Map map){
         //向jsp传递属性
            servletRequest.setAttribute("msg","servletRequest");
            //通过model 向jsp传递属性  本质也是向 HttpServletRequest写入属性
//            model.addAttribute("msg","model");

        map.put("msg","map");
       return "/jsp/hello.jsp";
    }

   @GetMapping("/four")
    public void four(HttpServletRequest servletRequest, HttpServletResponse httpServletResponse) throws IOException {
       httpServletResponse.getWriter().println("four1111");
   }
    @GetMapping("/forwardTest")
    //转发  返回Sting 是url
    //1.发生在应用内部,2浏览器url没有改变 3可以通过HttpServletRequst 增加属性
    public String forwardTest(){
        return "forward:/test/firstA";
    }
    @GetMapping("/redirectTest")//重定向: 1.url 改变(将url发给客户端,客户端重新发起请求) 2.参数丢失  3.访问外部项目
    public String redirectTest(){
        return  "redirect:https://www.baidu.com";
    }

}


注意: 1.这里路径没有增加返回jsp路径的前后缀,

SpringMVC的配置与应用

2.有些引入一定要选带有mvc字样的包接口或者实现类,

SpringMVC的配置与应用

3.本节很基础,但是涉及了工程的搭建和注解的使用,以及访问的流程如下图。(要会背!!! 面试会问。 所以放下边 - -、、、)

*重点:springmvc的启动流程

SpringMVC的配置与应用
1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截
器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View.
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。

本文地址:https://blog.csdn.net/nnnnnnnnnnii/article/details/107470164