SpringMVC02:SpringMVC(禁止套娃)

SpringMVC02:SpringMVC(禁止套娃),第1张

SpringMVC02:SpringMVC(禁止套娃)

本文为 SSM 框架系列之 SpringMVC 第二部分:SpringMVC(禁止套娃)
其它内容的链接如下:
【1】MyBatis01:初识 MyBatis 与 第一个 MyBaits 程序
【2】MyBatis02:CRUD *** 作
【3】MyBatis03:配置解析
【4】MyBatis04:作用域和生命周期
【5】MyBatis05:分页
【6】MyBatis06:日志
【7】MyBatis07:使用注解开发
【8】MyBatis08:ResultMap 的结果集映射
【9】MyBatis09:动态 SQL 与缓存

目录:
  • 1 SpringMVC 执行原理
  • 2 配置文件版的 SpringMVC 实现
  • 3 注解版 Spring MVC 实现
  • 4 Controller 控制器
    • 4.1 实现 Controller 接口
    • 4.2 使用 Controller 注解
  • 5 RestFul 风格

1 SpringMVC 执行原理

Spring 的 Web 框架,即 SpringMVC,以请求为驱动,围绕一个中心 Servlet 分派请求及提供其他功能,该 Servlet 为 DispatcherServlet,DispatcherServlet 的作用是将请求分发到不同的处理器。

SpringMVC 执行原理如下图所示:

其中,实线表示 SpringMVC 框架提供的技术,不需要开发者实现,虚线表示需要开发者实现。

具体的流程为:

  1. DispatcherServlet 表示前置控制器,是整个 SpringMVC 的控制中心。用户发出请求,DispatcherServlet 接收请求并拦截请求。
  2. DispatcherServlet 调用 HandlerMapping,HandlerMapping 根据请求url 查找 Handler;
  3. HandlerExecution 表示具体的 Handler,其主要作用是根据 url 查找控制器,如上 url 被查找控制器为:hello;
  4. HandlerExecution 将解析后的信息传递给 DispatcherServlet,如控制器映射等;
  5. HandlerAdapter表示处理器适配器,其按照特定的规则去执行 Handler;
  6. Handler 让具体的 Controller 执行;
  7. Controller 将具体的执行信息返回给 HandlerAdapter,如ModelAndView对象;
  8. HandlerAdapter 将视图逻辑名或模型传递给 DispatcherServlet;
  9. DispatcherServlet 调用视图解析器(ViewResolver)来解析 HandlerAdapter传递的逻辑视图名;
  10. 视图解析器将解析的逻辑视图名传给 DispatcherServlet;
  11. DispatcherServlet 根据视图解析器解析的视图结果,调用具体的视图;
  12. 最终视图呈现给用户。

2 配置文件版的 SpringMVC 实现

接下来,将上一章传统 MVC 改写为利用配置文件版的 SpringMVC 实现。

实现步骤:

  1. 新建一个 web 项目;
  2. 导入相关 jar 包;
  3. 编写 web.xml , 注册 DispatcherServlet;
  4. 编写 springmvc 配置文件;
  5. 接下来就是去创建对应的控制类 , controller;
  6. 最后完善前端视图和 controller 之间的对应;
  7. 测试运行调试。

1 新建一个 web 项目,导入相关 jar 包;

① 右键 module,add Web Application frameworks Support;


③:

2 编写 web.xml , 注册 DispatcherServlet;web.xml 是在 web/WEB-INF 文件夹下。




    
    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:springmvc-servlet.xml
        
        
        1
    

    
    
    
        springmvc
        /
    

    
    
        hello.jsp
    


3 编写 springmvc 配置文件;该配置文件是在 src/main/resources 下



    
    
    
    
    
    
    
        
        
        
        
    

    
    
    

4 创建对应的控制类 , controller;

package sharm.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView mv = new ModelAndView();

        // 这里的话就是一些一些业务代码,如业务层的 *** 作、数据库的读取等,这里先略过
        String name = "输入的姓名是:赵志明";
        mv.addObject("msg", name);

        // 视图跳转
        mv.setViewName("result");
        return mv;
    }
}

5 配置前端页面

<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false" language="java" %>

    
        hello springmvc configfile
    

    
    
        
            
                你点击这里,我返回你的名字
            
        
    
    


6 配置待返回页面

<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false" language="java" %>

    
        结果
    

    
        
            
                <%-- 用来显示反馈结果的视图 --%>
                ${msg}
            
        
    

7 换一个 Module 运行在 Tomcat 服务器上。


3 注解版 Spring MVC 实现

So Easy!

1 新建一个 web 项目,导入相关 jar 包;(与配置文件版无差别)

① 右键 module,add Web Application frameworks Support;


③:

