1、配置dispatcherServlet
ModelAndView
servlet配置
默认命名为:(servlet-name)-servlet.xml
默认根据name属性,找到controller
也就相当于手动配置了
当配置其他的handleMapping时,会覆盖这个默认的BeanNameUrlHandlerMapping
当使用
项目名为springmvc-1
key为访问路径,尖括号之间的内容,为引用的controller的id
这样做,bean只管创建bean,不负责映射
此时,由于显示配置的生效
,默认的HandlerMapping还没有被覆盖
当不配置此HandlerMapping时
此时,
controller的首字母小写,但是当名字一样的时候,无法区分
控制器
参数控制器
相当于一个中转站,直接跳转到页面
object obj用于接收实体类的参数
也就是controller中obj
当访问时:
每次都创建出一个新对象
重写tostring方法,查看对象中的值
没有值,采用的是默认构造器
传参:
怎么赋值的呢?
通过反射,调用了该实体类的set方法
表单控制器:
formview,为表单页面,也就是传参页面,seccessview为成功后,返回的页面
自动匹配提交方法
页面中,定义使用post方式提交表单,如果直接访问bean的name路径,即用get方式:
跳转到定义的formview定义的页面中,也就是这里的表单页面
如果在表单页面,直接定义提交方式为get
又跳转到表单页面,提交不过去
自动匹配参数类型
id为int类型,当填入字符串时
跳转回此页面
对于日期的处理:
实体类新加属性:
如果填写:
如果:
失败返回
如果要自定义类型:
但是刚才使用“/”的方式提交,会失败
注解驱动
只需要扫描和视图解析器
为什么呢?
扫描器扫描的注解:
访问成功!
可以直接接受变量名,两种方式,后者底层走的是前者的方法
正常
接受数组:
接收到String类型数组
先进入到form界面:
接收到Integer类型
成功!
一般不用Integer类型
得到字符串
底层是根据request中传入的name来匹配的,name不能写错,错误示例:
报错:500
可以传入对象,名称可以不匹配。
那么,定义的controller是单例还是多例?
在controller中创建一个构造方法,里面标记好一句话
这句话只打印一次,所以是单例的。
对返回值进行封装:
map底层调用的就是request.setattribute方法
对上述方法改进:
传入的参数中,map相当于上一个方法中ModelAndView中的map,实际是个返回值(传出值)
继续改进:
使用Model,也就是ModelAndView中的Model, 实际底层用的还是map
传入方法的控制:
ajax
redirect:
跳转到同一个类中的方法上,不用加类上的RequestMapping
尝试加上类上的RequestMapping
文件上传:
需要在SpringMVC配置文件中加上复杂类型的解析器
拦截器:
实现HandlerInterceptor
arg2表示当前拦截器拦截到的controller的实例,前置拦截,一般做权限校验
后置拦截:
最终拦截:页面已经生成出来
一般起监控作用,或者捕捉异常
使用拦截器,需要在SpringMVC配置文件中配置拦截器
Autowired属于spring的注解
Resource数据jdk的注解