SpringMVC 01

Posted FremontUltimate

tags:

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

SpringMVC 01

1.概述

SpringMVC 也叫 Spring web mvc,基于spring,是 Spring 框架的一部分

  • springmvc内部是使用mvc架构模式

  • SpringMVC 是管理对象的容器,使用IoC核心技术

  • springmvc管理界面层中的控制器对象

  • SpringMVC底层是Servlet。 以Servlet为核心, 接收请求,处理请求

发起请求----SpringMVC---Spring---MyBatis--mysql数据库

 

1.1 DispatcherServlet

DispatcherServlet 是一个Servlet对象,也叫做前端控制器( front controller),负责接收请求, 响应处理结果。

通过SpringMVC容器创建一种叫做控制器的对象,代替Servlet

SpringMVC 主要使用注解的方式, 创建控制器对象, 处理请求

  • @Controller 创建处理器对象

  • @Service 创建业务对象

  • @Autowired 或者@Resource 在控制器类中注入 Service, Service 类中注入Dao

1.2 操作

1.新建maven web 项目

2.加入 Servlet 依赖,SpringMVC 依赖

<dependency> 
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- 编码和编译和JDK版本 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>

3.注册中央调度器

<servlet>
   <servlet-name>springmvc</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <!--自定义配置文件的位置
DispatcherServlet其继承自 FrameworkServlet
属性 contextConfigLocation,用于设置SpringMVC配置文件的路径及文件名
-->
   <init-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:springmvc.xml</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/mymvc</url-pattern>
</servlet-mapping>

全限定性类名 org.springframework.web.servlet

<load-on-startup>

  • 是否在 Web 服务器启动时会创建这个 Servlet 实例

  • 值必须是一个整数

  • 大于等于 0 时,表示容器在启动时就加载并初始化

  • 数值越小,Servlet 优先级就越高

  • 小于 0 或者没有时,表示该 Servlet 在被使用时才会去创建

  • 值相同时,容器会自己选择创建顺序

<url-pattern>把一些请求交给指定的servlet处理

  • 使用扩展名方式, 格式 .xxx,建议写为.do 的形式

  • 使用斜杠 "/"

<init-param>设置查找 SpringMVC 配置文件路径及文件名一般设在resources 目录下

4.配置文件 ---Servlet 名称-servlet.xml (springmvc-servlet.xml)

5.创建处理器

编写类和方法,添加相应注解

  • @Controller:表示当前类为处理器

  • @RequestMapping(value="xxx"):表示当前方法为处理器方法

    • 该方法要对 value 属性所指定的 URI 进行处理与响应。

    • 被注解的方法的方法名可以随意。

    • value 属性中可以写上一个数组

  • 处理结果放入ModelAndView对象中(数据和视图)

    • addObject()方法用于向其 Model 中添加数据

    • setViewName()设置跳转路径

    • Model 的底层为一个 HashMap

    • 数据存储request 作用域

    • SpringMVC 默认采用转发跳转到视图,本次请求结束,模型中的数据被销毁

6.声明组件扫描器

在 springmvc.xml 中注册

<context:component-scan base-package="com.fremont.controller"/>

7.定义目标页面 JSP存放WEB-INF下

若jsp无法显示则添加:

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

WEB-INF下受保护,只能从程序访问

8.修改视图解析器的注册

避免对于请求资源路径与扩展名上的冗余,视图解析器 InternalResouceViewResolver 中引入了

请求的前辍与后辍。而ModelAndView 中只需给出要跳转页面的文件名即可。具体的文件路径与

文件扩展名,视图解析器会自动完成拼接。

springmvc的配置文件

<!--声明视图解析器:帮助处理视图-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀:指定视图文件的路径-->
   <property name="prefix" value="/WEB-INF/view/" />
   <!--后缀:视图文件的扩展名-->
   <property name="suffix" value=".jsp" />
</bean>

使用逻辑视图名称,文件名

1.3 SpringMVC请求处理顺序

1.4 配置文件

web.xml 部署描述符文件:服务器启动时,读取web.xml ,根据声明创建对象,确定请求和servlet等对象的关系

