系列文章目录
文章目录
前言
springmvc是spirng3.0之后问世的,是基于mvc结构的框架。主要用来对controller层的管理,接受用户的请求,并且返回请求处理的结果
一、DispatcherServlet
概述
这个是spirngmvc中的中央调度器,主要是接受用户的请求,然后根据请求uri映射到对应的处理器/控制器,调用控制器的方法处理用户请求,返回请求的处理结果。控制器就相当于一个普通的类,dispatcherservlet赋予了它能够处理用户的请求,在web.xml中进行配置,并且通过初始化方法,传入resource/springmvc.xml配置文件的位置。
关于拦截请求:
/:表示拦截所有的动态资源请求和静态资源,可以显示jsp
/*:表示拦截所有的资源请求,全部由springmvc处理
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 所有*.do请求都归属于这个中央调度器-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
二、springmvc简单使用
1.新建maven工程,导入依赖
2.注册dispatcherservlet
设置中央调度器在tomcat服务器启动时创建,创建时会初始化方法来加载配置文件中配置,默认加载的springmvc配置文件的位置在/WEB-INF/下面,我们需要修改默认配置文件所在的位置为类路径。
3.新建springmvc配置文件
扫描controller包下所有的处理器类,声明视图解析器(视图的前缀,后缀)
4.创建controller层,新建控制器类
controller需要Controller注解,在控制器方法上声明方法的请求映射,方法返回值为ModelAndView
三、处理器方法
RequestMapping
value = “test/id=1” / value=“test/’{id}”
@PathVariable("id") Integer id
localhost:8080/项目名/test/1
params={String,String…}
ge params={"!username"}
向这个处理器发起请求时,必须带上指定名字的参数名,否则404,!表示不允许出现
headers={String,String}
eg:headers={“User-Agent=firefox…”},指定火狐浏览器方法
向这个处理器发起请求时,比需带上指定请求头参数名和参数值信息,否则404
method=RequestMethod.POST
可以采用这种方式使用相同mappingname,但是方法不同作为控制器方法,符合Rest风格
可以发现delete,update都是普通的get请求,
ResponseBody
三、处理器方法的参数列表
1)HttpServletResponse,HttpServletRequest,HttpSesson中央调度器可以直接赋值
2)基本数据类型:变量名与请求中的参数名保持一致,基本数据类型,可以自动进行类型的转换(强转可能出错),如果参数名和变量不一致,赋值为null(int类型直接报错的)。可以使用注解RequestParam指定变量名和名字,还可以设置required属性,默认为true,即必须赋值,若没有匹配的名字,则报错,false,如果没有找到,赋值为null(基本数据类报错),出现的错误均为400,也就是请求错误
3)对象:对象中的属性和请求中的参数名保持一致,采用对象中的set方法对属性赋值,
4)map:键值对的方式存储,key=参数名,value=参数值
5) @RequestMapping("/test/{id}")
@PathVariable("id") Integer id
localhost:8080/test/1===>localhost:8080/test?id=1
注意这样只能是使用一次get请求
6)@RequestParam("参数名") 基本数据类型 参数名,可以省略注解和第一种方式类似
7)@RequestHeader("参数名") 获取请求头中的值
四、处理器方法的返回值
1、void:没有返回值
2、String:返回值是视图的名称,但是没有数据。
3、Object:可以是任意类型,与返回数据有关
4、ModelAndView:返回的模型视图对象,会采用请求转发的方式显示一个视图,并且将数据存入到请求作用域对象中,
5、返回数据给浏览器:在方法上加上resposnebody,name返回的都是符合json格式的字符串,需要加入相应的依赖才能完成默认的是jackson。
6、数据转换的原理:???,需要加上注解驱动。
7、如果方法的形参是Map<String,Object>类型,那么也会自动的加入到Model数据中
8、@SessionAttributes放在类上,不能在方法,使用map时同时会将key,value存入到session中,
五、 返回数据
String
在方法上声明@ResponseBody注解,也可以在类上声明,表示所有的处理器方法都是返回的数据,而非ModelAndView类
JSON
Object返回值执行流程:
1)、调用ArrayList中每个类的canWrite()方法,检查哪个消息转换器接口的实现类能够实现对象的数据转换(能够处理返回值对象,),@#
2)、调用实现类的write()方法,转换成执行数据格式转换,默认编码(针对Jackson2HttpMessageConverter:contentType:application/json;charset=utf-8)@#
3)、通过处理器上的方法将转换的数据格式写入到响应包中的响应体中,
4)、返回值是string类型,写到响应体中,需要加入@ResponseBody注解,此时也就是相当于返回的是的Object类型,和上面的步骤一样,实现的类是StringHttpMessageConverter完成的。
五、中央处理器处理所有的用户请求
在web.xml中设置处理器的映射的为/表示处理所有的请求,但是我们没有定义处理静态资源访问的处理方法,所以我们可以将处理交给tomcat,但是这样所有的请求都会交给tomcat处理,所以我们需要在配置文件中定义注解驱动。或者采用springmvc内部的处理方法,但是也需要定义注解驱动
六、forward和redirect
在返回的视图名称中,如果我们采用视图解析器,那么所有的视图都是采用这个路径,我们可以在视图名称前加上forwar:打破这一规则,redirect:也有同样的作用,但是它是采用sendRedirect返回视图的,并且将model中的数据放到url上,而且不能访问web-inf下面的文件。
七、异常处理
全局异常处理
声明异常处理类,类上需要写上注解@ControllerAdivce
加上注解@ExceptionHandler(声明方法处理的异常类型)类中的每一个方法对应一个异常的处理方法,参数可以是request,response,session,Exception
如果方法上注解没有声明异常处理类型,那么这个方法可以处理器所有的请求。
在当前controller中声明处理方法
配置文件中,需要扫描这个组件
八、拦截器
1)拦截器的定义
①创建一个类实现HandlerInterceptor
②实现preHandle,postHandle,afterHandle,
③preHandle:参数:request,resposne,object handler(被拦截的控制器对象),返回值(preHandle方法才有返回值):boolean,true表示方法正常执行,false,表示不允许执行处理器方法。处理器执行方法之前执行
④postHandle:参数:request,resposne,Object Handler(被拦截的控制器对象) ,ModelAndView mv返回值对象,可以用来修改返回值。处理器方法执行完成之后执行的。
⑤afterHandle:参数::request,resposne,Object Handler(被拦截的控制器对象) ,Exception ex(程序中发生的异常),资源回收,请求过程中创建了一些对象,在这里可以销毁。请求处理完成之后(进行了页面跳转/返回数据到前端)执行的。
2)配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- 指定拦截器拦截的uri请求 /**表示拦截所有请求,/user/**表示拦截user下所有的请求-->
<mvc:mapping path="/**" />
<!-- 声明拦截器对象-->
<bean class="">
</mvc:interceptor>
<!-- 可以有多个拦截器,顺序拦截 -->
<mvc:interceptor>
<!-- 指定拦截器拦截的uri请求 /**表示拦截所有请求,/user/**表示拦截user下所有的请求-->
<mvc:mapping path="/**" />
<!-- 声明拦截器对象,可以有多个拦截器,顺序拦截 -->
<bean class="">
</mvc:interceptor>
</mvc:interceptors>
3)拦截器执行链
存在多个拦截器时,会按照配置文件的声明顺序对请求进行拦截,只有多个拦截器都执行成功后,才会执行处理器方法,也只有拦截器的preHandle方法返回为true,才会执行这个拦截器的afterHandle方法。
4)拦截器和过滤器的区别
①过滤器实现filter接口,由tomcat管理的,在拦截器之前执行。拦截器是实现interceptor接口,由springmvc中的dispatcherservlet进行管理的。
②过滤器只有一个执行时机(servlet调用之前),拦截器有三个执行时机(方法执行之前,执行之后,请求处理完成之后)
③过滤器主要用来设置字符编码的,拦截器更偏向于权限认证,控制请求。
九、springmvc执行原理
用户请求—>tomcat—>dispatcherservlet—>处理器映射器(处理器执行链:获取处理器对象和拦截器)–处理器执行链—>处理器适配器(根据处理器对象找到处理请求的方法,执行处理器方法)—>返回值ModelAndView—>将完整的视图路径和数据封装到View中—>利用请求转发跳转到指定视图,将数据存入请求作用域对象中。
十、其他
1.字符集编码
采用spirngmvc内部的CharacterEncodingFilter实现(声明字符集,和强转),也可以自己定义filter实现,
2.视图解析器
1)实现与打破
设置一个公共的视图路径,在视图的setName属性中,可以不用直接写文件的全路径,只需要写文件的名称即可,但是需要保证这些文件都在视图解析器定义的同一路径下。
打破规则:
请求转发:forward:/index.jsp
重定向:redirect:/index.jsp
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀名,也就是路径-->
<property name="prefix" value="/WEB-INF/view/" />
<!-- 后缀名,也就是文件类型-->
<property name="suffix" value=".jsp" />
</bean>
2)源码
3.RequestMapping
1)修改响应头的contentType
2)声明处理器方法的处理的请求方式
3)实现请求uri和处理方法的映射,可以声明到类上面,表示这个类中的方法都具有类中的这一个路径
4、日期格式转换
@DateTimeFormat(“yyyy-MM-dd hh:mm:ss”)