通常的web应用需要打成war包 然后配置好Tomcat容器
而SpringBoot启动的时候 外部无须Tomcat容器
因为SpringBoot使用的是自带的嵌入式的Tomcat
在启动器spring-boot-starter-web
的内部自带了spring-boot-starter-tomcat
即嵌入式Tomcat
若是外部的Tomcat 想进行相应的配置 须进入conf目录然后在配置文件中进行配置
而要修改内置的Tomcat的话 SpringBoot底层有个ServerProperties类
在配置文件中修改这个类里面含有的的属性(例如port) 就是对服务器的参数进行修改
例如:
server.port=8081
server.servlet.context-path=/crud
ServerProperties类里面有个叫Tomcat的对象 因此:
server.tomcat.XXX=XXX
注:SpringBoot 2.0版本及以上用WebServerFactoryCustomizer
以下版本用EmbeddedServletContainerCustomizer
这个类
通过该方法修改Servlet容器的配置
在自己写的配置类中配置WebServerFactoryCustomizer即可(记得要加@Bean注入):
// 注入到Spring容器中
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer()
{
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
// 定制嵌入式Servlet容器相关规则
@Override
public void customize(ConfigurableWebServerFactory factory) {
factory.setPort(8082);
}
};
}
其实 这两种方法的底层实现都是相同的
在SpringBoot中 会有很多xxxCustomizer这样的名称的类 可通过修改这些类进行SpringBoot的定制配置
三大组件 分别是Servlet 和 Filter 和 Listener
由于SpringBoot是打成jar包的 并不是标准的web结构目录 并没有webapp文件夹
要是以往的话 三大组件是注册在webapp/WEB-INF/web.xml中的
因而 SpringBoot提供了三大组件分别对应三种方式来配置:
先写一个自己的Servlet类:
public class MyServlet extends HttpServlet {
// 处理get请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
// 处理post请求
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Hello Servlet!");
}
}
然后通过自己写的配置类配置到容器中即可 非常方便:
@Configuration
public class MyServerConfig {
// 注册三大组件
// 切记 要添加到容器中
@Bean
public ServletRegistrationBean myServlet()
{
ServletRegistrationBean<Servlet> ssrb = new ServletRegistrationBean<>(new MyServlet(),"/myServlet");
return servletServletRegistrationBean;
}
}
当然 同样的还可以配置启动顺序:
ssrb.setLoadOnStartup(1);
就跟在xml配置文件中一样
先写一个自己的FIlter类:
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("Hello Filter!");
// 放行
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
然后配置到容器中:
@Configuration
public class MyServerConfig {
@Bean
public FilterRegistrationBean myFilter()
{
FilterRegistrationBean<Filter> ffrb = new FilterRegistrationBean<>();
// 设置拦截器
ffrb.setFilter(new MyFilter());
// 设置要拦截的请求
ffrb.setUrlPatterns(Arrays.asList("/hello","/myServlet"));
return ffrb;
}
}
同样 先写一个自己的Listener类:
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// ServletContext对象的初始化:Web应用的启动
System.out.println("Hello Listener!");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// ServletContext对象的销毁:Web应用的关闭/销毁
System.out.println("Bye Listener!");
}
}
然后配置到容器中:
@Configuration
public class MyServerConfig {
@Bean
public ServletListenerRegistrationBean myListener()
{
ServletListenerRegistrationBean<MyListener> slrb = new ServletListenerRegistrationBean<>(new MyListener());
return slrb;
}
}
配置的步骤都是一样的 傻瓜式
SpringBoot在自动配置SpringMVC的时候就已经自动注册了前端控制器(DispatcherServlet) 因此前端控制器就不用手动注册了
自动注册的DispatcherServlet默认的是拦截"/"
即所有请求 也包括静态资源 但不拦截jsp请求
/*
会拦截jsp 但/
不会 这是区别
可通过配置文件中的server.servletPath
来修改SpringMVC前端控制器默认拦截的请求路径
例:
spring.mvc.servlet.path=/*