spring mvc(三)注解

注解实现spring mvc的Controlle、service、dao。

1.注解Controller
创建注解Controller类。
package com.sunbin.test.testSpring.web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.stereotype.Controller;

@Controller
public class AnnonationController {
	@RequestMapping("/annonation")
	public ModelAndView handleRequest(HttpServletRequest arg0,
			HttpServletResponse arg1) throws Exception {
		// TODO Auto-generated method stub
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("message", "annonation");
		modelAndView.setViewName("helloWorld");
		return modelAndView;
	}

}

@Controller注解说明是一个controller类。
@RequestMapping("/annonation")注解可用在类、方法上,说明要将类或方法绑定到servlet下的/annonation路径。

在root-context.xml中加入以下配置以支持spring注解、扫描和mvc注解支持、默认解析器handler。
<!-- 注解声明,使用context:component-scan后可省略 -->
<context:annotation-config />
<!-- 开启controller注解支持 -->
<context:component-scan base-package="com.sunbin"></context:component-scan>
<!-- 默认的注解映射的支持 -->
<mvc:annotation-driven/>
<!-- 当上面要访问的静态资源不包括在上面的配置中时,则根据此配置来访问 -->
<mvc:default-servlet-handler />

部署后访问 http://localhost:8080/testSpringWeb/annonation可看到结果:
annonation

2.注解service、dao
按照 http://sb33060418.iteye.com/blog/2372867中的测试步骤,在相同包中创建接口类TestService、TestDao和实现类TestServiceAnnoImpl、TestDaoAnnoImpl。

新建TestController。
package com.sunbin.test.testSpring.web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.sunbin.test.testSpring.service.TestService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;


@RequestMapping(value = "/test")
public class TestController {
	@Autowired
	public TestService testService;

	@RequestMapping(value = "/test")
	public ModelAndView test(HttpServletRequest request,
			HttpServletResponse reponse) throws Exception {
		// TODO Auto-generated method stub
		String param = request.getParameter("param");
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("message", testService.test(param));
		modelAndView.setViewName("helloWorld");
		return modelAndView;
	}

}

因类中使用@Controller、@Service、@Repository、@Autowired等注解,spring将创建bean并自动注入。
方法上@RequestMapping(value = "/test")注解的地址会/test在类注解/test之后被拦截。

重新部署后,访问 http://localhost:8080/testSpringWeb/test/test?param=anno看到结果:
testServiceImpl.test:testDaoImpl.test:anno
不是注解service、dao实现。
因为controller中被byName方式注入了xml文件配置的TestServiceImpl、TestDaoImpl。

注释掉root-context.xml中引入service、dao的配置
<!--     <import resource="services.xml"/>
    <import resource="daos.xml"/> -->

再重新部署后,访问测试地址可看到期待的结果:
testServiceAnnoImpl.test:testDaoAnnoImpl.test:anno

3.Controller绑定多个地址
在实际应用中,经常会把一个模块下的多个资源放在一个Controller类中实现,以共享相同的service、变量定义等。这就需要为单个Controller的不同方法绑定不同地址。

在TestController中增加方法:
	@RequestMapping(value = "/index")
	public ModelAndView handleRequest(HttpServletRequest arg0,
			HttpServletResponse arg1) throws Exception {
		// TODO Auto-generated method stub
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("message", "test/index");
		modelAndView.setViewName("helloWorld");
		return modelAndView;
	}

方法上的@RequestMapping(value = "/index")注解会将/index地址绑定到类地址/test后,拦截/test/index请求。
重新部署后,访问 http://localhost:8080/testSpringWeb/test/index和之前的/test/test可以看到不同的结果。
因注解实现Controller功能,因此类不需再实现Controller接口,也就不用再实现接口中的handleRequest抽象方法,可以使用其他方法名。

4.指定支持的请求方法
@RequestMapping(value = "/index")默认只支持get方法访问,如果使用post、put等方法访问时会报错:
405 Method Not Allowed
需要配置对不同请求方法的支持,修改注解如下:
	@RequestMapping(value = "/index", method = { RequestMethod.GET,
			RequestMethod.POST })
	public ModelAndView handleRequest(HttpServletRequest arg0,
			HttpServletResponse arg1) throws Exception {
		...

这样方法就可以通过get、post方式访问了。同样也可以配置put和delete方法,以实现支持restful样式的服务。

猜你喜欢

转载自sb33060418.iteye.com/blog/2374135