对于SpringMVC来说,controller由两个部分构成,分别是分发器和控制器,分发器DispatcherServlet决定着请求使用哪个控制器,并且决定着控制器返回哪个视图,整体结构如下.
对于DispatcherServlet这个是springMVC框架自动实现,而我们只需要写相应的控制器即可,就拿上一个helloworld例子来说,创建一个控制器,只需要给其加上@controller的注解
/** * 加上@Controller决定这个类是一个控制器 */
@Controller
public class HelloController {
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String hello(){
return "hello";
}
}
@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器,这个接下来就会讲到。
让控制器起作用,则需要在springMVC.xml配置文件中配置,也就是上一篇搭建基本环境中的配置
@RequestMapping 注解决定着返回的jsp视图,对于这个属性先简单来说一般配置value和method两个值,value决定着请求的路径,method决定着请求的方法
@Controller
public class HelloController {
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String hello(){
return "hello";
}
}
拿上面例子来说,直接在浏览器访问localhost:8888/hello即可访问到这个控制器,对应的请求为GET请求,此方法返回一个hello字符串,说明对应的视图为hello.jsp,这是最简单的访问形式,如果我们想要传值的话,该怎么做呢?
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String hello(Model model){
// 这样放参数的话,在jsp中直接用EL访问hello即可
model.addAttribute("hello","world1");
// 这样方参数的话,默认的key是参数类型
model.addAttribute("world2");
return "hello";
}
在对应的jsp中可以如下获取
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1 style="text-align: center">Hello World!${hello}----${string}</h1>
</body>
</html>
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public ModelAndView hello(){
ModelAndView model = new ModelAndView();
//设置返回视图名称
model.setViewName("hello");
//传值,规则同上
model.addObject("hello","world1");
//传值,规则同上
model.addObject("world2");
return model;
}
两种方法几乎没区别,根据爱好使用.
URI模板是用来获取url中的值,看下面小例子
@RequestMapping(value = "/hello/{id}",method = RequestMethod.GET)
public String hello(@PathVariable("id") String id, Model model){
// 这样放参数的话,在jsp中直接用EL访问hello即可
model.addAttribute("hello",id);
return "hello";
}
上面在value = “/hello/{id}”,说明访问的url必须为/hello/XX这样的链接,@PathVariable(“id”) String id,的作用就是把这个XX放入id中,然后jsp页面就可以获取这个值了
除此之外还支持*通配符访问
@Controller
@RequestMapping ( "/myTest" )
public class MyController {
@RequestMapping ( "*/wildcard" )
public String testWildcard() {
System. out .println( "wildcard------------" );
return "wildcard" ;
}
}
那么此时的访问路径只要为/mytest/**/wildcard都可以访问当前连接
@RequestMapping ( "requestParam" )
public String testRequestParam( @RequestParam(required=false) String name, @RequestParam ( "age" ) int age) {
return "requestParam" ;
}
required=false代表name是非必须值,可以不存在HttpServletRequest 之中,而后面的age则不同,要求必须在HttpServletRequest 之中,否则会报错.
值得注意的是和@PathVariable 一样,当你没有明确指定从request 中取哪个参数时,Spring 在代码是debug 编译的情况下会默认取更方法参数同名的参数,如果不是debug 编译的就会报错。此外,当需要从request 中绑定的参数和方法的参数名不相同的时候,也需要在@RequestParam 中明确指出是要绑定哪个参数。
类似的还有@CookieValue,@RequestHeader都类似用法,不过一般不用这种方法,接着看下面RequestMapping 的高级用法.
对于方法参数,就像使用Model传值一样,可以直接在参数中加入req,resp,session等,然后就像servlet那样使用就可以了
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String hello(Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session){
// 这样放参数的话,在jsp中直接用EL访问hello即可
return "hello";
}
在通过处理器方法参数接收 request 请求参数绑定数据的时候,对于一些简单的数据类型 Spring 会帮我们自动进行类型转换,而对于一些复杂的类型由于 Spring 没法识别,所以也就不能帮助我们进行自动转换了,这个时候如果我们需要 Spring 来帮我们自动转换的话就需要我们给 Spring 注册一个对特定类型的识别转换器。 Spring 允许我们提供两种类型的识别转换器,一种是注册在 Controller 中的,一种是注册在 SpringMVC 的配置文件中。聪明的读者看到这里应该可以想到它们的区别了,定义在 Controller 中的是局部的,只在当前 Controller 中有效,而放在 SpringMVC 配置文件中的是全局的,所有 Controller 都可以拿来使用。
@InitBinder
public void initBinder(WebDataBinder binder){
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
PropertyEditor propertyEditor = new CustomDateEditor(format, true ); // 第二个参数表示是否允许为空
binder.registerCustomEditor(Date.class, propertyEditor);
}
public class MyWebBindingInitializer implements WebBindingInitializer {
@Override
public void initBinder(WebDataBinder binder, WebRequest request) {
// TODO Auto-generated method stub
DateFormat dateFormat = new SimpleDateFormat( "yyyyMMdd" );
PropertyEditor propertyEditor = new CustomDateEditor(dateFormat, true );
binder.registerCustomEditor(Date. class , propertyEditor);
}
}
需要在springMVC.xml中引入这个转换器
< bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
< property name = "webBindingInitializer" >
< bean class = "com.host.app.web.util.MyWebBindingInitializer" />
</ property >
</ bean >
剩下的用法没区别了
待补充