Servlet3.0整合Springmvc(注解版)
在创建maven的web工程时候,如果报错缺少web.xml
则在pom添加如下配置 :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
web容器在启动的时候 会扫描每个jar包下的META-INF/services/javax.servlet.ServletContainerInitializer
加载这个文件指定的启动类
Spring的应用一启动会加载感兴趣的WebApplicationInitializer接口下的所有组件
并且为WebApplicationInitializer 组件创建对象(组件不是接口,不是抽象类)
总结:
以注解方式来启动Spring MVC 继承 AbstractAnnotationConfigDispatcherServletInitializer
实现抽象方法指定 DispatchServlet的配置信息
将Spring mvc 通过注解形式整合
配置:
//web容器启动的时候就会创建对象 调用方法 初始化容器 以及前端控制器
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { //获取跟容器的配置类 (Spring配置文件) 父容器
@Override
protected Class<?>[] getRootConfigClasses() {
// TODO Auto-generated method stub
return new Class<?>[] {RootConfig.class};
}
// 获取web容器的配置类 (Spring mvc配置文件) 创建子容器
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] {AppConfig.class};
}
//获取DispatcherServlet的映射信息
@Override
protected String[] getServletMappings() {
// /* 拦截所有亲求; 连*.jsp页面都拦截; jsp页面是Tomcat的jsp引擎解析的
return new String[] {"/"}; //拦截所有请求 包括静态资源 } }
AppConfig:
//Spring mvc 只扫描controller 子容器
@ComponentScan(value="com.toov5",
includeFilters= { @Filter(type=FilterType.ANNOTATION,classes= {Controller.class})},
useDefaultFilters = false) //禁用默认的过虑规则
public class AppConfig { }
RootConfig:
//Spring的容器不扫描controller 父容器
@ComponentScan(value="com.toov5", excludeFilters= {@Filter(type=FilterType.ANNOTATION,classes= {Controller.class})})
public class RootConfig { }
Controller:
@Controller
public class HelloController { @Autowired
HelloService HelloService; @ResponseBody
@RequestMapping("/hello")
public String hello() {
String sayHello = HelloService.sayHello("toov5");
return sayHello;
}
}
Service:
@Service
public class HelloService { public String sayHello(String name) {
return "Hello:"+name;
}
}
访问:
在xml配置的spring mvc开发中
<mvc: default-servlet-handler/> 将springmvc处理不了的请求交给tomcat 静态资源就可以访问
<mvc:annotation-driven /> springmvc高级功能开启
<mvc:interceptors> </mvc:interceptors>
<mvc:view-controller path="" />
下面我们定制 Spring mvc
1 @EnableWebMvc 开始Spring mvc 定制配置功能
<mvc:annotation-driven />
2 配置组件(视图解析器 视图映射 静态资源映射 拦截器)
//Spring mvc 只扫描controller 子容器
@SuppressWarnings("deprecation")
@ComponentScan(value="com.toov5",
includeFilters= { @Filter(type=FilterType.ANNOTATION,classes= {Controller.class})},
useDefaultFilters = false) //禁用默认的过虑规则
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter { //定制视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/",".jsp"); }
//静态资源访问等等都可配置 }
Controller
@Controller
public class HelloController { @Autowired
HelloService HelloService; @ResponseBody
@RequestMapping("/hello")
public String hello() {
String sayHello = HelloService.sayHello("toov5");
return sayHello;
}
@RequestMapping("/su")
public String success() { //配置了解析器
return "success";
}
}
访问结果:
放入图片,加入jsp:
Jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<img alt="" src="aa.jpg">
</body>
</html>
此时:
没有找到 这个映射 这个请求是被spring mvc处理了 实际上这个是个静态资源 交给tomcat。
下面进行自定义配置 配置静态资源访问
//Spring mvc 只扫描controller 子容器
@SuppressWarnings("deprecation")
@ComponentScan(value="com.toov5",
includeFilters= { @Filter(type=FilterType.ANNOTATION,classes= {Controller.class})},
useDefaultFilters = false) //禁用默认的过虑规则
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter { //定制视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/",".jsp"); }
//静态资源访问等等都可配置
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); //xml:<mvc: default-servlet-handler/> 将springmvc处理不了的请求交给tomcat 静态资源就可以访问
}
}
成功!
下面配置一个复杂一点的拦截器:
拦截器:
//需要实现spring mvc 的接口 之前: <mvc:interceptors> </mvc:interceptors>
public class MyFirstInterceptor implements HandlerInterceptor{
//目标方法运行之前执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("目标方法之前....执行了preHandle");
return true;
} public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("目标方之后....执行了postHandle"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("响应到页面之后....执行了afterCompletion");
} }
配置:
//Spring mvc 只扫描controller 子容器
@SuppressWarnings("deprecation")
@ComponentScan(value="com.toov5",
includeFilters= { @Filter(type=FilterType.ANNOTATION,classes= {Controller.class})},
useDefaultFilters = false) //禁用默认的过虑规则
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter { //定制视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/",".jsp"); }
//静态资源访问等等都可配置
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); //xml:<mvc: default-servlet-handler/> 将springmvc处理不了的请求交给tomcat 静态资源就可以访问
} @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyFirstInterceptor()).addPathPatterns("/*"); //添加一个拦截器 也可以从容器中获取
} }
运行:
最新文章
- php 路径
- VS大视野
- 上传App Store成功后,无法构建版本解决方法
- AngularJS例子 ng-repeat遍历输出 通过js的splice方法删除当前行
- How to build windows azure PowerShell Source Code
- MySQL 中根据A表的ID查询B表数据
- CENTOS7 添加自定义快捷键(启动TERMINAL,显示桌面等)
- 8.Smack类库
- Linux 中 10 个有用的命令行补全例子
- iptable软路由
- 将Tomcat注册为Windows服务
- 更新Xcode7 后 .dylib变成了.tbd的问题解决
- spring xml配置标签详解
- iOS_SN_UITableView的优化
- HDU4821---字符串hash,map判重
- ios开发之再谈设计模式
- python测试框架--nose
- [LeetCode] 动态规划入门题目
- C# 之 反射性能优化2
- 如何使用 MasterPage