SpringMVC 01
Posted FremontUltimate
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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无法显示则添加:
<%
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的配置文件
-
-
发起请求---->DispatcherServlet,DispatcherServlet有 WebApplicationContext ,WebApplicationContext 里有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的主要内容,如果未能解决你的问题,请参考以下文章
Java 微服务 day01 源代码 SpringBoot的SpringMVC快速入门
19 01 11 javascript ?????????????????????(???????????????) ??????????????????????????????(代码片段