spring mvc使用无配置的方式启动tomcat,需要用到Spring的Java Config技术,这里就不多介绍,有兴趣的同学可以去官网阅读。
1、实现java config 第一步 写个类,实现spring的接口
并在项目的根目录的 META-INF/services/javax.servlet.ServletContainerInitialier目录下建立一个文件
package com.rmd.mvc.init;
import com.rmd.mvc.config.AppConfig;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
/**
* @author : rmd setup 1
* create at: 2020-12-22 18:01
* @description:
*/
//1、实现java config 第一步 写个类,实现spring的接口
public class MyWebApplicationInitialier implements WebApplicationInitializer {
//web容器会在启动的时候,去调用onStartup() ServletContext web上下文对象
//servlet 3.0 版本以后 提出来一个新规范 SPI
//"你"的项目里面,如果有某些类或者某些方法,需要在启动的时候被Tomcat(web容器)调用的话
//首先,你在你的项目的根目录的 META-INF/services/javax.servlet.ServletContainerInitialier目录下建立一个文件 spring + spring mvc
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//用java注解的方式,去初始化spring上下文环境
AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
ac.register(AppConfig.class);
DispatcherServlet servlet = new DispatcherServlet(ac);
ServletRegistration.Dynamic registration = servletContext.addServlet("app",servlet);
registration.setLoadOnStartup(1);
registration.addMapping("*.do");
}
}
2、增加Config类,继承WebMvcConfigurationSupport
package com.rmd.mvc.config;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* @author : rmd setup 2
* create at: 2020-12-22 18:20
* @description:
*/
@Configuration
@ComponentScan("com.rmd.mvc")
public class AppConfig extends WebMvcConfigurationSupport {
@Autowired
public void initArgumentResolvers(RequestMappingHandlerAdapter requestMappingHandlerAdapter){
List<HandlerMethodArgumentResolver> argumentResolvers = new ArrayList<>(requestMappingHandlerAdapter.getArgumentResolvers());
List<HandlerMethodArgumentResolver> customResolvers = requestMappingHandlerAdapter.getCustomArgumentResolvers();
argumentResolvers.removeAll(customResolvers);
argumentResolvers.addAll(0,customResolvers);
requestMappingHandlerAdapter.setArgumentResolvers(argumentResolvers);
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry){
registry.jsp("/page/",".html");
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
FastJsonHttpMessageConverter fastJsonHttpMessageConverter =
new FastJsonHttpMessageConverter();
converters.add(fastJsonHttpMessageConverter);
}
}
3、内嵌tomcat
package com.rmd.mvc;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.startup.Tomcat;
/**
* @author : rmd
* create at: 2020-12-21 21:48
* @description:
*/
//@Component
public class Application {
//内嵌Tomcat
public static void run() throws Exception{
Tomcat tomcat = new Tomcat();
tomcat.setPort(8081);
Context context = tomcat.addContext("/",App.class.getResource("/").getPath());//.replaceAll("",""));
context.addLifecycleListener((LifecycleListener)Class.forName(tomcat.getHost().getConfigClass()).newInstance());
tomcat.start();
//强制Tomcat server等待,避免main线程执行结束后关闭
tomcat.getServer().await();
}
}
4、控制器类
package com.rmd.mvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
* @author : rmd
* create at: 2020-12-21 21:33
* @description:
*/
@Controller
public class TestController {
@RequestMapping("/test.do")
@ResponseBody
public Object test(Map map, String name , HttpServletRequest request, HttpServletResponse response){
request.getRequestURI();
System.out.println(map.get("name"));
System.out.println("调用了");
Map hashMap = new HashMap();
hashMap.put("key","value");
return hashMap;
}
}
5、运行main方法
package com.rmd.mvc;
/**
* @author : rmd
* create at: 2020-12-21 21:47
* @description:
*/
public class App {
public static void main(String[] args) throws Exception{
Application.run();
}
}
6、pom依赖如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.31</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.0</version>
</dependency>
</dependencies>
到这一步就完成了。运行main方法即可。