zhihu_spider/SpringMVC【开发Controller】详解.md

185 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 前言
本文主要是讲解在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这个参数以外如果有需要我们还可以写requestresponse等传统Servlet的参数。这是一样可以使用的….
但是呢, **我们并不建议使用传统的web参数因为会耦合**
小细节:如果我们的返回值是返回一个真实路径,而我们在程序中又使用了转发或重定向。。。 **那么具体跳转的位置就是按我们程序中跳转的路径为准**
# 业务方法收集参数
我们在Struts2中收集web端带过来的参数是在控制器中定义成员变量该成员变量的名字与web端带过来的名称是要一致的…并且给出该成员变量的set方法那么Struts2的拦截器就会帮我们自动把web端带过来的参数赋值给我们的成员变量….
那么在SpringMVC中是怎么收集参数的呢我们SpringMVC是不可能跟Struts2一样定义成员变量的因为SpringMVC是单例的而Struts2是多例的。因此SpringMVC是这样干的
## 接收普通参数
如果是普通参数的话我们直接在方法上写上与web端带过来名称相同的参数就行了
效果:
## 接收JavaBean
我们处理表单的参数如果表单带过来的数据较多我们都是用JavaBean对其进行封装的。那么我们在SpringMVC也是可以这么做的。
**创建JavaBeanjavaBean属性与表单带过来的名称相同**
**在业务方法参数上写入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对象**
# 总结