7.1基于注解的控制器
7.1.1@Controller注解
<!--配置自动扫描的基包 -->
<context:component-scan base-package="com.springmvc"/>
<mvc:annotation-driven/>
<!-- 配置视图解析器,将控制器方法返回的逻辑视图解析为物理视图 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/ch06/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:annotation-driven/>
配置该标签会自动注册处理器映射器与处理器适配器两个Bean,Spring MVC需要通过这两个Bean实例来完成对@Controller和@RequestMapping等注解的支持,从而找出URL与handler method的关系并予以关联。
<context:component-scan base-package="com.springmvc"/>
没有配置此标签,那么标注@Controller的bean仅仅是一个普通的JavaBean,而不是一个可以处理请求的控制器。
部署运行
基于注解的控制器可以同时处理多个请求动作,这样就解决了之前在配置文件中创建多个bean的问题。实际开发中都会使用基于注解的形式
7.1.2@RequestMapping注解
其实在上个例子中已经用到了了@RequestMapping注解
Spring通过@Controller注解找到相应的控制器类以后,还需要知道控制器内部对每一个请求是如何处理的,这就需要@RequestMapping注解,它可以为处理器指定可以处理那些URL请求,可以标注在类或方法上
在这里再稍加补充:在类上用@RequestMapping注解
此时在浏览器中直接访问springmvc-2/hello就访问不到
要再加上/user才行
@RequestMapping注解除了value属性外,还有一些其他属性
- method:选择post/get请求方式
@RequestMapping("/hello",method=RequestMethod.POST)//表示只支持POST
//没有标注就相当于可以处理任意的请求方式,也等于
@RequestMapping("/hello",method={RequestMethod.POST,RequestMethod.GET})
- params:指定request中必须包含某些参数值时,才让方法处理
@RequestMapping("/hello",method=RequestMethod.POST,params="myParam=myValue")
//表示方法仅处理名为myParam、值为myValue的请求
- headers:该属性指定request中必须包含某些指定的header值,才能让方法请求处理
@RequestMapping("/hello",method=RequestMethod.POST,header={"content-type=text/*","Referer=http://www.fzj.edu.cn/"})
//表示方法将处理request的header中具有text/html、text/plain等内容,并且包含Referer请求头和对应值为http://www.fzj.edu.cn的请求
- consumes:该属性指定处理请求的提交内容类型
@RequestMapping("/hello",method=RequestMethod.POST,consumes="application/json")
//表示方法进处理request Context-Type为application/json类型的请求
- produces:该属性指定返回的内容类型,返回的内容类型必须是request请求头中所包含的类型
@RequestMapping("/hello",method=RequestMethod.POST,produces="application/json")
//在consumes的基础上,同时指明了返回内容类型为application/json
7.2请求映射方式
7.2.1根据请求方式映射
新建UserController类
index.jsp
success.jsp
表单
7.2.2Ant风格的URL路径映射
Ant风格的URL支持"?" “*” 和"**"三种匹配符,?匹配文件中的一个字符,*匹配文件名中的任意字符,**匹配多层路径
7.2.3REST风格的URL路径映射
书上在web.xml写了个拦截器,旨在将post请求转换为DELETE或PUT请求,但是完成其余代码运行,index.jsp页面会404.所以这里省略拦截器部分
- 处理GET请求
- 处理POST请求
- 处理DELETE请求
发现之前的过滤器还是有用到,就又检查了下,发现是拼写错误。。。
<!--配置HiddenHttpMethodRilter过滤器,可将POST请求转换为DELETE或者PUT -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4. 处理PUT请求
doTransfer还是之前的那个
7.3绑定控制器类处理方法入参
当用户在页面触发某种请求,一般会将一些参数带到后台。在Spring MVC中可以通过参数绑定,将客户端请求的key/value数据绑定到Controller处理方法的形参上。Spring MVC支持将多种传播途径的参数绑定到控制器类的处理方法的输入参数中。
-
映射URL绑定的占位符到方法入参
在上面传递id时用到过,看前面的。 -
绑定请求参数到控制器方法参数
index.jsp
跳转成功,并且控制台成功输出参数
-
将请求参数绑定到控制器方法的表单对象
Spring MVC会按照参数名和属性名进行自动匹配,自动为该对象填充属性值,并且支持级联。
创建User,Address实体类,并为之添加getter,setter,toString方法(此处省略)
在UserController中添加saveUser方法,将请求参数绑定到控制器方法的表单对象User中
在index.jsp中创建表单
运行
但是此处有个问题,表单中填写中文会乱码如下
此问题待解决 -
将请求参数绑定到控制器方法的Map对象
Spring MVC注解可以将表单数据传递到控制器方法中的Map类型的入参中
写UserMap类,属性uMap.
控制器类中写getUser方法,参数是UserMap
jsp中写表单,注意name属性
运行
填写表单信息后,点击提交,控制台:
7.4控制器类处理方法的返回值类型
之前的代码里,用到过返回ModelAndView还用到过返回String。除此之外Spring MVC 返回的类型还有Model,ModelMap,Map等,如果返回类型是ModelAndView,则其中可包含视图和模型信息,且Spring MVC会将模型信息存放到request域中。
运行
7.5保存模型属性到HttpSession
通过在控制器类的相应方法上标注@SessionAttributes注解,可将模型数据保存到HttpSession中,以便多个请求之间公用该属性模型
写控制方法
在控制器类前添加@SessionAttributes注释
在index中写个超级链接
在success中写el表达式用于验证
运行结果
7.6在控制器类的处理方法执行前指定的方法
如果想让一个方法在控制器类的所有处理方法之前执行,可以通过在该方法上标注@ModelAttribute注解来实现
在控制器中写两个方法,要求有一个方法要先执行,在先执行的方法前加一个@ModelAttribute注解
modelAttribute方法中并没有对user进行初始化,所以必须要先执行getUser才能执行后面的方法。
在index页面中写一个标签,直接用后写的方法,看是否会先执行有ModelAttribute注解的控制器方法
且控制台也输出了相应的user
7.7直接页面转发、自定义视图与页面重定向
- 直接页面转发
如果不想经过控制器类的处理方法直接转发到页面,可以通过<mvc:view-controller>元素来实现。在Spring MVC配置文件springmvc.xml中,添加<mvc:view-controller>元素。
上面的红框里的代码必须有,用它自动注册三个Bean
具体达成的效果
2. 自定义视图
通过使用BeanNameViewResolver类可以实现用户自定义的视图。
创建一个类MyView,实现View接口,存放在新建的com.springmvc view包中,实现一个简单的自定义接口
在springmvc.xml中配置以下Bean
那个<property>暂时没用。可以先不要,应该是用来验证值传递的
在UserController中:
return的是实现view接口的类的类名。
在index.jsp中增加测试超链接
点击index里的连接
- 页面重定向
在前面的实例中,控制器类的方法返回的字符串默认通过转发的方式跳转到目标页面,如果返回的字符串中带redirect前缀,则会采用重定向的方式跳转回目标页面。
7.8Spring MVC返回JSON数据
国内用的比较多的是阿里开发的FastJson
这里学习的是Spring MVC内置的JackSon技术返回JSON数据,阿里的那个有机会后面再学
先下载jar包
添加jar包引入jQuery文件
处理静态资源文件
在springmvc.xml中添加这样一行
<mvc:default-servlet-handler/>
index.jsp
这一章好长啊。。。