目录
1、使用路径扫描的方式整合Servlet、Filter、Listener
自动配置介绍
在Spring Boot项目中,一旦引入了Web依赖启动器spring-boot-starter-web,那么Spring Boot整合Spring MVC框架默认实现的一些XxxAutoConfiguration自动配置类就会自动生效,几乎可以在无任何额外配置的情况下进行Web开发。
一、整合Spring MVC
-
MVC的概念以及原理
1.MVC基本概念
MVC全名是Model View Controller。
是一种使用mvc设计创建 Web 应用程序的模式。一种软件设计典范。软件工程中的一种软件架构模式。
2.MVC原理
MVC原理是View接收用户输入,发送请求给Controller,Controller调用Module完成具体操作。Module从数据库获取数据并进行业务逻辑判断,然后触发事件也就是间接返回数据给View。
如图所示:
3.MVC的优缺点
优点:
1.耦合性低。MVC 分层有助于管理复杂的应用程序,简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑,提高开发效率。
2.重用性高。
3.生命周期成本低,MVC使开发和维护用户接口的技术含量降低。
4.可维护性高。分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
缺点:
1.不适合小型,中等规模的应用程序。花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。
2.增加系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
3.视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
SpringMVC的概念以及原理
SpringMVC可以理解为对Servlet封装的MVC框架,当前,Java Web技术底层由两种实现⽅式︓⼀种基于Servlet,⼀种基于Netty,前者由Spring MVC框架等,后者则有WebFlux。
1.执行流程
作为Web MVC的实现,职责对应关系为︓DispatcherServlet -> 前端控件器, HandlerMappingViewResolver-> 应⽤控制器, Handler -> 页⾯控制器。
2.常⽤注解
@Controller
1. @Controller 定义了⼀个控制器类,它需要配合使⽤@RequestMapping 注解的⽅法才是真正处理请求的处理器。使⽤此注解返回的不是Json数据,⽽是页⾯类数据。
2. @RestController 使⽤@RestController注解的⽅法表⽰⼀个控制器,返回json,是@Controller和
@RequestBody的组合注解。
3. @RequestMapping @RequestMapping可以使⽤在类上,也可以使⽤在⽅法上。 @GetMapping(value =“hello”) 等价于@RequestMapping(value = “hello”, method = RequestMethod.GET)
@PostMapping(value = “hello”) 等价于@RequestMapping(value = “hello”, method =
RequestMethod.POST)
4. @RequestParam @RequestParam⽤于获取查询参数。
5. @PathVariable 通过@PathVariable可以将URL中占位符参数绑定到控制器处理⽅法的参数中,即获取路
径参数。
6. @ResponseBody @RequestBody @Responsebody 注解表⽰该⽅法的返回的结果直接写⼊ HTTP 响应正⽂(ResponseBody)中,⼀般在异步获取数据时使⽤,当返回的数据不是html标签的页⾯,⽽是其他某种格式的数据时(如json、xml等)使⽤︔@RequestBody将controller层中的⽅法的返回值对象转换成相应的格式,然后将其写⼊到HttpServletResponse响应体中。使⽤此注解此次请求将不再⾛视图处理器,⽽是直接将此响应结果写⼊到输⼊流中,其效果等同于使⽤response对象输出指定格式的数据。
3.案例
页⾯跳转功能按照之前的例⼦创建项⽬,引⼊依赖(spring web, thymeleaf),在模板⾥创建
test1.html,test2.html,之后在config⽂件夹⾥创建MyMvcConfig类。
@Configuration
publicclassMyMvcConfigimplementsWebMvcConfigurer{
@Override
publicvoidaddViewControllers(ViewControllerRegistry registry){
registry.addViewController("/test1").setViewName("test1");
registry.addViewController("/test111").setViewName("test1");
registry.addViewController("/test2").setViewName("test2");
}
}
二、SpringBoot整合Servlet三大组件
搭建步骤:
1、使用组件注册方式整合Servlet
- 创建一个自定义Servlet类MyServlet,使用@Component注解将MyServlet类作为组件注入Spring容器。MyServlet类继承自HttpServlet,通过HttpServletResponse对象向页面输出“hello MyServlet”。
案例:
@Component
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp); }
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().write("hello MyServlet");
}
}
- 创建Servlet组件配置类
@Configuration
public class ServletConfig {
@Bean
public ServletRegistrationBean getServlet(MyServlet myServlet){
ServletRegistrationBean registrationBean =
new ServletRegistrationBean(myServlet,"/myServlet");
return registrationBean;
}
}
- 重启项目,启动成功后,在浏览器上访问http://localhost:8080/myServlet
如图所示:
2、使用组件注册方式整合Filter
- 创建一个自定义Servlet类MyFilter,使用@Component注解将当前MyFilter类作为组件注入到Spring容器中。MyFilter类实现Filter接口,并重写了init()、doFilter()和destroy()方法,在doFilter()方法中向控制台打印了“hello MyFilter”字符串。
案例:
@Component
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("hello MyFilter");
filterChain.doFilter(servletRequest,servletResponse);}
@Override
public void destroy() { }
}
- 向Servlet组件配置类注册自定义Filter类
@Bean
public FilterRegistrationBean getFilter(MyFilter filter){
FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
registrationBean.setUrlPatterns(Arrays.asList("/toLoginPage","/myFilter"));
return registrationBean;
}
- 项目启动成功后,在浏览器上访问http://localhost:8080/myFilter,查看控制台打印效果
效果如下:
3、使用组件注册方式整合Listene
- 创建一个类MyListener
案例:
@Component
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("contextInitialized ..."); }
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("contextDestroyed ..."); }
}
- 向Servlet组件配置类注册自定义Listener类
@Bean
public ServletListenerRegistrationBean getServletListener(MyListener myListener){
ServletListenerRegistrationBean registrationBean =
new ServletListenerRegistrationBean(myListener);
return registrationBean;
}
- 项目启动成功后查看控制台打印效果
路径扫描整合Servlet三大组件
1、使用路径扫描的方式整合Servlet、Filter、Listener
在对应组件上分别使用@WebServlet(“/annotationServlet”)注解来映射“/annotationServlet”请求的Servlet类,使用@WebFilter(value = {“/antionLogin”,“/antionMyFilter”})注解来映射“/antionLogin”和“/antionMyFilter”请求的Filter类,使用@WebListener注解来标注Listener类
@WebServlet("/annotationServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp); }
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter().write("hello MyServlet"); }}
===================================================================
@WebFilter(value = {"/antionLogin","/antionMyFilter"})
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("hello MyFilter");
filterChain.doFilter(servletRequest,servletResponse);}
@Override
public void destroy() { } }
===================================================================
@WebListener
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("contextInitialized ..."); }
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("contextDestroyed ..."); }
}
- 主程序启动类上添加@ServletComponentScan注解开启基于注解方式的Servlet组件扫描支持
@SpringBootApplication
@ServletComponentScan // 开启基于注解方式的Servlet组件扫描支持
public class Chapter05Application {
public static void main(String[] args) {
SpringApplication.run(Chapter05Application.class, args);
}
}
2、整合测试
- 项目启动成功后查看控制台打印效果
- 在浏览器上访问http://localhost:8080/annotationServlet