天天看点

maven与springMVC之Controllermd_indextestAtestB testCtestDtestEtestF

还记得上篇文章中的有关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&param2=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";
	}
           

继续阅读