SpringMVC

Posted 轻舟一曲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC相关的知识,希望对你有一定的参考价值。

[我的工作台 - Gitee.com]:

开篇

ssm: mybatis+Spring+SpringMVC MVC三层架构

MVC:模型(dao,service) 视图(jsp) 控制器(servlet)

MVVM:M V VM viewModle 双向绑定

servlet:转发,重定向

JavaSE: 认真学习,老师带,入门快;

JavaWeb:认真学习,老师带,入门快;

SSM框架:研究官方文档,锻炼自学能力,锻炼项目能力。

后续学习……

SpringMVC+Vue+SpringBoot+SpringCloud+Linux

框架整合 SSM=JavaWeb做项目;

Spring:IOC和AOP

SpringMVC:SpringMVC的执行流程! SSM框架整合

SpringMVC简介

什么MVC

MVC主要作用是降低了视图与业务逻辑之间的双向耦合。

最典型的MVC:JSP+servlet+javabean

MVC框架要做那些事情

  • 将url映射到java类或java类的的方法
  • 封装用户提交的数据
  • 处理请求–调用相关的业务处理–封装响应数据
  • 将响应的数据进行渲染.jsp/html等表示层数据

常见的服务器MVC框架:Structs,Spring MVC,ASP.NET MVC,ZendFramework,JSF;

常见的前端MVC框架:Vue,angularjs,react,backbone;

由MVC演化的另外一些模式:MVP,MVVM……

什么是SpringMVC

概述

Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。

Spring的web框架围绕DispatcherServlet[调度Servlet]设计

中心控制器

SpringMVC以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。

SpringMVC执行原理

回顾servlet

pom.xml依赖

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.4</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

新建一个Moudle,添加web app的支持

编写Servlet类,处理用户请求

package com.kuang.servlet;

//实现Servlet接口
public class HelloServlet extends HttpServlet 
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
       //取得参数
       String method = req.getParameter("method");
       if (method.equals("add"))
           req.getSession().setAttribute("msg","执行了add方法");
      
       if (method.equals("delete"))
           req.getSession().setAttribute("msg","执行了delete方法");
      
       //业务逻辑
       //视图跳转
       req.getRequestDispatcher("/WEB-INF/jsp/hello.jsp").forward(req,resp);
  

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
       doGet(req,resp);
  

编写JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>Kuangshen</title>
</head>
<body>
$msg
</body>
</html>

在web.xml中注册Servlet

<?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_4_0.xsd"
        version="4.0">
   <servlet>
       <servlet-name>HelloServlet</servlet-name>
       <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
   </servlet>
   <servlet-mapping>
       <servlet-name>HelloServlet</servlet-name>
       <url-pattern>/user</url-pattern>
   </servlet-mapping>

</web-app>

配置Tomcat,并启动测试

热部署

  • 项目运行时build (设置setting)
  • 项目运行时make (regitry)
  • 预编译 build project
  • tomcat热部署设置

第一个SpringMVC程序

配置版

新建mvc项目

  • 新建Moudle,添加web支持

  • 确定导入SpringMVC依赖

  • 配置web.xml,注册DispatcherServlet

     <!--1.注册servlet-->
       <servlet>
           <servlet-name>SpringMVC</servlet-name>
           <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
           <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
           <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>classpath:springmvc-servlet.xml</param-value>
           </init-param>
           <!-- 启动顺序,数字越小,启动越早 -->
           <load-on-startup>1</load-on-startup>
       </servlet>
    
       <!--所有请求都会被springmvc拦截 -->
       <servlet-mapping>
           <servlet-name>SpringMVC</servlet-name>
           <url-pattern>/</url-pattern>
       </servlet-mapping>
    
  • 编写SpringMVC的配置文件!名称: [servletname]-servlet.xml

  • 添加映射处理器,添加处理器适配器

     <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
          <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
          <!--视图解析器:DispatcherServlet给他的ModelAndView-->
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
                <!--前缀-->
                <property name="prefix" value="/WEB-INF/jsp/"/>
                <!--后缀-->
                <property name="suffix" value=".jsp"/>
          </bean>
    
  • 添加视图解析器

  • 编写我们要操作的业务Controller,要么实现Controller接口,要么增加注解

