【原标题:springmvc请求过程分析 SpringBoot框架之注解方式启动】上一篇,使用Java语言创建Tomcat容器,并且通过Tomcat执行Servlet,接下来,将会使用Java语言在SpringBoot创建内置Tomcat,使用注解方式启动SpringMVC容器。
代码实现。
1.pom.xml文件,需要依赖的jar包。
org.apache.tomcat.embed
tomcat-embed-core
8.5.23
org.apache.tomcat
tomcat-jasper
7.0.47
org.springframework
spring-web
5.0.8.RELEASE
org.springframework
spring-webmvc
5.0.8.RELEASE
2.配置SpringMVC、Spring、DispatcherServlet的初始化类:
/**
*加载springmvc====dispatcherservlet
*/
publicclassSpringWebAppInitializerextendsAbstractAnnotationConfigDispatcherServletInitializer{
//加载根配置信息spring核心
protectedClass[]getRootConfigClasses(){
returnnewClass[0];
}
//springmvc加载配置信息
protectedClass[]getServletConfigClasses(){
returnnewClass[]{WebConfig.class};
}
//springmvc拦截的url映射,拦截所有请求
protectedString[]getServletMappings(){
returnnewString[]{"/"};//拦截所有请求
}
}
AbstractAnnotationConfigDispatcherServletInitializer这个类负责"初始化Spring容器、SpringMVC容器、配置DispatcherServlet"。
getRootConfigClasses()方法用于获取Spring应用容器的配置文件,这里我们给定预先定义的RootConfig.class;
getServletConfigClasses负责获取Spring MVC应用容器,这里传入预先定义好的WebConfig.class;
getServletMappings()方法负责指定需要由DispatcherServlet映射的路径,这里给定的是"/",意思是由DispatcherServlet处理所有向该应用发起的请求。
SpringMVC配置,加载SpringMVC容器。这里的@Configuration相当于springmvc.xml配置文件;@ComponentScan(basePackages = "com.jiuyue.controller")相当于配置文件sringmvc.xml的扫描controler应该还有印象吧;@EnableWebMvc则是开启SpringMVC功能。
/**
*SpringMVC配置信息
*/
@Configuration//相当于配置文件springmvc.xml
@EnableWebMvc//开启SpringMVC功能
@ComponentScan(basePackages="com.jiuyue.controller")//扫springMVC的
publicclassWebConfigextendsWebMvcConfigurerAdapter{
//配置视图转换器
}
根配置,加载Spring容器。
/**
*根配置
*/
@Configuration
@ComponentScan(basePackages="com.jiuyue")//扫整个spring项目的
publicclassRootConfig{
}
3.启动类
publicclassAPP{
publicstaticvoidmain(String[]args)throwsServletException,LifecycleException{
//使用Java内置tomcat运行SpringMVC框架
//原理:tomcat加载到SpringMVC注解启动方式,就会创建SpringMVC容器
start();
}
publicstaticvoidstart()throwsLifecycleException,ServletException{
//创建tomcat服务器
TomcattomcatServer=newTomcat();
//设置port
tomcatServer.setPort(8085);
//读取项目路径,'/'可以加载静态资源
StandardContextctx=(StandardContext)tomcatServer.addWebapp("/",newFile("src/main").getAbsolutePath());
//禁止重新载入
ctx.setReloadable(false);
//class文件读取地址
FileaddtionWebInfoClasses=newFile("target/classes");
//创建WebRoot
WebResourceRootresources=newStandardRoot(ctx);
//tomcat内部读取class文件进行执行
//内部虚拟Tomcat空间
resources.addPreResources(newDirResourceSet(resources,"/WEB-INF/classes",addtionWebInfoClasses.getAbsolutePath(),"/"));
tomcatServer.start();
System.out.println("Java语言创建Tomcat启动成功");
//异步进行接收请求
tomcatServer.getServer().await();
}
}
controller类
@Controller
publicclassIndexController{
@RequestMapping(value="/index",produces="text/html;charset=UTF-8")
@ResponseBody
publicStringindex(){
return"纯手写Java语言实现SpringBoot注解启动SpringMVC容器";
}
}
访问效果图
配置视图解析器
直接下WebConfig配置类中配置就可以,WebConfig就相当于springmvc.xml配置文件,前面我们在里面配置了扫包与开启springMVC功能,接下来就在下面继续配置视图解析器。
@Configuration//相当与配置文件
@EnableWebMvc//开启SpringMVC功能
@ComponentScan(basePackages="com.jiuyue.controller")//扫springMVC的
publicclassWebConfigextendsWebMvcConfigurerAdapter{
//配置视图转换器
//SpringMVC视图解析器
@Bean
publicViewResolverviewResolver(){
InternalResourceViewResolverviewResolver=newInternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
//可以在JSP页面中通过${}访问bean
viewResolver.setExposeContextBeansAsAttributes(true);
returnviewResolver;
}
}
JspController控制器类
@Controller
publicclassJspController{
@RequestMapping(value="/jspIndex")
publicStringjspIndex(){
return"jspIndex";
}
}
WEB-INF/jsp目录
访问jspIndex返回jsp页面
业务逻辑层
将根配置,配置到初始化类
/**
*根配置
*/
@Configuration
@ComponentScan(basePackages="com.jiuyue")//扫整个spring项目的
publicclassRootConfig{
}
publicclassSpringWebAppInitializerextendsAbstractAnnotationConfigDispatcherServletInitializer{
//加载根配置信息spring核心
protectedClass[]getRootConfigClasses(){
returnnewClass[]{RootConfig.class};
}
//springmvc加载配置信息
protectedClass[]getServletConfigClasses(){
returnnewClass[]{WebConfig.class};
}
//springmvc拦截的url映射,拦截所有请求
protectedString[]getServletMappings(){
returnnewString[]{"/"};//拦截所有请求
}
}
Service类
@Service
publicclassIndexService{
publicStringindex(){
return"纯手写Java语言实现SpringBoot注解启动SpringMVC容器";
}
}
控制器类
@ResponseBody
@RequestMapping(value="/index2",produces="text/html;charset=UTF-8")
publicStringindex2(){
returnindexService.index();
}
如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章的同学,可以关注微信公众号:SeptemberNotes