目录
在public后面的requestBody是用于返回json数据
前言
struts2的基础详解 https://blog.csdn.net/yzj17025693/article/details/88624294
spring mvc的简单使用
配置前端控制器
/* 拦截所有的jsp,js,css,图片
*.action 拦截以action结尾的请求
/ 拦截所有但不包括jsp,也就是说jsp不能直接跳转jsp,对静态资源也会放行
初始化配置文件路径
扫描注解
spring mvc的约束文件和spring的是一样的
配置action注解
如果知道struts2的就知道,如果页面发送了itemlist.action请求
就会访问此方法,setViewName就是指定跳转到什么页面(默认是使用转发)
返回值
第1种,就是返回ModelAndView
第2种,返回String
可以由model来带数据,虽然第一种方便,但是不利于解耦,因为数据和视图是一起的,第二种和以前Struts2的差不多,数据和视图是分开的
这里直接返回itemList,其实是一个页面跳转,只不过省去了前缀和后缀(具体看下面)
model存的数据是request域的数据
2种方式跳转
一个是重定向,一个是转发
第3种使用void
是为了迎合ajax请求
spring mvc架构说明
自我理解
1 用户发送的请求被我们在web.xml配置的前端控制器拦截
2 前端控制器收到请求后,调用HandlerMapping用来处理 映射器
3 而映射器的作用就是根据请求的url找到具体的处理器,处理器就是处理对应功能的,有很多的功能,所以有一个处理链
然后发送回前端控制器
4 由前端控制器请求处理器的适配器
5 处理器的适配器如果感觉可以执行这个功能,那么就交给处理器执行
6 处理器执行完后返回数据给处理器适配器
7 适配器感觉这个处理没问题,又把处理结果返回给前端控制器
8 前端控制器不做事情的,就是一个中转的,他继续把处理结果给视图解析器
9 视图解析器把东西封装成view对象发送回前端控制器
10 前端控制器把东西交给页面渲染
3大组件
黄色的是3大组件,没有颜色的是核心组件,绿色的是我们要写的
3大主键还有一个视图解析器
配置3大组件
如何找到3大组件
本地语言校验
输入法校验
比如一些全角半角什么的
映射处理器handlerMapping
第1个是配置式开发,也就是使用xml方式开发的时候,默认走这个映射器
第2个是注解式开发,如果我们写的处理器上面有注解,那默认走的就是第2个映射器
适配器
默认是第3个,使用注解开发的时候的适配器,
视图解析器
默认的jsp视图解析器
配置最新的组件
上面默认的映射处理器已经过期了,所以我们要配置最新的
在springmvc配置文件里配置
默认的适配器也过期了,也需要配置
注解驱动直接配置最新3大组件
可以使用注解驱动来替代上面的配置,只需要写上一句即可
视图解析器的功能配置
修改前缀,后缀
是每次跳转页面,都要写xxx/jsp/这些前缀,哪天改了目录结构就完完了
在视图解析器里先配置好前缀和后缀
参数绑定
假如我们发送的请求带有参数,那么就需要处理参数
原始获取参数的形式
直接写上request和response还有session
使用addObject可以把对象传递到页面去,然后用el表达式取出来,这个后面会讲
简单参数绑定
直接在参数上写上id即可(最好是用封装类Integer)
传入过来的参数名称和我们的形参的名称要对应
参数名不同
传入过来的参数名称和我们的形参的名称如果非要不同,也可以使用注解方式来解决
但是传过来的值不能为空,不然报错,但是可以加上required=false解决
还可以设置,如果传过来的值为空,则默认值为1
绑射对象类型
这里我们直接写Items类型,所以我们提交过来的name要和Items里面的字段名称一样
传递参数的乱码问题
下面的param-name的encoding,是CharacterEncodingFilter类里的成员变量
<!--解决控制器乱码问题-->
<filter>
<filter-name>encoding</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>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
绑定包装类对象类型(QueryVo)
对应的页面参数肯定也需要改
处理日期参数
类型转换器
上传上来的日期不能直接封装到对象中
需要调整适配器从而能直接把数据封装到对对象中
注解驱动里加上转换器服务
然后自定义转化器
转化器需要使用Converter接口
注解方式
属性编辑器方式
属性编辑器方式转换类型这里不做介绍,可以直接百度
数组类型参数绑定
包装类来接收数组
使用包装类来接收数组,jsp页面不需要修改,也可以接收到,因为是不在乎包装类的
在意的是包装类里的属性,我们包装类里面有Integer[] ids
List类型参数绑定
在包装类里写上list集合,不能在形参上写List集合,springmvc不认识,数组是原生态的,以及pojo都认识
但是List<xxx>不认识
在jsp页面修改,使用EL表达式代替索引
异常处理器
编写处理异常类
这个类需要实现异常处理器接口HandlerExceptionResolver
setViewName是设置一个返回值,会跳转到对应的jsp页面,这里会跳转到error.jsp里,因为我们设置了前缀和后缀,所以这里直接写error
但是我们必须有一个error.jsp的页面在对应的目录下
使用EL表达式直接取出来即可
在springmvc里注册异常处理器
自定义异常
先写一个异常类基础Exception
抛一个异常测试
在异常处理器里补充
注意e instanceof MessageException, 因为MessageException继承了Exception
https://www.cnblogs.com/zjxynq/p/5882756.html
https://www.cnblogs.com/greatfish/p/6096038.html
所以相当于所有的异常都能通过if,因为自身类初创建的对象 instanceof 自身类也是true
springmvc和struts2的区别
spring mvc上传图片
之前实现过struts2上传文件,而struts2其实只负责接收文件的路径
配置tomcat文件路径
之所以在这里配置,是因为不能在项目里放,因为项目无时无刻会重新部署,之前的图片就没了
这样开启tomcat,直接访问浏览器,加上/pic/能访问本地的图片
在方法上加上MultipartFile就能接受到字节流
这是一个接口,且需要配置一个实现类
在springmvc里创建,这个id不能变,是固定的,因为上面的接口是要用的
保存图片
UUID生成的格式是xxx-xxx-xxx-xxx,所以我们把它转换一下
后面可能还需要分多级目录
transferTo是保存文件的意思
json数据交互(注解方式)
使用post和ajax是一样的,但是使用ajax发送json数据需要声明一下json
在public后面的requestBody是用于返回json数据
而形参上面的requestBody是用于接收json数据自动封装到对象里
spring mvc不需要我们自己转json然后传给客户端,只需要把返回值改成对象(对象里有对应的字段),然后加上
requestBody,这样返回回去的便是json数据
随意请求链接
RestFul风格开发
老外使用post就是添加,put是修改
假如我们请求路径是这个奇形怪样的,使用商品的id.action,直接把id作为action的名称
只需要从路径里获取对应的变量id即可
然后在参数前面加上PathVariable注解
拦截器
拦截器可以有多个
在spring mvc里配置
path= /** 是代表拦截所有的请求,写**是因为可能有多级目录
写一个自定义的类
方法前有一个开关,就是return 如果返回false,那就是不放行,下面的方法不会执行
如果我们真的写了2个拦截器,那么拦截流程如下
解决登录问题
如果不包含login,那就判断是否登录了,如果没有,那就跳转到登录页面,也不放行
如果包含login那肯定要放行
spring mvc注解开发
上面介绍了
requesMapping 用于映射url链接
还可以在需要映射的url写上写表达式,达到随意请求链接的要求
指定接收的方式
RequestMethod.post,那么就不支持get方法,不推荐设置,如果非要设置,就把get和post一起包含进来
在类的上面注解上前缀
可以在类的上面写上前缀,用于分类,比如这是用户操作,另一个类是订单操作
value是一个数组,可以写多个
requesParam
可以指定传递过来的参数是什么名字,用于页面参数名和形参不匹配的情况
pathVariable
用于获取路径上的的变量
responseBody
把要输出的内容转换成json
requestBody
把接受的参数转换成json
cookievalue
获取cookie的值,传入key即可
modelAttriabute
一旦修饰在方法上,执行了请求后就会先执行这个方法
按照上面的应用场景,那就是数据在封装前,我们在这个方法里先封装好指定的数据
modelAttriabute例子
表单里并没有日期数据
当我们把user返回会就会执行我们指定的testModelAttribute方法
还可以先把数据放到map中
sessionAttributes
把一个数据存到reques域中,但是如果我们想把这个数据同时存在session中
可以在类上面加上sessionAttribute注解
取的时候用modelMap,model只能存数据