;需要返回一个ModelAndView,装数据,封视图

  • 将自己的类交给SpringIOC容器,注册bean
  • 写要跳转的jsp页面,显示ModelAndView存放的数据已经我们的正常页面;
  • 配置Tomcat启动测试

实际开发中不会这么干

可能遇到的问题:访问出现404

排查步骤:

  • 查看控制台输出,看是否缺少jar包

  • 查看IDEA的项目发布中添加lib依赖!

    ![img](file:///C:\\Users\\Administrator\\AppData\\Roaming\\Tencent\\Users\\3460942872\\QQ\\WinTemp\\RichOle_641B_]8O8B4A5P@U707.png)

  • 重现build项目,启动Tomcat!

web5.0版本没有智能提示

将web.xml5.0换为web.xml4.0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Um4zCDLU-1621503850274)(file:///C:\\Users\\Administrator\\Documents\\Tencent Files\\3460942872\\Image\\C2C\\OH_[1GR@HH%NQPC]RB0FT.jpg)]

注解版本

步骤

  • 新建Moudle ,添加web支持

  • 由于Maven可能存在静态资源过滤问题,将配置完善

  • pom.xml引入相关依赖,主要有Spring框架核心库,SpringMVC ,servlet,JSTL,一般在在父工程中已经引入。

  • 配置web.xml

  • 添加SpringMVC配置文件

    <?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"
           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">
    
        <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 -->
        <context:component-scan base-package="com.mf.controller"/>
        <!-- 让Spring MVC不处理静态资源 -->
        <mvc:default-servlet-handler />
        <!--
        支持mvc注解驱动
            在spring中一般采用@RequestMapping注解来完成映射关系
            要想使@RequestMapping注解生效
            必须向上下文中注册DefaultAnnotationHandlerMapping
            和一个AnnotationMethodHandlerAdapter实例
            这两个实例分别在类级别和方法级别处理。
            而annotation-driven配置帮助我们自动完成上述两个实例的注入。
         -->
        <mvc:annotation-driven />
    
        <!-- 视图解析器 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
              id="internalResourceViewResolver">
            <!-- 前缀 -->
            <property name="prefix" value="/WEB-INF/jsp/" />
            <!-- 后缀 -->
            <property name="suffix" value=".jsp" />
        </bean>
    
    </beans>
    
  • 创建Controller

  • 创建视图层

  • 配置Tomcat运行

Maven可能存在资源过滤问题


<build>
   <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
       <resource>
           <directory>src/main/resources</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>false</filtering>
       </resource>
   </resources>
</build>

控制器Controller和RestFul风格

控制器Controller

通常通过接口定义或注解定义两种方法实现。

解析请求转换成模型。

SpringMVC中一个控制器类可包含多个方法,SpringMVC中Controller的配置方式有很多种。

实现Controller接口

1.编写一个Controler类

//定义控制器
//注意点:不要导错包,实现Controller接口,重写方法;
public class ControllerTest1 implements Controller 

   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception 
       //返回一个模型视图对象
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","Test1Controller");
       mv.setViewName("test");
       return mv;
  

2.去Spring配置文件中注册请求的Bean,name对应请求路径,class对应处理请求的类

<bean name="/t1" class="com.kuang.controller.ControllerTest1"/>

3.编写test.jsp

4.Tomcat运行

说明:实现Controller定义控制器是比较老的方法。

一个控制器中只有一个方法,如果要多个方法需要定义多个Controller。

使用注解@Controller

  • @Controller注解类型用于声明Spring类的实例是一个控制器

  • 组件扫描

    <!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
    <context:component-scan base-package="com.kuang.controller"/>
    
  • 编写Controller类,使用注解实现

    //@Controller注解的类会自动添加到Spring上下文中
    @Controller
    public class ControllerTest2
    
       //映射访问路径
       @RequestMapping("/t2")
       public String index(Model model)
           //Spring MVC会自动实例化一个Model对象用于向视图中传值
           model.addAttribute("msg", "ControllerTest2");
           //返回视图位置
           return "test";
      
    
    
    
  • Tomcat测试

四个注解

  @Component 组件
  @Service   service
  @Controller  controller
  @Repository   dao

我们的两个请求都可以指向一个视图,但是页面结果的结果是不一样的,从这里可以看出视图是被复用的,而控制器与视图之间是弱偶合关系。

@RequestMapping

用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RestFul风格

简介

RestFul风格就是一个资源定位以及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格的设计的软件更加简洁,更有层次,更加易于实现缓存等机制。

资源:互联网的所有事物称之为资源。

  • 传统范式操作资源
  • 使用RESTful操作资源

学习测试

1.编写RestFulController类

2.SpringMVC上使用@PathVariable注解,让方法参数的值对应绑定到一个URI模板变量上。

3.测试

tip:

1.改动java代码:Redeloy

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RqNxWL4N-1621503850277)(file:///C:\\Users\\Administrator\\Documents\\Tencent Files\\3460942872\\Image\\C2C\\V2BTTRMT93(CLMI@)]30EU7L.png)

2.改动配置文件,重新启动tomcat

3.改动前端,刷新一下

常用请求注解

  • @GETMapping(path:)
  • @POSTMaping(path:)

重定向和转发

springmvc结果跳转方式:

  1. modelAndview

    页面:视图解析器前缀+viewName+视图解析器后缀

  2. 原生ServletAPI

    通过HttpServletResponse进行输出,重定向,转发。

    sendRedirect();

    getRequestDispatcher().fowward();

  3. springmvc实现转发和重定向,无需视图解析器

    springmvc默认是转发;

    加redirect后就是重定向。有视图重定向。

数据处理

处理提交数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hzYEo3r9-1621503850281)(https://i.loli.net/2021/05/20/zlZ67VHR9wXWytL.png)]

访问web目录下的index.jsp路径问题:req.getContextPath()+"/index.jsp"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Mn6U2zZ-1621503850284)(https://i.loli.net/2021/05/20/4UaOZeThQM5psLE.png)]

乱码处理

请求方式的问题

添加springmvc的过滤器

<filter>
   <filter-name>encoding</filter-name>
   <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
   <init-param>
       <param-name>encoding</param-name>
       <param-value>utf-8</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>encoding</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

/*

注意这里是/*,处理包括jsp的页面,否则过滤器对前端的处理无法生效。

整合SSM

pom依赖

junit,数据库驱动,数据库连接池c3p0,servletJSp(servletapi,jspapi,jstl),mybatis(mybatis和mybatis-spring),spring(springmvc和springjdbc),静态资源过滤;

<dependencies>
   <!--Junit-->
   <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
   </dependency>
   <!--数据库驱动-->
   <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.47</version>
   </dependency>
   <!-- 数据库连接池 -->
   <dependency>
       <groupId>com.mchange</groupId>
       <artifactId>c3p0</artifactId>
       <version>0.9.5.2</version>
   </dependency>

   <!--Servlet - JSP -->
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
       <version>2.5</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet.jsp</groupId>
       <artifactId>jsp-api</artifactId>
       <version>2.2</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>jstl</artifactId>
       <version>1.2</version>
   </dependency>

   <!--Mybatis-->
   <dependency>
       <groupId>org.mybatis</groupId>
       <artifactId>mybatis</artifactId>
       <version>3.5.2</version>
   </dependency>
   <dependency>
       <groupId>org.mybatis</groupId>
       <artifactId>mybatis-spring</artifactId>
       <version>2.0.2</version>
   </dependency>

   <!--Spring-->
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-webmvc</artifactId>
       <version>5.1.9.RELEASE</version>
   </dependency>
   <dependency>
       <groupId>org.springframework</groupId>
       <artifactId>spring-jdbcSpringMVC中的参数绑定总结

SpringMVC中的参数绑定总结

SpringMVC学习02走进SpringMVC的世界

SpringMVC上传文件的 4 种方式,你都会么?

从SpringMVC获取用户信息谈起

农民工看完都会了!java简历包装医疗项目