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样式的服务。