接着上一篇基础上讲,本次我们使用注解的方式。
在之前的代码基础上,只需要修改两个地方(控制器代码和springmvc的配置)
第一个就是HelloController.java。为了不影响之前的代码,我新建一个类,命名
AnnotationController。代码如下:
@Controller public class AnnotationController { Log log = LogFactory.getLog(AnnotationController.class); @RequestMapping("/helloAnno") public ModelAndView helloAnnotation(HttpServletRequest request, HttpServletResponse response){ log.info("进入注解controller"); ModelAndView mv = new ModelAndView(); mv.addObject("message","注解请求"); mv.setViewName("index.jsp"); return mv; } }
@Controller 注释类型用于指示Spring类是一个控制器
@RequestMapping 注释类型用来映射一个请求和请求的方法,“/helloAnno”,表示请求由helloAnno方法进行处理。返回了一个ModelAndView对象
接下来需要修改配置,配置内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean name="/hello" class="cn.com.controller.HelloController"/>
<context:component-scan base-package="cn.com.controller"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
</beans>
在之前的配置下添加了三行,<context:component-scan>用于扫描spring注解的相关的类。如果扫描到,则把这些类注册为spring的bean。如本例中 当扫描到 @Controller时,就把这个类注册bean.没有注解前是手动注册的,如红色标注的地方。
接下来配置了srping bean,一个是annotation 类型的处理映射器 RequestMappingHandlerMapping 明显用于查找请求方法映射的。你请求 /helloAnno过来时,去查找对应的方法,就是靠这个类
还配置了一个是 annotation 类型的处理器适配器 RequestMappingHandlerAdapter 这个用来完成对 @RequestMapping 标注方法的调用。如果没有会报错的,前面那个是用来查找映射的请求方法,后面一个是调用
注意 配置了 RequestMappingHandlerMapping 后,原来手动配置的请求方式就不生效了,红色标注的地方。
这个配置了就意味着从注解里查找对应的映射方法了。
启动服务,浏览器访问结果如下图:
请求成功,搞定!
第一篇说没有注解之前的一些缺点:
一:一个类只能处理一个请求,用注解就不会有这样的限制,一个类中可以写多个 @requestMapping,都能映射到。
二:注解之前的返回类型只能是ModelAndView,用注解不用限制。可以返回String,也可以void 不返回。返回String时需结合其他注解一起使用,否则默认都是把返回的内容识别为一个视图地址的