SpringMVC的介绍------java

SpringMVC的介绍

文章目录


课程安排:

  • 第一天:springmvc的基础知识
    什么是springmvc?
    springmvc框架原理(掌握)
    前端控制器、处理器映射器、处理器适配器、视图解析器
    springmvc入门程序
    目的:对前端控制器、处理器映射器、处理器适配器、视图解析器学习
    非注解的处理器映射器、处理器适配器
    注解的处理器映射器、处理器适配器(掌握)
    springmvc和mybatis整合(掌握)

    springmvc注解开发:(掌握)
      常用的注解学习
      参数绑定(简单类型、pojo、集合类型(明天讲))
      自定义参数绑定(掌握)
    springmvc和struts2区别
    
  • 第二天:springmvc的高级应用
    参数绑定(集合类型)
    数据回显
    上传图片
    json数据交互
    RESTful支持
    拦截器

一 基础知识

1 Springmvc框架

1.1 什么是springmvc框架

Springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合
Springmvc是基于mvc的web框架
在这里插入图片描述

1.2 Mvc 在bs系统下的应用

Mvc是一个设计模式
在这里插入图片描述

1.3 SpringMVC结构

在这里插入图片描述

  • 第一步:发起请求到前端控制器(DispatcherServlet)
  • 第二步:前端控制器请求HandlerMapping查找Handler
    可以根据xml配置、注解进行查找
  • 第三步:处理器映射器HandlerMapping向前端控制器返回Handler
  • 第四步:前端控制器调用处理器适配器去执行handler
  • 第五步:处理器适配器去执行handler
  • 第六步:Handler执行完给适配器返回ModelAndView
  • 第七步:处理器适配器向前端控制器返回ModelAndView
    ModelAndView是springMvc的底层对象
  • 第八步:前段控制器请求视图解析器去进行视图解析
    根据逻辑视图名解析成真正的视图(jsp)
  • 第九步:视图解析器向前端控制器返回View
  • 第十步:前端控制器视图渲染
    视图渲染将模型数据(在modelAndView对象中)填充到request域
  • 第十一步:前段控制器向用户响应结果
    • 组件:
      1、前端控制器DispatcherServlet(不需要程序员开发)
      作用接收请求,响应结果,相当于转发器,中央处理器。
      有了DispatcherServlet减少了其它组件之间的耦合度。
      2、处理器映射器HandlerMapping(不需要程序员开发)
      作用:根据请求的url查找Handler
      3、处理器适配器HandlerAdapter
      作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
      4、处理器Handler需要程序员开发
      注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
      5、视图解析器View resolver(不需要程序员开发)
      作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
      6、视图View(需要程序员开发jsp)
      View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

2 入门程序

2.1 环境准备

在这里插入图片描述
Jdk 1.7
Eclipse
Spring 版本3.2
将spring3.2的所有jar包全部加进去
在这里插入图片描述

2.2 需求

以案例作为驱动
SpringMvc个myatis使用一个案例*(商品订单管理)
功能需求:商品的列表查询

2.3 配置前端控制器

在web.xml中配置

