------配置嵌入式servlet容器------
springboot 默认使用的是嵌入的Servlet(tomcat)容器
问题?
1)如何定制修改Servlet容器的相关配置:
1.修改和server有关的配置(ServerProperties配置文件设置)
// 通用的servlet 容器设置
server.xxxx
server.port=8080 server.servlet.context-path=/crud
// tomcat 相关的设置
server.tomcat.xxx
server.tomcat.uri-encoding=UTF-8
2. 编写一个EnbeddedServletContainerCustomizer:嵌入式servlet 容器的定制器来修改servlet容器默认配置
在springboot中 会有很多的xxxCustomlzer 帮助我们进行定制配置
2) 注册Servlet三大组件 【Servlet Filter Lisener】
由于springboot 默认是 以jar包的形式嵌入式的servlet容器启动web应用 没有web.xml 所以注册三大组件用一下方式
1) 注册Servlet ServletRegistrationBean
public class MyServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("hello myservlet"); } }
// 注册Servlet @Bean public ServletRegistrationBean myServlet() { ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MyServlet(), "/MyServlet"); return registrationBean; }
2) 注册filter FilterRegistrationBean
public class MyFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("MyFilter process"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }
// 注册filter @Bean public FilterRegistrationBean myFilter() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new MyFilter());
// 过滤什么请求 filterRegistrationBean.setUrlPatterns(Arrays.asList("/hello", "/")); return filterRegistrationBean; }
注册lisener ServletListenerRegistrationBean
public class MyLisener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { System.out.println("contextInitialized web 应用启动"); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { System.out.println("web 应用习销毁"); } }
// 注册lisener @Bean public ServletListenerRegistrationBean myLisener() { ServletListenerRegistrationBean<MyLisener> listenerRegistrationBean = new ServletListenerRegistrationBean<MyLisener>(new MyLisener()); return listenerRegistrationBean; }
例子:springboot帮助我们配置springmvc时候 自动注册spirngmvc 的前端控制器
3) springboot 支持其他servlet容器
tomcat
jetty (长连接 聊天点对点长时间连接)
Undertow (不支持JSP 并发性能好)
默认使用tomcat 可以切换成其他容器 修改pom依赖 移除tomcat 模块
之后启动就为Jetty 启动了
嵌入式Servlet 容器优缺点:
优点:简单 便携
缺点:不支持jsp 优化定制比较复杂 (使用低定制器【ServerProperties, EnveddedServketCibtauberCystinuzer , 自己编写嵌入式Servlet 嵌入式工厂 EmbeddedServletContainerFactory 】)
使用外置的servlet容器 :外面安装Tomcat- 应用使用War包方式打包
新建项目 打包方式 选择War包 之前选择是jar包, 并且配置生成Webapp目录
生成项目结构最后如下:
配置外置tomcat 服务器
启动服务器:
创建 hello.jsp 以及success.jsp, helloController等
hello.jsp
<%--
Created by IntelliJ IDEA.
User: UPC
Date: 2018/5/6
Time: 19:26
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<a href="abc"></a>
</head>
<body>
</body>
</html>
HelloController
package com.lixuchun.springboot.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HelloController { @GetMapping("/abc") public String hello(Model model) { model.addAttribute("message", "你好"); return "success"; } }
success.jsp
<%-- Created by IntelliJ IDEA. User: UPC Date: 2018/5/6 Time: 19:26 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>success</title> <h3>${message}</h3> </head> <body> </body> </html>
application.properties
spring.mvc.view.prefix=/WEB-INF
spring.mvc.view.suffix=.jsp
访问效果:
总结 如何使用外部容器:
1) 创建一个war项目
2)将嵌入式的Tomcat指定为 provided
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
3)必须编写一个 springbootServletInitiallzer的子类,并且调用 configure方法
public class ServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
// 传入springboot应用的主程序 return application.sources(SpringBoot04WebJspApplication.class); } }
4). 启动服务就可以使用了