框架的配置文件:声明框架创建的项目中的各种对象, 主要是创建Controller对象

加载顺序和功能

  • tomcat服务器启动, 读取web.xml

  • 创建DispatcherServlet对象,执行init(),执行 springmvc容器对象创建

  • springmvc框架:new ClassPathXmlApplicationContext()读取springmvc的配置文件

  • 组件扫描器遍历controller包,找到注解, 创建MyContoller对象

  • 发起请求---->DispatcherServletDispatcherServletWebApplicationContextWebApplicationContext 里有MyController对象

1.5 SpringMVC组件

 

1.5 SpringMVC内部执行流程

  • 用户发起请求给DispatcherServlet

  • DispatcherServlet把请求(request)交给了 处理器映射器

    • 处理器映射器: springmvc框架中的对象, 需要实现HandlerMapping接口

    • 映射器作用: 从springmvc容器中,获取控制器对象(MyController),把找到的控制器和拦截器对象都放到处理器执行链对象中,保存,并返回给中央调度器。

  • DispatcherServlet把获取到的处理器执行链中的控制器对象,交给了处理器适配器

    • 处理器适配器:是springmvc框架中的对象, 实现HandlerAdapter接口

    • 适配器作用: 执行控制器的方法, 也就是执行MyController.doSome()方法。得到结果ModelAndView

  • DispatcherServlet把控制器执行结果mv交给了 视图解析器

    • 视图解析器: springmvc中的对象,需要实现ViewResolver接口

    • 视图解析器作用: 处理视图的, 组成视图的完整路径。 能创建View类型的对象

  • DispatcherServlet调用View类的方法, 把Model中的数据放入到request作用域。

    • 执行request.setAttribute(), 对视图执行forward()转发行为

2.SpringMVC注解式开发

2.1@RequestMapping

value :请求的url地址,相对于 Web 的根目录

  • 常以“/”开始,注解在方法与类上

  • @Controller 所注解的类中,其各方法公共的url部分注解在类之上,作为模块名称

method:请求的方式(取值为 RequestMethod 枚举常量)

  • RequestMethod.GET 与 RequestMethod.POST

  • GET:表单默认,AJAX默认,地址栏,超链接,src资源请求

  • POST:只有表单、AJAX可用

  • 若不指定 method,则均可匹配

produces:指定content-type

  • 解决中文---content-type="text/plain;charset=utf-8"

 

2.2 请求参数

HttpServletRequest, HttpServletResponse, HttpSession

控制器方法形参列表直接添加定义,框架会给参数赋值, 即可直接使用 request,response,session参数。

逐个接收:请求中的参数名和控制器方法的形参名相同

  • 最好使用包装类型,能接收空值情况, 接收的是null

  • 可以使用String到int ,long, float, double等类型转换。

  • post请求中有乱码问题, 使用字符集过滤器

CharacterEncodingFilter----在web.xml 声明过滤器

<filter>
   <!--
最好将该过滤器注册在其它过滤器之前
因为过滤器的执行是按照其注册顺序进行的
-->
       <filter-name>characterEncodingFilter</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>
       <init-param>
           <!--强制请求(request)对象使用encoding的编码方式-->
           <param-name>forceRequestEncoding</param-name>
           <param-value>true</param-value>
       </init-param>
       <init-param>
           <!--强制应答(response)对象使用encoding的编码方式-->
           <param-name>forceResponseEncoding</param-name>
           <param-value>true</param-value>
       </init-param>