1.<!-- 配置前端控制器 -->
      <servlet>
         <servlet-name>springmvc</servlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

          <init-param>
    <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射 器  适配器等等) 
          如果不配置contextConfigLocation默认加载的是web-inf/springmvc-servlet.xml   
          -->
          <param-name>contextConfigLoaction</param-name>
          <param-value>classpath:springmvc.xml</param-value>
          </init-param>
      </servlet>

      <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      
       <!-- 三种配置方式
                 第一种:*.action访问 .action结尾由DisptcherServlet进行解析
                 第二种:/.所有的访问地址解析由DisptcherServlet进行解析
                  对于静态文件的解析需要配置不让DisptcherServlet进行解析
          此种方法可以实现RESTFULL风格的url
          第三种:/*这样配置不对,使用此种配置,最终要转发一个jsp页面时仍然会有DisptcherServlet解析jsp地址,
          不能根据jsp页面找到handler,会报错
       -->
       <url-pattern>*.action</url-pattern>
      </servlet-mapping>

在这里插入图片描述

2.4 配置处理器适配器

在clsspath:下面的配置文件加载路径中的文件中配置
在这里插入图片描述
在这里插入图片描述
此适配器能执行实现 Controller接口的Handler。
在这里插入图片描述

2.5 开发handler

需要实现 controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter适配器执行。
在这里插入图片描述

2.6 视图编写

在这里插入图片描述

2.7 配置handler

在这里插入图片描述

2.8 配置处理器映射器

在classpath下的springmvc.xml中配置处理器映射器
在这里插入图片描述
在这里插入图片描述

2.9 配置视图解析器

在这里插入图片描述

2.10 调试部署

访问地址:http://localhost:8080/springmvcfirst1208/queryItems.action
处理器映射器根据url找不到Handler,报下边的错误。说明url错误
在这里插入图片描述
处理器映射器根据url找到了Handler,转发的jsp页面找到,报下边的错误,说明jsp页面地址错误了
在这里插入图片描述

3 非注解的处理器映射器和适配器

3.1 非注解的处理器映射器

处理器映射器:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
另一个映射器:
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
在这里插入图片描述
多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。

3.2 非注解的处理器适配器

org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求编写的Handler实现 Controller接口。

org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求编写的Handler实现 HttpRequestHandler接口。
在这里插入图片描述
在这里插入图片描述

3.3 DispatcherSerlvet.properties

前端控制器从上边的文件中加载处理映射器、适配器、视图解析器等组件,如果不在springmvc.xml中配置,使用默认加载的。
在这里插入图片描述

4 注解的处理器映射器和适配器

  • 在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。
  • 在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。
  • 在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器
  • 在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。

4.1 配置注解映射器和适配器。

在这里插入图片描述

<!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置
   mvc:annotation-driven默认加载很多的参数绑定方法,
   比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
   实际开发时使用mvc:annotation-driven
    -->
   <!-- <mvc:annotation-driven></mvc:annotation-driven> -->

4.2 开发注解Handler

注解的映射器和适配器必须成对使用
在这里插入图片描述
在这里插入图片描述

4.3 在spring容器中加载handler

通过前端控制器源码分析springmvc的执行过程。

第一步:前端控制器接收请求

调用doDiapatch
在这里插入图片描述
第二步:前端控制器调用处理器映射器查找 Handler
在这里插入图片描述
在这里插入图片描述
第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView
在这里插入图片描述
第四步:视图渲染,将model数据填充到request域。

视图解析,得到view:
在这里插入图片描述
调用view的渲染方法,将model数据填充到request域

渲染方法:
在这里插入图片描述
在这里插入图片描述

5 入门程序小结

通过入门程序理解springmvc前端控制器 处理器映射器和处理器适配器 前端控制器
处理器映射器:
非注解处理器映射器(了解)
注解的处理器映射器(掌握)
对标记@controller类中标识有@requestMapping的方法进行映射,在@Requestmpping里面定义映射器的url 使用注解的映射器不用再xml中配置url和handler的映射关系
处理器适配器:
非注解处理器适配器(了解)
直接的处理器适配器(掌握)
注解处理器适配器和注解的处理器映射器是配对使用
视图解析器:
在这里插入图片描述
这样配置视图解析器 不用写前缀和后缀

6 SpringMvc和Mybatis整合

6.1 需求:

使用springmvc和mybatis完成商品列表的查询

6.2 整合的思路

整个springMvc+mybatis的系统的架构
整合持久层 dao

  • Mybatis和spring整合
    ------------------- 表现成 springmvc
    ------------------- 业务层 (service接口)
    ------------------- 持久层 mybatis
    ------------------- Mysql
    -------------------Spring将各层进行整合
  • 通过spring :管理持久层的mapper(相当于dao接口)
    Spring将持久层进行整合
    通过spring管理业务层service service中可以调用mapper接口
    Spring:
    通过spring管理表现层handler handler中可以调用service接口
    Mapper service handler 都是javabean
    • 第一步:整合dao层
      spring和mybatis整合,通过spring管理mapper接口
      使用mapper的扫描器自动扫描mapper接口在spring中进行注册
    • 第二步:通过service层
      通过spring管理 service接口
      使用配置方式将service接口配置在spring配置文件
      实现事务控制
    • 第三步::整合springmvc
      由于springmvc是spring的模块,不需要整合

6.3 准备环境:

Mybaits的表
Java环境
Jdk1.8
Tomcat8
Spring4.0
Jar:
数据库驱动包
Mybatis的jar
Mybatis和spring的整合包
Log4j包
数据库连接池包 dbcp
Spring4.0的所有jar包
Jstl jar

6.3.1 sqlMapConfig.xml

Mybatis的配置文件
在这里插入图片描述

6.3.2 applicationContext-dao.xml

配置spring和mybatis整合的一些东西
配置数据源
Sqlsessionfactory
Mapper扫描器
在这里插入图片描述

6.3.3 逆向工程生成po类和mapper(单表的增删改查)

在这里插入图片描述
注意工程目录必须逆向工程的配置文件放到主目录下

6.3.4 编写自定义的mapper和java接口

6.3.4.1 ItemsMapperCustom.xml

Sql语句:
Select *from items where items.name like ‘%傻子%’
在这里插入图片描述

6.3.4.2 ItemsMapperCustom.java

在这里插入图片描述

6.4 整合service

6.4.1 定义service接口

在这里插入图片描述

6.4.2 在spring容器配置service(applicationContext-service.xml)

在这里插入图片描述

6.4.3 事务控制(applicationContext-transation.xml)

在这里插入图片描述

6.5 整合springmvc

6.5.1 Spring mvc.xml

在这里插入图片描述

6.5.2 配置前端控制器

在这里插入图片描述

6.5.3 编写controller

在这里插入图片描述

6.5.4 编写jsp

在这里插入图片描述

6.6 加载spring容器

将mapper service conteroller 加载到spring容器
在这里插入图片描述
建议使用通配符的方法加载
在这里插入图片描述

6.7 测试:

注意jar包和路径的正误
在这里插入图片描述

7 商品修改功能开发

7.1 需求

操作流程:
1、进入商品查询列表页面
2、点击修改,进入商品修改页面,页面中显示了要修改的商品(从数据库查询)
要修改的商品从数据库查询,根据商品id(主键)查询商品信息

3、在商品修改页面,修改商品信息,修改后,点击提交

7.2 开发mapper

mapper:
根据id查询商品信息
根据id更新Items表的数据
不用开发了,使用逆向工程生成的代码。

7.3 开发service

接口功能:
根据id查询商品信息
修改商品信息
在这里插入图片描述
在这里插入图片描述

7.4 开发controller

方法:
商品信息修改页面显示
商品信息修改提交
在这里插入图片描述
在这里插入图片描述

8 RequestMapping

定义controller方法对应的url进行处理器映射使用

8.1 窄化请求映射

在这里插入图片描述

8.2 限制http请求方法

如果规定使用post访问则get不可访问
在这里插入图片描述

9 Controller方法的返回值

9.1 返回modelandview

需要将在方法结束时定义modelAndView将model和view分别设置

9.2 返回string

9.2.1 表示返回逻辑视图名

如果controller方法返回string 表示返回逻辑视图名
真正的视图(jsp路径)=前缀+逻辑视图名+后缀
在这里插入图片描述

9.2.2 Redirect 重定向

需求:商品修改提交后,重定向到商品查询列表
Redirect重定向特点,浏览器地址栏中的url会变化,修改提交的request数据无法传到重定向的地址,因为重定向后重新进行request(request无法共享)
在这里插入图片描述

9.2.3 Forward 页面转发

通过forward进行页面转发,浏览器地址栏url不变 request可以共享

9.3 返回void

在这里插入图片描述

10 参数绑定

10.1 Spring参数绑定

从客户请求key/value数据,经过参数绑定,将key/value数据绑定到controller
方法的形参上
在springmvc中,接受页面提交的数据是通过方法的形参来接收,而不是在controller类定义成员变更接收!!!
在这里插入图片描述

10.2 默认支持的类型

直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。

10.2.1 HttpServletRequest

通过request对象获取请求信息

10.2.2 HttpServletResponse

通过response处理响应信息

10.2.3 HttpSession

通过session对象得到session中存放的对象

10.2.4 Model/ModelMap

model是一个接口,modelMap是一个接口实现 。
作用:将model数据填充到request域。

10.3 简单类型

通过@RequestParam对简单类型的参数进行绑定。
如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。

如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。

通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数,报下边错误:
在这里插入图片描述
在这里插入图片描述
参考教案 对其它简单类型绑定进行测试。

10.4 pojo绑定

页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo。
页面定义:
在这里插入图片描述
controller的pojo形参的定义:
在这里插入图片描述

10.5 自定义参数绑定实现日期类型绑定

对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。
将请求日期数据串传成 日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。
在这里插入图片描述

所以自定义参数绑定将日期串转成java.util.Date类型。

需要向处理器适配器中注入自定义的参数绑定组件。

10.6 自定义日期类型绑定

在这里插入图片描述

10.7 配置方式

在这里插入图片描述
在这里插入图片描述

11 springmvc和struts2的区别

1、springmvc基于方法开发的,struts2基于类开发的。

springmvc将url和controller方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method。
方法执行结束,形参数据销毁。
springmvc的controller开发类似service开发。

2、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。

3、经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl。

11.1 问题

11.2 post乱码

在web.xml添加post乱码filter

在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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

以上可以解决post请求乱码问题。
对于get请求中文参数出现乱码解决方法有两个:
修改tomcat配置文件添加编码与工程编码一致,如下:

<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

另外一种方法对参数进行重新编码:

String userName new 
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

防止往数据库提交数据编码错误(很重要)
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8

12 总结:

springmvc框架:
DispatcherServlet前端控制器:接收request,进行response
HandlerMapping处理器映射器:根据url查找Handler。(可以通过xml配置方式,注解方式)
HandlerAdapter处理器适配器:根据特定规则去执行Handler,编写Handler时需要按照HandlerAdapter的要求去编写。
Handler处理器(后端控制器):需要程序员去编写,常用注解开发方式。
Handler处理器执行后结果 是ModelAndView,具体开发时Handler返回方法值类型包括 :ModelAndView、String(逻辑视图名)、void(通过在Handler形参中添加request和response,类似原始 servlet开发方式,注意:可以通过指定response响应的结果类型实现json数据输出)
View resolver视图解析器:根据逻辑视图名生成真正的视图(在springmvc中使用View对象表示)
View视图:jsp页面,仅是数据展示,没有业务逻辑。

注解开发:
使用注解方式的处理器映射器和适配器:

	<!--注解映射器 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--注解适配器 -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

在实际开发,使用mvc:annotation-driven代替上边处理器映射器和适配器配置。
@controller注解必须要加,作用标识类是一个Handler处理器。
@requestMapping注解必须要加,作用:
1、对url和Handler的方法进行映射。
2、可以窄化请求映射,设置Handler的根路径,url就是根路径+子路径请求方式
3、可以限制http请求的方法
映射成功后,springmvc框架生成一个Handler对象,对象中只包括 一个映射成功的method。

注解开发中参数绑定:
将request请求过来的key/value的数据(理解一个串),通过转换(参数绑定的一部分),将key/value串转成形参,将转换后的结果传给形参(整个参数绑定过程)。
springmvc所支持参数绑定:
1、默认支持很多类型,HttpServletRequest、response、session、
model/modelMap(将模型数据填充到request域)
2、支持简单数据类型,整型、字符串、日期。。
只要保证request请求的参数名和形参名称一致,自动绑定成功
如果request请求的参数名和形参名称不一致,可以使用@RequestParam(指定request请求的参数名),@RequestParam加在形参的前边。
3、支持pojo类型
只要保证request请求的参数名称和pojo中的属性名一致,自动将request请求的参数设置到pojo的属性中。
注意:形参中即有pojo类型又有简单类型,参数绑定互不影响。
自定义参数绑定:
日期类型绑定自定义:
定义的Converter<源类型,目标类型>接口实现类,比如:
Converter<String,Date>表示:将请求的日期数据串转成java中的日期类型。
注意:要转换的目标类型一定和接收的pojo中的属性类型一致。
将定义的Converter实现类注入到处理器适配器中。

<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>
<!-- conversionService -->
	<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<!-- 转换器 -->
		<property name="converters">
			<list>
				<bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
			</list>
		</property>
	</bean>

springmvc和struts2区别:
springmvc面向方法开发的(更接近service接口的开发方式),struts2面向类开发。
springmvc可以单例开发,struts2只能是多例开发。

二 高级应用

1 课程安排

  • 上午:
    在商品查询和商品修改功能案例驱动下进行学习:
    包装类型pojo参数绑定(掌握)。
    集合类型的参数绑定:数组、list、map…
    商品修改添加校验,学习springmvc提供校验validation(使用的是hibernate校验框架)
    数据回显
    统一异常处理(掌握)

  • 下午:
    上传图片
    json数据交互
    RESTful支持
    拦截器

2 包装类型pojo参数绑定

2.1 需求

商品查询controller方法中实现商品查询条件传入

2.2 实现方法

第一种方法,在形参中添加HttpServletRequest request参数 通过request接受查询条件参数
第二种方法:
分析:
页面传参的特点,复杂 多样性 。条件包括用户的账号 订单编号等信息
如果将用户账号 商品编号 订单信息等放在简单的pojo(属性是简单类型)中 ,pojo属性较多,比较乱 建议使用包装类型的pojo pojo的属性有pojo

2.3 页面的参数和controller方法形参定义

页面参数:
在这里插入图片描述
itemsCustom.name是一个类的属性 必须和pojo的属性一致
conteoller方法的形参
public ModelAndView querItems(ItemsQueryVo itemsQueryVo) throws Exception {
在这里插入图片描述
实现的时候尽量不要用继承
直接写里面用属性来操作

3 集合类型

3.1 数组的绑定

3.1.1需求

用户在页面选择多个商品选择删除 批量删除

3.1.2表现层实现

关键:将页面选择(多选)的商品id 传到contriller方法的形参,方法形参使用数组接收页面的请求的多个商品的id
页面的定义:
在这里插入图片描述
------------------------------------------------在这里插入图片描述
Controller方法的定义:
在这里插入图片描述

3.2 List绑定:

3.2.1 需求

通常在需要批量提交数据时,将提交的数据绑定到list中,比如:成绩录入(录入多门课成绩,批量提交),
本例子需求:批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中。

3.2.2表现层实现

controller方法定义:
1、进入批量商品修改页面(页面样式参考商品列表实现)
1.1.1 2、批量修改商品提交
使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list属性
在这里插入图片描述

3.3 map绑定

也通过在包装pojo中定义map类型属性。

在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收。
包装类中定义Map对象如下:

Public class QueryVo {
private Map<String, Object> itemInfo = new HashMap<String, Object>();
  //get/set方法..
}

页面定义如下

<tr>
<td>学生信息:</td>
<td>
姓名:<inputtype="text"name="itemInfo['name']"/>
年龄:<inputtype="text"name="itemInfo['price']"/>
.. .. ..
</td>
</tr>

Contrller方法定义如下:

public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{
System.out.println(queryVo.getStudentinfo());
}

4 SpringMVC的校验

项目中,通常使用较多时前端校验,比如页面中js校验,对于安全要求较高点建议是在服务层进行校验,
服务段校验
控制层controller,校验页面请求的参数的合法性,在服务端控制controller校验,不区分客户端类型(浏览器 手机客户端 远程调用)
业务层校验service(使用较多),只要校验关键业务参数,仅限于service接口中使用的参数
持久层dao一般是不校验的

4.1 Springmvc校验

Springmvc使用hibernate的校验框架validation(和hibermate没有关系)
校验思路:
页面提交请求的参数,请求到controller方法中,使用validation进行校验,如果校验出错,将错误信息展示到页面‘
具体需求:
商品修改,添加校验 (校验商品名称长度 生产日期的非空校验)如果校验出错,在商品的修改页面显示错误信息

4.2 环境准备:

Hibernate的校验框架的validation所需的jar包
在这里插入图片描述

4.3 配置校验器

在这里插入图片描述
结果:
在这里插入图片描述

4.4 校验器注入到处理器适配器中

在这里插入图片描述

4.5 在页面显示错误信息

在controller中将错误信息传递给页面即可
在这里插入图片描述

<!-- 显示错误信息 -->
<c:if test="${allErrors!=null}">
<c:forEach items="${allErrors}" var="error">
  ${error.defaultMessage}
</c:forEach>
</c:if>

5 分组校验:

5.1 需求:

在pojo中定义分组校验规则,而多个pojo是被多个controller所共有,当不同的controller方法对同一个ppojo进行校验,但是每个contorller方法需要不同的校验
解决方法:
定义多个校验分组(其实是一个java接口)
每个conroller方法使用不同的校验分组

5.2 校验分组:

在这里插入图片描述
在这里插入图片描述
5.3 po类和controller
Po:
在这里插入图片描述
Controller:
在这里插入图片描述

5.4 pojo回显

数据回显:将出错的信息冲洗填回相应的位置

  1. Springmvc默认对pojo数据进行回显
    Pojo数据传入controller方法后,spring自动会将pojo数据放到request域,key等于pojo类型(首字母小写)
    使用一个注解

  2. //@ModelAttribute(“items”)可以指定pojo回显request中的key
    界面那边必须用items接收才会出现回显 可以定义key不同于pojo名

    在这里插入图片描述

  3. @ModelAttribute 他可以给页面发送方法的返回值
    在商品查询列表页面,通过商品类型查询商品信息。
    在controller中定义商品类型查询方法,最终将商品类型传到页面。

在这里插入图片描述
页面上可以得到itemTypes数据。
在这里插入图片描述
4. 使用最简单方法使用model,可以不用@ModelAttribute
在这里插入图片描述
5. 简单类型的数据回回显 就用model
model.addAttribute(“id”, id);

6 异常处理器

6.1 异常处理思路

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

6.2 自定义异常类

在这里插入图片描述

6.3 全局异常处理器

思路:
系统遇到异常,在程序中手动抛出,dao抛给service service抛给controller
Controller抛给前端控制器 前端端控制器调用全局异常处理器
全局异常处理器处理思路:
解析异常类新
如果该 一会吃那个烈性是系统自定义的异常,直接取出异常信息,在错误信息显示
如果该 异常类型不是系统 自定义的异常构造自定义异常类型(信息为“未知错误”)
Springmvc提供了一个接口HandlerExceptionResolver接口
在这里插入图片描述
6.4 错误页面
在这里插入图片描述

6.5 在springmvc.xml配置全局异常处理器

在这里插入图片描述

6.6 异常测试

在controller、service、dao中任意一处需要手动抛出异常。
如果是程序中手动抛出的异常,在错误页面中显示自定义的异常信息,如果不是手动抛出异常说明是一个运行时异常,在错误页面只显示“未知错误”。

如果与业务功能相关的异常,建议在service中抛出异常。
与业务功能没有关系的异常,建议在controller中抛出。
在商品修改的controller方法中抛出异常 .
在这里插入图片描述

7 上传图片

7.1 需求

在修改商品的页面 添加上传商品图片功能

7.2 SpringMvc中对多部件类型解析

在 页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型的数据进行解析。

在springmvc.xml中配置multipart类型解析器。

	<!-- 文件上传 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设置上传文件的最大尺寸为5MB -->
		<property name="maxUploadSize">
			<value>5242880</value>
		</property>
	</bean>

7.3 Jsp页面

在这里插入图片描述

7.4 Springmvc.xml

在这里插入图片描述

7.5 创建图片的虚拟目录存放图片

在这里插入图片描述
在这里插入图片描述
注意:在图片虚拟目录 中,一定将图片目录分级创建(提高i/o性能),一般我们采用按日期(年、月、日)进行分级创建。

7.6 上传图片代码

7.6.1 页面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8 Json数据交互

8.1 为什么要进行json数据交互

Json数据格式在接口调用,html页面中较常用 json格式较简单 解析也比较方便
比如:webservice 接口 传输json数据

8.2 Springmvc进行json交互

在这里插入图片描述
1、请求json、输出json,要求请求的是json串,所以在前端页面中需要将请求的内容转成json,不太方便。

2、请求key/value、输出json。此方法比较常用。

8.3 环境准备

8.3.1 加入jar包

Springmvc使用jackson包进行转换 @requestbody @responseBody
Jackson的包

在这里插入图片描述

8.3.2 加入json数据转换器

mvc:annotation-driven/用这个就不用配了

8.3.3 输入json串 输出json串

使用jquery的ajax提交json串,对输出的json结果进行解析
//@ResponseBody将其他类型转换为json @RequestBody将json转换为其它数据类型
Jsp页面
在这里插入图片描述
Controller方法
在这里插入图片描述
在这里插入图片描述
输入key/value输出json串

8.3.4. jsp页面

使用jquery的ajax提交key/value串,对输出的json结果进行解析。
在这里插入图片描述

8.3.5 controller

在这里插入图片描述

8.3.6 测试

在这里插入图片描述

9 RESTful支持

1.1 什么是RESTful

RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

RESTful(即Representational State Transfer的缩写)其实是一个开发理念,是对http的很好的诠释。

1、对url进行规范,写RESTful格式的url

非REST的url:http://…/queryItems.action?id=001&type=T01
REST的url风格:http://…/items/001
特点:url简洁,将参数通过url传到服务端
2、http的方法规范
不管是删除、添加、更新。。使用url是一致的,如果进行删除,需要设置http的方法为delete,同理添加。。。

后台controller方法:判断http方法,如果是delete执行删除,如果是post执行添加。

3、对http的contentType规范
请求时指定contentType,要json数据,设置成json格式的type。。

1.2 REST的例子

1.2.1 需求

查询商品信息,返回json数据。

1.2.2 controller

定义方法,进行url映射使用REST风格的url,将查询商品信息的id传入controller .

输出json使用@ResponseBody将java对象输出json。
在这里插入图片描述

@RequestMapping(value="/ itemsView/{id}"){×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用@PathVariable获取{×××}中的×××变量。
@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。
如果RequestMapping中表示为"/ itemsView /{id}",id和形参名称一致,@PathVariable不用指定名称。

1.2.3 REST方法的前端控制器配置

在web.xml配置:
在这里插入图片描述

1.3 对静态资源的解析

配置前端控制器的url-parttern中指定/,对静态资源的解析出现问题:
在这里插入图片描述
在springmvc.xml中添加静态资源解析方法。

在这里插入图片描述

2 拦截器

2.1 拦截定义

定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法

public class HandlerInterceptor1 implements HandlerInterceptor {

	
	//进入 Handler方法之前执行
	//用于身份认证、身份授权
	//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		
		//return false表示拦截,不向下执行
		//return true表示放行
		return false;
	}

	//进入Handler方法之后,返回modelAndView之前执行
	//应用场景从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
		
	}

	//执行Handler完成执行此方法
	//应用场景:统一异常处理,统一日志处理
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		
		
	}

}

2.2 拦截器配置

2.2.1 针对HandlerMapping配置

springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该 拦截器。

<bean
	class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
	<property name="interceptors">
		<list>
			<ref bean="handlerInterceptor1"/>
			<ref bean="handlerInterceptor2"/>
		</list>
	</property>
</bean>
	<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
	<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>

一般不推荐使用。

2.2.2 类似全局的拦截器

springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中。
在这里插入图片描述

2.3 拦截测试

2.3.1 测试需求

测试多个拦截器各各方法执行时机。

2.3.2 编写两个拦截

在这里插入图片描述

2.3.3 两个拦截器都放行

HandlerInterceptor1…preHandle
HandlerInterceptor2…preHandle

HandlerInterceptor2…postHandle
HandlerInterceptor1…postHandle

HandlerInterceptor2…afterCompletion
HandlerInterceptor1…afterCompletion

总结:
preHandle方法按顺序执行,
postHandle和afterCompletion按拦截器配置的逆向顺序执行。

2.3.4 拦截器1放行,拦截器2不放行

HandlerInterceptor1…preHandle
HandlerInterceptor2…preHandle
HandlerInterceptor1…afterCompletion

总结:
拦截器1放行,拦截器2 preHandle才会执行。
拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。
只要有一个拦截器不放行,postHandle不会执行。

2.3.1 拦截器1不放行,拦截器2不放行

HandlerInterceptor1…preHandle

拦截器1 preHandle不放行,postHandle和afterCompletion不会执行。
拦截器1 preHandle不放行,拦截器2不执行。

2.3.2 小结

根据测试结果,对拦截器应用。

比如:统一日志处理拦截器,需要该 拦截器preHandle一定要放行,且将它放在拦截器链接中第一个位置。

比如:登陆认证拦截器,放在拦截器链接中第一个位置。权限校验拦截器,放在登陆认证拦截器之后。(因为登陆通过后才校验权限)

2.4 拦截器应用(实现登陆认证)

2.4.1 需求

1、用户请求url
2、拦截器进行拦截校验
如果请求的url是公开地址(无需登陆即可访问的url),让放行
如果用户session 不存在跳转到登陆页面
如果用户session存在放行,继续操作。

2.4.2 登陆controller方法

@Controller
public class LoginController {

	// 登陆
	@RequestMapping("/login")
	public String login(HttpSession session, String username, String password)
			throws Exception {

		// 调用service进行用户身份验证
		// ...

		// 在session中保存用户身份信息
		session.setAttribute("username", username);
		// 重定向到商品列表页面
		return "redirect:/items/queryItems.action";
	}

	// 退出
	@RequestMapping("/logout")
	public String logout(HttpSession session) throws Exception {

		// 清除session
		session.invalidate();

		// 重定向到商品列表页面
		return "redirect:/items/queryItems.action";
	}

}

2.4.3 登陆认证拦截实现

2.4.3.1 代码实现
public class LoginInterceptor implements HandlerInterceptor {

	
	//进入 Handler方法之前执行
	//用于身份认证、身份授权
	//比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		
		//获取请求的url
		String url = request.getRequestURI();
		//判断url是否是公开 地址(实际使用时将公开 地址配置配置文件中)
		//这里公开地址是登陆提交的地址
		if(url.indexOf("login.action")>=0){
			//如果进行登陆提交,放行
			return true;
		}
		
		//判断session
		HttpSession session  = request.getSession();
		//从session中取出用户身份信息
		String username = (String) session.getAttribute("username");
		
		if(username != null){
			//身份存在,放行
			return true;
		}
		
		//执行这里表示用户身份需要认证,跳转登陆页面
		request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
		
		//return false表示拦截,不向下执行
		//return true表示放行
		return false;
	}
2.4.3.2 拦截器配置

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值