2 编写 web.xml , 注册 DispatcherServlet;web.xml 是在 web/WEB-INF 文件夹下。(与配置文件版无差别)




    
    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:springmvc-servlet.xml
        
        
        1
    

    
    
    
        springmvc
        /
    

    
    
        hello.jsp
    


3 编写 springmvc 配置文件;该配置文件是在 src/main/resources 下

与配置文件版有差别,具体体现在:

  1. 增加了自动扫描包;
  2. 删除了处理器和映射器的配置,转而使用 annotation-driven 配置帮助我们自动完成上述两个实例的注入;
  3. 无需在该配置文件中手动配置 bean 的映射,而只需在 Controller 中增加注解;



    
    
    
    
    
    

    
    
        
        
        
        
    

    
    


4 创建对应的控制类 , controller;

与配置文件版有差别,具体体现在:

  1. 无需实现 Servlet 接口,只需增加注解;
  2. 每一个方法对应一个 url,具体的 url 则通过注解来确定;
  3. ModelAndView 的使用方式修改了。
package sharm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

// 现在我们甚至不需要实现 Servlet 接口,只需要增加注解即可,增加注解后,会被自动扫描到 Spring 中
@Controller
// 也不需要在 springmvc-servlet.xml 中写上 bean 的映射,著需要增加映射注解
@RequestMapping("/HelloController")
public class HelloController {
    // 每一个方法对应一个 url,具体的 url 则通过下面的注解来确定
    // 真实访问地址: 项目名/HelloController/hello
    @RequestMapping("/hello")
    public String welcome(Model model){
        // 这里的话就是一些一些业务代码,如业务层的 *** 作、数据库的读取等,这里先略过
        String name = "输入的姓名是:赵志明";
        //向模型中添加属性msg与值,可以在JSP页面中取出并渲染
        model.addAttribute("msg",name);
        //web-inf/jsp/result.jsp
        return "result";
    }
}

5 配置前端页面

<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false" language="java" %>

    
        hello springmvc configfile
    

    
    
        
            
                你点击这里,我返回你的名字
            
        
    
    

6 配置待返回页面

<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false" language="java" %>

    
        结果
    

    
        
            
                <%-- 用来显示反馈结果的视图 --%>
                ${msg}
            
        
    

7 换一个 Module 运行在 Tomcat 服务器上。


4 Controller 控制器

控制器的实现部分有两种方法,也就是我在第二章和第三章分别使用的两种方法,第一种方式是实现 Controller 接口,另一种方式是使用 Controller 注解,两种方式。

4.1 实现 Controller 接口
public class ControllerTest1 implements Controller {
   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       // 一
       ModelAndView mv = new ModelAndView();
       // 二
       mv.addObject("msg","Test1Controller");
       // 三
       mv.setViewName("result");
       // 四
       return mv;
  }
}

但是这种方法需要在 springmvc 配置文件写入对应的 bean:

name 前需要有斜线

4.2 使用 Controller 注解
  • @Controller 注解用于声明 Spring 类的实例是一个控制器;

  • Spring 可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证 Spring 可以找到你的控制器,需要在配置文件中声明组件扫描。

    
    
  • 增加一个ControllerTest2类,使用注解实现;

    //@Controller 注解的类会自动添加到 Spring 上下文中
    @Controller
    public class ControllerTest2{
       //映射访问路径,可以把 requestMapping 看成是前一种方式配置的 bean
       @RequestMapping("/controllerTest2")
        // 如果方法的返回值是 String,且有具体页面可以跳转,那么该返回的值便可以被视图解析器解析
       public String index(Model model){
           //Spring MVC会自动实例化一个Model对象用于向视图中传值
           model.addAttribute("msg", "ControllerTest2");
           //返回视图位置
           return "result";
      }
    }
    

5 RestFul 风格

Restful 就是一个资源定位及资源 *** 作(即 url )的风格,它不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存。

代码说明一切~~

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

@Controller
public class RestfulController {
    // 原来的 url:http://localhost:8080/add?a=1?b=2
    // Restful 风格的 url:http://localhost:8080/1/2

    @RequestMapping("/add/{a}/{b}")
    // 直接请求是一种 get 方式!!!
    // 当然还可以用下述具体的注解
//    @PutMapping
//    @GetMapping
//    @DeleteMapping
//    @PostMapping
    public String test1(@PathVariable int  a, @PathVariable int b, Model model){
        int res = a + b;
        model.addAttribute("number","值为"+res);
        return "result";
    }

    // 虽然我们的地址栏内容一样,但我们走的是不同的方法
    @PostMapping("/add/{a}/{b}")
    public String test2(@PathVariable int  a, @PathVariable int b, Model model){
        int res = a * b;
        model.addAttribute("number","值为"+res);
        // 可以发现,我们的两个请求都可以指向一个视图,但是页面结果的结果是不一样的,
        // 从这里可以看出视图是被复用的,而控制器与视图之间是弱偶合关系。
        return "result";
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5137453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存