</filter>
<filter-mapping>
   <filter-name>characterEncodingFilter</filter-name>
   <!--强制所有请求,先经过过滤器处理-->
   <url-pattern>/*</url-pattern>
</filter-mapping>

校正请求参数名

请求 URL 参数名与处理方法中指定的参数名不相同时在处理方法参数前,添加一个注解

  • @RequestParam(“请求参数名”)

  • value 属性指定请求参数的名称

  • required : boolean类型的,默认是true

    • true:请求中必须有此参数,没有报错。

    • false:请求中可以没有此参数。

对象接收

  • 形参是java对象,使用java对象的属性接收请求中参数值

  • 属性名和请求中参数名一样

 

2.3 处理方法返回值

用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型:

ModelAndView, String, void , Object

ModelAndView -----数据和视图

  • 数据:存放request作用域

  • 视图:执行forward转发操作

String 视图-----forward转发

  • 完整视图路径, 或者视图的逻辑名称(通过视图解析器)

  • 若要跳转的资源为内部资源,使用InternalResourceViewResolver内部资源视图解析器

void-----没有数据和视图

  • 使用HttpServletResponse对象输出数据,响应ajax请求

  • 加入 jackson,将字符串包装为 JSON 格式

Object-----响应ajax请求-----任意类型

框架提供了处理 java对象到json转换

  • HttpMessageConverter 消息转换器

    • 实现请求的数据转为java对象

    • 控制器方法返回的对象转为json,xml,text,二进制等不同格式

    • 实现类:MappingJackson2HttpMessageConverter(jackson的ObjectMapper转为json)、StringHttpMessageConverter(字符串类型格式转换和编码)

    • 框架根据控制器方法的返回类型自动查找使用的实现类

    • 默认springmvc使用了4个实现类,不含MappingJackson那个

    • 加入注解驱动的标签 mvc:annotation-driven,启动后会创建接口的7个实现类对象

    实现类作用
    ByteArrayHttpMessageConverter 读/写二进制格式的数据
    StringHttpMessageConverter 读/写字符串格式的数据
    ResourceHttpMessageConverter 读/写资源文件数据
    SourceHttpMessageConverter 读/写来自 HTTP 的请求与响应的javax.xml.transform.Source,支持DOMSource, SAXSource,StreamSource 的 XML 格式
    AllEncompassingFormHttpMessageConverter 处理表单(form)数据
    Jaxb2RootElementHttpMessageConverter 使用 JAXB 负责读取和写入 xml 标签
    MappingJackson2HttpMessageConverter 读取和写入 json 格式的数据
  • @ResponseBody:将转换后的json通过HttpServletResponse对象输出

  • 步骤

    • pom.xml加入jackson依赖,默认处理json就是使用jackson

    • 注解驱动的标签mvc:annotation-dirven

    • 加入@ResponseBody注解,表示返回值数据,输出到浏览器

 

2.4 url-pattern

2.4.1 配置详解

SpringMVC 的中央调度器 DispatcherServlet<url-pattern/>

常用后辍匹配方式 *.do, *.action, *.mvc

写为/时

  • 中央调度器成为默认的default servlet

  • DispatcherServlet 静态资源的请求.css、.js、.jpg、.png 等,当作普通的 Controller 请求

  • 默认中央调度器没有处理静态资源的控制器对象

  • 因此所有的静态资源获取请求均会报 404 错误

2.4.2 静态资源访问

1.声明<mvc:default-servlet-handler />-----springmvc的配置文件

  • springmvc 框架会在容器中创建 DefaultServletHttpRequestHandler 处理器对象

  • 对进入 DispatcherServlet 的 URL 进行筛查

  • 静态资源的请求将转由 Web 应用服务器默认Servlet 处理

  • Tomcat 专门用于处理静态资源DefaultServlet,其<servlet-name/>为 default

  • 该 Servlet 注册在 Tomcat 的 web.xml 中,在 Tomcat 安装目录/conf/web.xml

  • 默认servlet处理所有未映射的请求处理和静态资源

2.使用mvc:resources标签

  • 框架会创建ResourceHttpRequestHandler控制器对象处理静态资源

  • 不依赖tomcat服务器----推荐使用的

<!--声明静态资源的第二种处理方式
   mapping: 访问静态资源的uri地址, 可以使用通配符(**)
   ** : 表示任意的目录和目录和资源名称
   location: 静态资源在项目中的位置, 不要使用/WEB-INF目录
-->
<mvc:resources mapping="/static/**" location="/static/" />

 

以上是关于SpringMVC 01的主要内容,如果未能解决你的问题,请参考以下文章

springmvc 分页查询的简单实现

Java 微服务 day01 源代码 SpringBoot的SpringMVC快速入门

19 01 11 javascript ?????????????????????(???????????????) ??????????????????????????????(代码片段

[linux][c/c++]代码片段01

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

Spring MVC 教程