springmvc

系列文章目录

前言

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”)

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值