185 lines
8.2 KiB
Markdown
185 lines
8.2 KiB
Markdown
|
# 前言
|
|||
|
|
|||
|
本文主要是讲解在Controller中的开发,主要的知识点有如下:
|
|||
|
|
|||
|
# SpringMVC过滤编码器
|
|||
|
|
|||
|
在SpringMVC的控制器中,如果没有对编码进行任何的操作,那么获取到的中文数据是乱码!
|
|||
|
|
|||
|
<img src="https://www.testingcloud.club/sapi/api/image_download/1da4788d-165c-11ef-b1d9-00163e13fc6a.webp" width="100%"/>
|
|||
|
|
|||
|
即使我们在handle()方法中,使用request对象设置编码也不行!原因也非常简单,我们 **SpringMVC接收参数是通过控制器中的无参构造方法,再经过handle()方法的object对象来得到具体的参数类型的** 。
|
|||
|
|
|||
|
Struts2是使用拦截器来自动帮我们完成中文乱码的问题的。那么SpringMVC作为一个更加强大的框架,肯定也有对应的方法来帮我们完成中文乱码问题!
|
|||
|
|
|||
|
值得注意的是: **该过滤编码器只能解决POST的乱码问题** !
|
|||
|
|
|||
|
我们只需要 **在web.xml配置文件中设置过滤编码器就行了** !
|
|||
|
|
|||
|
# 注解开发SpringMVC
|
|||
|
|
|||
|
我们在快速入门的例子中使用的是XML配置的方式来使用SpringMVC的, **SpringMVC也能够支持注解** 。【个人非常喜欢注解的方式】
|
|||
|
|
|||
|
我们在使用Action的时候,要么继承着AbstractCommandController类,要么显示使用注解Controller接口。 **当我们使用了注解以后就不用显示地继承或实现任何类了** !
|
|||
|
|
|||
|
## 开发流程
|
|||
|
|
|||
|
**使用@Controller这个注解,就表明这是一个SpringMVC的控制器!**
|
|||
|
|
|||
|
当然了,现在Spring是不知道有这么一个注解的,因此我们需要在配置文件中配置扫描注解
|
|||
|
|
|||
|
**值得注意的是:** 在配置扫描路径的时候,后面不要加.*
|
|||
|
|
|||
|
不然扫描不了,我不知道学Struts2还是其他的地方时候,习惯加了.*,于是就搞了很久!
|
|||
|
|
|||
|
在控制器中写业务方法
|
|||
|
|
|||
|
跳转到index页面,首页得到对应的值。
|
|||
|
|
|||
|
当然了, **基于注解和基于XML来开发SpringMVC,都是通过映射器、适配器和视图解析器的。 只是映射器、适配器略有不同。但是都是可以省略的!**
|
|||
|
|
|||
|
更新: **上边的适配器和映射器只是Spring3.1版本之前使用的、3.1版本之后现在一般用以下的两个**
|
|||
|
|
|||
|
当然了,**这上面两个配置也可以使用>替代注解处理器和适配器的配置。**
|
|||
|
|
|||
|
# RequestMapping
|
|||
|
|
|||
|
**@RequestMapping能够控制请求路径和请求方式!**
|
|||
|
|
|||
|
## 一个控制器写多个业务方法
|
|||
|
|
|||
|
到目前为止,我们都是一个控制器写一个业务方法,这肯定是不合理的。我们在Struts2中一个Action就对应多个业务方法了。那么我们在SpringMVC中又怎么写呢???
|
|||
|
|
|||
|
其实我们可以推理出来, **@RequestMapping就是用于配置哪个请求对应哪个业务方法的!**
|
|||
|
|
|||
|
当我们请求hello.action的时候,处理的业务方法是hello()…..当我们请求bye.action的时候,处理的业务方法是bye()
|
|||
|
|
|||
|
## 分模块开发
|
|||
|
|
|||
|
当然了,我们在Struts2常常使用namespace来进行分模块开发,在SpringMVC中我们也可以这样干,并且我们又是使用的是@RequestMapping这个注解!
|
|||
|
|
|||
|
只要把@RequestMapping这个注解 **写到类上面去** ,就代表了分模块。
|
|||
|
|
|||
|
那么我们想要HelloAction该控制器处理我们的请求,访问的地址要么是:,或者要么是
|
|||
|
|
|||
|
## 限定某个业务控制方法,只允许GET或POST请求方式访问
|
|||
|
|
|||
|
我们如果想要限定某个业务控制方法,只允许GET或POST请求方式访问。还是通过@RequestMapping来实现。 **只要设定它的method属性就行了** !
|
|||
|
|
|||
|
当我把业务方法的请求设置为POST以后,我想要通过GET方式来访问该业务方法。就行不通了!
|
|||
|
|
|||
|
# 业务方法写入传统web参数
|
|||
|
|
|||
|
我们的业务方法除了可以写Model这个参数以外,如果有需要我们还可以写request,response等传统Servlet的参数。这是一样可以使用的….
|
|||
|
|
|||
|
但是呢, **我们并不建议使用传统的web参数,因为会耦合**
|
|||
|
|
|||
|
小细节:如果我们的返回值是返回一个真实路径,而我们在程序中又使用了转发或重定向。。。 **那么具体跳转的位置就是按我们程序中跳转的路径为准** !
|
|||
|
|
|||
|
# 业务方法收集参数
|
|||
|
|
|||
|
我们在Struts2中收集web端带过来的参数是在控制器中定义成员变量,该成员变量的名字与web端带过来的名称是要一致的…并且,给出该成员变量的set方法,那么Struts2的拦截器就会帮我们自动把web端带过来的参数赋值给我们的成员变量….
|
|||
|
|
|||
|
那么在SpringMVC中是怎么收集参数的呢????我们SpringMVC是不可能跟Struts2一样定义成员变量的,因为SpringMVC是单例的,而Struts2是多例的。因此SpringMVC是这样干的:
|
|||
|
|
|||
|
## 接收普通参数
|
|||
|
|
|||
|
如果是普通参数的话,我们直接在方法上写上与web端带过来名称相同的参数就行了!
|
|||
|
|
|||
|
效果:
|
|||
|
|
|||
|
## 接收JavaBean
|
|||
|
|
|||
|
我们处理表单的参数,如果表单带过来的数据较多,我们都是用JavaBean对其进行封装的。那么我们在SpringMVC也是可以这么做的。
|
|||
|
|
|||
|
**创建JavaBean,javaBean属性与表单带过来的名称相同**
|
|||
|
|
|||
|
**在业务方法参数上写入Javabean**
|
|||
|
|
|||
|
## 收集数组
|
|||
|
|
|||
|
收集数组和收集普通的参数是类似的,看了以下的代码就懂了。
|
|||
|
|
|||
|
业务方法获取参数
|
|||
|
|
|||
|
效果:
|
|||
|
|
|||
|
## 收集集合
|
|||
|
|
|||
|
我们**在Spring的业务方法中是不可以用List**,SpringMVC给了我们另一种方案!
|
|||
|
|
|||
|
我们 **使用一个JavaBean把集合封装起来,给出对应的set和get方法。那么我们在接收参数的时候,接收的是JavaBean**
|
|||
|
|
|||
|
**业务方法接收JavaBean对象**
|
|||
|
|
|||
|
在JSP页面直接写上empList[下表].
|
|||
|
|
|||
|
**其实这种方法看起来也没有那么难理解,我们就是向上封装了一层【与接收普通的JavaBean类似的】** 。
|
|||
|
|
|||
|
## 收集多个模型
|
|||
|
|
|||
|
我们有可能在JSP页面上即有User模型的数据要收集,又有Emp模型的数据要收集….并且User模型的属性和Emp模型的属性一模一样….此时我们该怎么办呢???
|
|||
|
|
|||
|
我们也是可以 **在User模型和Emp模型上向上抽象出一个Bean,该Bean有Emp和User对象**
|
|||
|
|
|||
|
在JSP页面收集的时候,给出对应的类型就行了。
|
|||
|
|
|||
|
# 字符串转日期类型
|
|||
|
|
|||
|
我们在Struts2中,如果web端传过来的字符串类型是yyyy-mm-dd hh:MM:ss这种类型的话,那么Struts2默认是可以自动解析成日期的,如果是别的字符串类型的话,Struts2是不能自动解析的。要么使用自定义转换器来解析,要么就自己使用Java程序来解析….
|
|||
|
|
|||
|
而在SpringMVC中,即使是yyyy-mm-dd hh:MM:ss这种类型SpringMVC也是不能自动帮我们解析的。我们看如下的例子:
|
|||
|
|
|||
|
JSP传递关于日期格式的字符串给控制器…
|
|||
|
|
|||
|
User对象定义Date成员变量接收
|
|||
|
|
|||
|
业务方法获取Date值
|
|||
|
|
|||
|
结果出问题了,SpringMVC不支持这种类型的参数:
|
|||
|
|
|||
|
现在问题就抛出来了,那我们要怎么解决呢????
|
|||
|
|
|||
|
SpringMVC给出类似于Struts2类型转换器这么一个方法给我们使用: **如果我们使用的是继承AbstractCommandController类来进行开发的话,我们就可以重写initBinder()方法了** ….
|
|||
|
|
|||
|
具体的实现是这样子的:
|
|||
|
|
|||
|
那我们现在用的是注解的方式来进行开发,是没有重写方法的。因此我们 **需要用到的是一个注解,表明我要重写该方法** !
|
|||
|
|
|||
|
再次访问:
|
|||
|
|
|||
|
值得注意的是: **如果我们使用的是Oracle插入时间的话,那么我们在SQL语句就要写TimeStrap时间戳插入进去,否则就行不通** !
|
|||
|
|
|||
|
# 结果重定向和转发
|
|||
|
|
|||
|
我们一般做开发的时候,经常编辑完数据就返回到显示列表中。我们在Struts2是使用配置文件进行重定向或转发的:
|
|||
|
|
|||
|
而我们的SpringMVC就非常简单了,只要在跳转前写上关键字就行了!
|
|||
|
|
|||
|
以此类推,如果是想要再次请求的话,那么我们只要写上对应的请求路径就行了!
|
|||
|
|
|||
|
# 返回JSON文本
|
|||
|
|
|||
|
回顾一下Struts2返回JSON文本是怎么操作的:
|
|||
|
|
|||
|
那么我们在SpringMVC又怎么操作呢???
|
|||
|
|
|||
|
导入两个JSON开发包
|
|||
|
|
|||
|
在要返回JSON的业务方法上给上注解:
|
|||
|
|
|||
|
配置JSON适配器
|
|||
|
|
|||
|
测试的JSP
|
|||
|
|
|||
|
测试:
|
|||
|
|
|||
|
Map测试:
|
|||
|
|
|||
|
更新------------------------------------------------------------------
|
|||
|
|
|||
|
如果**传递进来的数据就是JSON格式的话,我们我们需要使用到另外一个注解,将请求的json数据转成java对象**
|
|||
|
|
|||
|
# 总结
|
|||
|
|