SpringMVC的整合,基于注解
1、applicationContext.xml中需要配置扫描注解的包
spring容器中,在web.xml中配置一个监听器,在Tomcat启动的时候创建
如果在启动的时候加载项目名的一个父包,需要扫描注解的就包含(web、service、controller)
springMVC容器中,在web.xml中配置了load-on-startup值为1,在Tomcat启动的时候创建
此时,web层只需要扫描(controller)中的注解
Spring容器是SpringMVC容器父容器
先创建Spring容器,再创建SpringMVC的容器,在创建SpringMVC容器调用setParen(spring容器对象)。把Spring容器作为springMVC父容器
子容器可以访问父容器的bean .父容器不能访向子容器的bean
那么,applicationContext.xml中只需要扫描(web、service)中的注解
<!-- 1、扫描注解 (2、或者单独扫描包,一个dao,一个service --> <context:component-scan base-package="spring08"> <!-- 不包括那些注解 --> <!-- <context:exclude-filter type="annotation" expression=""/> --> <!-- 包括那些注解 --> <!-- <context:include-filter type="annotation" expression=""/> --> <!-- 配置Controller注解的扫描 expression: 排除的注解的包.注解名 --> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
springmvc.xml中只需要扫描(controller)中的注解
<!-- 1、扫描注解 --> <context:component-scan base-package="spring08.web"/> <!-- <context:component-scan base-package="spring08"> 2、包括web的注解 <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> -->
2、web.xml中的创建监听器,前端控制器,编码过滤器
<!-- 创建Spring容器的监听器: 在Tomcat启动的时候创建 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <!-- spring默认加载的配置文件: WEB-INF/applicationContext.xml --> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置springMVC的前端控制器 : 创建SpringMVC的容器--> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--如果不配置contextConfigLocation, 默认查找springmvc的配置文件为:WEB-INF/servlet名字-servlet.xml : WEB-INF/springMVC-servlet.xml 比如我们这查找的就是:WEB-INF/springMVC-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc2.xml</param-value> </init-param> <!--load-on-startup: servlet创建是在Tomcat启动时候创建 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <!-- url以.action结尾的到SpringMVC的Servlet / : 匹配所有的url, 在后面再说, 显示restFull风格, 静态资源也会被这个前端控制器处理, 需要对静态资源处理 /*: 错误写法, --> <url-pattern>*.action</url-pattern> </servlet-mapping> <!-- 配置处理乱码的过滤器: post请求编码, 响应编码 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!-- 配置初始化参数 --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <!-- 设置响应编码 --> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
中文编码的过滤器,Spring提供了乱码过滤器, 只需要配置就行
只能处理的post请求编码, 以及响应编码
Get请求编码, 需要,在tomcat的server.xml文件中配置: URIEncoding=”UTF-8”
在Tomcat8以上的版本, 已经帮我们处理
3、springMVC的配置文件(视图解析器,[处理器映射器,处理器适配器],扫描注解)
<!-- springMVC的配置文件 --> <!-- 视图解析器 : --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/jsp/"/> <!-- 后缀 --> <property name="suffix" value=".jsp"/> <!-- 视图的类 : 视图支持 jstl--> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> </bean> <!-- 基于注解的处理器映射器,处理器适配器 注解处理器适配器, 调用的处理器,处理器不需要实现任意接口, 就是一个普通类提供了关于Controller相关的注解 --> <mvc:annotation-driven/> <!-- 扫描注解 --> <context:component-scan base-package="spring08.web"/>
4、web层的代码:
常见的注解:@RequestMapping:
类上, 请求的处理器的上级路径
方法上, 控制器的处理方法绑定一个url, 这个方法访问的url是什么
属性: String[ ] path/value 同一个意思, 绑定的url , 一个处理器方法可以绑定多个url, 实际开发只需要一个
用在方法上,形参就是前端传过来的数据,要求数据名一致,数据类型不一致时(自动进行数据类型的转换)
属性: method: 处理的请求方式, 默认是get/post都可以处理,
值是RequestMethod的枚举类型,
@Controller public class UserController { @Autowired private IUserService userService; //根据id显示用户对象 @RequestMapping("/findUser.action") public ModelAndView findUser(int id) { //根据id调用业务层获取对象 User user = userService.queryByid(id); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("user", user); modelAndView.setViewName("info"); return modelAndView; } //这个方法可以get请求, 也可以处理post @RequestMapping(value="/sayHello.action",method = RequestMethod.GET) public ModelAndView sayHello(String name) throws Exception{ ModelAndView modelAndView = new ModelAndView(); System.out.println(name); modelAndView.addObject("hello", "hello:"+name); modelAndView.setViewName("hello"); return modelAndView; }
如果设定类型为get结果是post提交, 出现如下错误: