首先,来一个入门案例,带你进入helloworld!
1.创建WEB工程,导入JAR包
2.在WEB.XML文件中配置一个DispatcherServlet
3.编写一个Controller类
1:@RequestMapping 除了修饰方法, 还可来修饰类
类定义处: 提供初步的请求映射信息。相对于 WEB 应用的根目录
方法处: 提供进一步的细分映射信息。 相对于类定义处的 URL。若类定义处未标注 @RequestMapping,则方法处标记的 URL相对于 WEB 应用的根目录
在前一讲中,是单单用来修饰方法,这一讲同时也用来修饰类,所以在index.jsp中加入了以下代码:
新写了一个controller
2:RequestMapping 的value属性指定修饰的URL路径和method属性用来指定请求方式(GET,POST)
3:RequestMapping的params属性和headers属性,用法简单,而且不太常用,这里就不会介绍了
4:@RequestMapping还支持ANT风格的URL映射
ANT风格支持3种通配符:
? ---匹配一个字符
* ---匹配任意多个字符
** ---匹配多层路径
5:@PathVariable映射URL绑定的占位符,通过@PathVariable可以将URL中的占位符参数绑定到控制器处理方法的入参当中。如:
6:HiddenHttpMethodFilter 浏览器的FORM表单只支持GET,POST请求,而DELETE,PUT方法并不支持,Spring3.0增加了一个过滤器,可以将POST转化为PUT或DELETE。
首先在WEB.XML文件中配置一个Filter
然后在index.jsp中:
value ---参数名
required---参数是否必须,默认true
defaultValue---默认值
在controller中:
在controller中:
1.HttpServletRequest
2.HttpServletResponse
3.HttpSession
4.Writer
5.Reader
6.OutputStream
7.InputStream
8.Java.security.Principal
在controller中:
添加模型数据:
1.将Map,Model做为方法入参,将其放到请求域(request)
在controller中:
在Controller中:
首先,介绍下ModelAttribute的作用:
1.用@ModelAttribute修饰的方法,将再目标方法被调用前进行调用
2.可以解决这样一个问题:用户在提交表单时候,要求可以对用户名进行修改,但是密码不允许修改,这样在提交之后,在目标方法中的入参对象,将自动对用户名进行填充修改,但是这时候发现密码变为NULL,因为没有对密码传值,但是要求密码为原来用户的密码不变。
2.1 可以通过查询数据库的信息,再密码传递过来
2.2 也可以使用@ModelAttribute来解决这个问题
3.下面来看个案例
在index.jsp中:
注意:map.put("user", user); 中的键user,应该为testModelAttribute(User user1)中的User的首字母小写
4.该案例的运行流程:
4.1 执行@ModelAttribute修饰的方法,把user,放到map当中
4.2 SpringMVC从map中取出User对象,然后把表单的请求参数附给User对象的属性值
4.3 SpringMVC将上述的对象传入目标方法当中
注:同学们可以去看下我的前一讲学习SpringMVC(八)之ModelAttribute
1.首先看下第一阶段的断点情况
还未调用ModelAttribute修饰方法前,map值为{}
调用它之后:map值为从数据库中
并将map键值对放到implicitModel中:
最后目标方法的参数数据如下:
2.如何解析目标方法的参数
源码分析流程:
1.调用@ModelAttribute修饰的方法,实际上是把map中的键值对放入到implicitModel当中
2.解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性
2.1 创建WebDataBinder对象时,需要先确定它的两个属性:target,objectName
下图中,name对应objectName,target对应bindObject
2.1.1 确定objectName属性:
若传入的attrName属性值为“ ”,则objectName为类名第一个字母小写,
若有属性值,则objectName为@modelAttribute的value属性值
2.1.2 确定target属性:
在implicitModel中查找attrName的键名,如果有,则取出返回。如果没有,则
验证当前的controller是否用了@sessionAttribute来修饰,若使用了,则尝试从
session中,获取attrName对应的属性值,若有,则取出,若无,则抛出异常;若
当前controller没有用@sessionAttribute修饰,则通过反射机制创建一个,
WebDataBinder对象。
返回WebDataBinder对象binder
在调用doBind(binder, webRequest, validate, validationHints, !assignBindingResult)之前,binder的
target属性为原来数据库的
在调用doBind(binder, webRequest, validate, validationHints, !assignBindingResult)之后,
binder的target属性为修改后的
2). 若使用了 @ModelAttribute 来修饰, 则key 为 @ModelAttribute 注解的 value 属性值.
2. 在 implicitModel 中查找 key 对应的对象, 若存在, 则作为入参传入
1). 若在 @ModelAttribute 标记的方法中在 Map 中保存过, 且 key 和 1 确定的 key 一致, 则会获取到.SpringMVC用于处理视图最重要的两个接口是ViewResolver和View。ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真正的视图,View接口的主要作用是用于处理视图,然后返回给客户端。
spring为我们提供了非常多的视图解析器,下面将列举一些视图解析器。
AbstractCachingViewResolver:这是一个抽象类,这种视图解析器会把它曾经解析过的视图保存起来,然后每次要解析视图的时候先从缓存里面找,如果找到了对应的视图就直接返回,如果没有就创建一个新的视图对象,然后把它放到一个用于缓存的map中,接着再把新建的视图返回。使用这种视图缓存的方式可以把解析视图的性能问题降到最低。
UrlBasedViewResolver:它继承了AbstractCachingViewResolver,主要就是提供的一种拼接URL的方式来解析视图,它可以让我们通过prefix属性指定一个指定的前缀,通过suffix属性指定一个指定的后缀,然后把返回的逻辑视图名称加上指定的前缀和后缀就是指定的视图URL了。如prefix=/WEB-INF/jsps/,suffix=.jsp,返回的视图名称viewName=test/indx,则UrlBasedViewResolver解析出来的视图URL就是/WEB-INF/jsps/test/index.jsp。默认的prefix和suffix都是空串。
URLBasedViewResolver支持返回的视图名称中包含redirect:前缀,这样就可以支持URL在客户端的跳转,如当返回的视图名称是”redirect:test.do”的时候,URLBasedViewResolver发现返回的视图名称包含”redirect:”前缀,于是把返回的视图名称前缀”redirect:”去掉,取后面的test.do组成一个RedirectView,RedirectView中将把请求返回的模型属性组合成查询参数的形式组合到redirect的URL后面,然后调用HttpServletResponse对象的sendRedirect方法进行重定向。
同样URLBasedViewResolver还支持forword:前缀,对于视图名称中包含forword:前缀的视图名称将会被封装成一个InternalResourceView对象,然后在服务器端利用RequestDispatcher的forword方式跳转到指定的地址。 使用UrlBasedViewResolver的时候必须指定属性viewClass,表示解析成哪种视图,一般使用较多的就是InternalResourceView,利用它来展现jsp,但是当我们使用JSTL的时候我们必须使用JstlView。
下面是一段UrlBasedViewResolver的定义,根据该定义,当返回的逻辑视图名称是test的时候,UrlBasedViewResolver将把逻辑视图名称加上定义好的前缀和后缀,即“/WEB-INF/test.jsp”,然后新建一个viewClass属性指定的视图类型予以返回,即返回一个url为“/WEB-INF/test.jsp”的InternalResourceView对象。
我们都知道存放在/WEB-INF/下面的内容是不能直接通过request请求的方式请求到的,为了安全性考虑,我们通常会把jsp文件放在WEB-INF目录下,而InternalResourceView在服务器端跳转的方式可以很好的解决这个问题。
请求处理方法调用完成后,最终返回一个ModelAndView对象,对于那些返回String,View或ModelMap等类型的处理方法,SpirngMVC也会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图。通过视图解析器(ViewResolver)得到真正的物理视图(View对象), 比如在InternalResourceViewResolver中定义了prefix=/WEB-INF/,suffix=.jsp,然后请求的Controller处理器方法返回的视图名称为test,InternalResourceViewResolver会给它加上定义好的前缀和后缀,组成“/WEB-INF/test.jsp”的形式,然后把它当做一个InternalResourceView的url新建一个InternalResourceView对象返回,先把返回的模型属性都存放到对应的HttpServletRequest属性中,然后利用RequestDispatcher在服务器端把请求forword到/WEB-INF/test.jsp
mvc:view-controller标签作用:
配置直接转发页面,可以直接相应转发的页面,而无须再经过Handler方法
例子:
在index.jsp中:
在springmvc.xml中配置:
这里我将配置一个BeanNameViewResolver视图解析器,使用视图名称来解析视图
注意点:
在springmvc.xml文件中如果有多个视图解析器,可以进行优先级的设置,order 值越小优先级越高
3.在index.jsp中:
一般情况下,contrller方法返回的字符串的值会被当成逻辑视图名处理。
但是如果返回的字符串中带forward:或redirect:前缀时,SpringMVC会对他们进行特殊处理,将forward:和redirect:当成指示符,其后字符串作为URL来处理
例如:
forward:/index.jsp 将会完成一个到index.jsp页面的转发操作
redirect:/index.jsp 将会完成一个到index.jsp页面的重定向操作
在controller中: