还记得上篇文章中的有关controller的配置吗:
<context:component-scan base-package="com.wangpeng.testmodule.controller" />
<context:component-scan/> 用来表明扫描指定的包中的类上的注解,常用的注解有:
@Controller 声明Action组件
@Service 声明Service组件 @Service("myMovieLister")
@Repository 声明Dao组件
@Component 泛指组件, 当不好归类时.
@RequestMapping 请求映射
@Resource 用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName")
@Autowired 用于注入,(srping提供的) 默认按类型装配
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody
@Scope("prototype") 设定bean的作用域
md_index
作为一个controller类首先需要通过@Controller,但是只用@Controller 声明是没有意义的,我们还要通过@RequestMapping来设定请求映射,否则没法访问。需要注意的是,此例返回的是Map,并且传了一个参数message=md_index,在jsp中可以使用el表达式获取${message}。
@Controller
//@RequestMapping("/testControl")
public class SpringController {
@RequestMapping("md_index")
public Map<String, String> testMdIndex() {
System.out.println("testControl/md_index-------------->");
Map<String, String> map = new HashMap<String, String>();
map.put("message", "md_index");
return map;
}
}
如上代码,SpringController 类由@Controller 声明,这样分发处理器将会扫描SpringController类和它的方法,并检测是否使用了@RequestMapping 注解。并且我给方法添加了@RequestMapping("md_index")标记,定义它的请求名为md_index。
在此实例中我把@RequestMapping("/testControl")给注掉了,主要是因为testMdIndex方法返回的是Map,这种情况下Controller返回的视图是和@RequestMapping定义的名称md_index同名的jsp,并且此jsp前缀是和spring-mvc.xml中InternalResourceViewResolver定义的是一样的。
也就是说,上面代码对应的:
请求路径是:http://127.0.0.1:8080/test_web/md_index
返回的视图路径是:http://127.0.0.1:8080/test_web/views/md_index.jsp
如果不注掉testControl的话:
请求路径是:http://127.0.0.1:8080/test_web/testControl/md_index
返回的视图路径是:http://127.0.0.1:8080/test_web/views/testControl/md_index.jsp
注意:下面的例子都是没有注掉testControl的。
testA
此例的请求路径和上例一样,都是最简单的形式,但是返回视图不同,此处返回的是ModelAndView,ModelAndView 中添加了Map,Map中传了一个参数message=md_index,在jsp中可以使用el表达式获取${message}。ModelAndView的构造函数中设置了返回视图的jsp,就是md_index。
@RequestMapping("testA")
public ModelAndView testA() {
System.out.println("testControl/testA-------------->");
Map<String, String> map = new HashMap<String, String>();
map.put("message", "testA");
ModelAndView modelView = new ModelAndView("md_index");
modelView.addAllObjects(map);
return modelView;
}
请求路径是:http://127.0.0.1:8080/test_web/testControl/testA
返回的视图路径是:http://127.0.0.1:8080/test_web/views/md_index.jsp
testB
此例使用了URI模板,说白了就是在rul中传输参数。如下代码,{varB}定义了一个参数位置,此位置的参数由“@PathVariable("varB") String str”赋值给testB方法的参数str。再换一种说法:{varB}位置的参数被单做函数testB的参数str来处理。ModelAndView中没有添加Map,直接传了一个参数message=md_index,在jsp中可以使用el表达式获取${message}。
@RequestMapping("testB/{varB}")
public ModelAndView testB(@PathVariable("varB") String str) {
System.out.println("testControl/testB-------------->");
System.out.println("testB str-------------->" + str);
ModelAndView modelView = new ModelAndView("md_index");
modelView.addObject("message", "testB");
return modelView;
}
请求路径是:http://127.0.0.1:8080/test_web/testControl/testB/你好
返回的视图路径是:http://127.0.0.1:8080/test_web/views/md_index.jsp
打印的是:
testControl/testB-------------->
testB str-------------->你好
testC
此例展示了@RequestMapping 支持通配符*的情况。返回的数据类型是String,此String就是对应的jsp路径名称。
@RequestMapping("*/testC")
public String testC() {
System.out.println("testControl/testC-------------->");
return "/md_index";
}
请求路径是:http://127.0.0.1:8080/test_web/testControl/xx/testC
返回的视图路径是:http://127.0.0.1:8080/test_web/views/md_index.jsp
上面请求路径的xx可以为任意字符串。
testD
此例和testB 有点类似,方法都有参数。此例中“(@RequestParam(required = false,value="name") String name”定义了一个参数name,required = false表明参数name不是必须的,但是age参数默认是必须的。此例返回的是String,与testC不同的是,此例有一个@ResponseBody,表明此例返回的String不是路径,而是内容,也就是浏览器请求后会把"testD<br>name-->"+name+"<br>age-->"+age打印出来。
@RequestMapping("testD")
@ResponseBody
public String testD(@RequestParam(required = false,value="name") String name,
@RequestParam("age") String age) {
System.out.println("testControl/testD-------------->");
System.out.println("testD name-------------->" + name);
System.out.println("testD age-------------->" + age);
return "testD<br>name-->"+name+"<br>age-->"+age;
}
请求路径是:http://127.0.0.1:8080/test_web/testControl/testD?name=nnn&age=jj或者http://127.0.0.1:8080/test_web/testControl/testD?age=jj
返回的视图路径是:http://127.0.0.1:8080/test_web/views/md_index.jsp
此外与RequestParam想同使用方法的还有CookieValue,RequestHeader
testE
此例主要介绍RequestMapping的属性params ,它的功能和testD相同。下面代码的意思是:参数param1 的值必须等于value1;参数param2 必须存在,值无所谓;参数param3 必须不存在。此方法有一个参数HttpServletRequest request,spring会给这个参数赋值,所以可以直接使用。request传了一个参数message=md_index,在jsp中可以使用el表达式获取${message}。
@RequestMapping(value = "testE", params = { "param1=value1", "param2",
"!param3" })
public String testE(HttpServletRequest request) {
System.out.println("testControl/testE-------------->");
System.out.println("testE param1-------------->"
+ request.getParameter("param1"));
System.out.println("testE param2-------------->"
+ request.getParameter("param2"));
System.out.println("testE param3-------------->"
+ request.getParameter("param3"));
request.setAttribute("message", "testE");
return "/md_index";
}
请求路径是:http://127.0.0.1:8080/test_web/testControl/testE?param1=value1¶m2=value2
返回的视图路径是:http://127.0.0.1:8080/test_web/views/md_index.jsp
此外与params 想同使用方法的还有headers。
testF
此例主要说明RequestMapping有一个属性method 来指定访问的方法类型。
@RequestMapping(value = "testF", method = { RequestMethod.GET,
RequestMethod.DELETE })
public String testF() {
System.out.println("testControl/testF-------------->");
return "/md_index";
}