# 前言 本文主要是讲解在Controller中的开发,主要的知识点有如下: # SpringMVC过滤编码器 在SpringMVC的控制器中,如果没有对编码进行任何的操作,那么获取到的中文数据是乱码! 即使我们在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对象** # 总结