Web应用开发

目录

自动配置介绍

一、整合Spring MVC

MVC的概念以及原理

1.MVC基本概念

2.MVC原理

3.MVC的优缺点

SpringMVC的概念以及原理

1.执行流程

2.常⽤注解

3.案例

二、SpringBoot整合Servlet三大组件

搭建步骤:

1、使用组件注册方式整合Servlet

2、使用组件注册方式整合Filter

3、使用组件注册方式整合Listene

路径扫描整合Servlet三大组件

1、使用路径扫描的方式整合Servlet、Filter、Listener

2、整合测试


自动配置介绍

   在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值