SpringMVC的架构有什么优势?——控制器(三)

前言


「作者主页」:雪碧有白泡泡
「个人网站」:雪碧的个人网站
「推荐专栏」:

java一站式服务
React从入门到精通
前端炫酷代码分享

从0到英雄,vue成神之路
uniapp-从构建到提升
从0到英雄,vue成神之路
解决算法,一个专栏就够了
架构咱们从0说

数据流通的精妙之道

后端进阶之路

文章目录

  • 前言
  • 标准控制器(Servlet)
    • [1. 控制器(Controller):](#1. 控制器(Controller):)
    • [2. DispatcherServlet:](#2. DispatcherServlet:)
    • [3. HandlerMapping:](#3. HandlerMapping:)
  • 基于注解的控制器
    • [1. 控制器(Controller):](#1. 控制器(Controller):)
    • [2. 请求映射(Request Mapping):](#2. 请求映射(Request Mapping):)
    • [3. 参数绑定(Request Parameter Binding):](#3. 参数绑定(Request Parameter Binding):)

标准控制器(Servlet)

Spring MVC使用标准Servlet API来处理请求和响应。这使得Spring MVC与其他框架和库能够无缝集成。

标准控制器(Servlet)是Spring MVC框架中的一个核心组件,它使用标准Servlet API来处理请求和响应。这种设计使得Spring MVC能够与其他Web框架和库进行无缝集成,并且具有非常高的灵活性。

下面我们将深入探讨Spring MVC标准控制器的核心概念和相应Java代码示例。

1. 控制器(Controller):

控制器用于处理HTTP请求并生成HTTP响应。在Spring MVC中,我们通常使用@Controller注解来定义一个控制器类。

java 复制代码
@Controller
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
    public ModelAndView getUser(@PathVariable("id") Long id) {
        User user = userService.getUserById(id);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("user", user);
        modelAndView.setViewName("user");
        return modelAndView;
    }
}

在上面的示例中,我们定义了一个UserController控制器类,并在getUser()方法中使用@RequestMapping注解来映射HTTP GET请求。该方法使用UserService对象来获取指定id的用户对象,并将其添加到ModelAndView对象中。最后,该方法返回一个封装了模型数据的ModelAndView对象,并指定视图名称为"user"。

2. DispatcherServlet:

DispatcherServlet是Spring MVC框架中的核心控制器,它使用标准Servlet API来处理HTTP请求和响应,并委托给适当的控制器来处理特定的请求。

xml 复制代码
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/config/spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

在上面的示例中,我们定义了一个名为"dispatcherServlet"的Servlet,并将其映射到根路径。该Servlet使用 org.springframework.web.servlet.DispatcherServlet 类作为其实现类,Spring MVC框架将自动加载并初始化它。此外,我们还通过 init-param 元素指定了Spring配置文件的位置,这样就可以将配置文件中定义的控制器、视图解析器和其他相关组件加载到DispatcherServlet中进行管理。

3. HandlerMapping:

HandlerMapping是Spring MVC框架中的一个关键组件,负责将HTTP请求映射到适当的控制器并返回相应的响应。

xml 复制代码
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

在上面的示例中,我们使用BeanNameUrlHandlerMapping类作为默认的HandlerMapping组件。该组件将根据控制器类的名称和@RequestMapping注解中设置的URL路径来确定哪个控制器应该处理特定的HTTP请求。

通过以上的介绍,我们可以看出,标准控制器(Servlet)是Spring MVC框架中的一个非常重要的组件,它使用标准Servlet API来处理HTTP请求和响应,并委托给适当的控制器来处理特定的请求。只有深入理解标准控制器的概念,并熟练掌握相应的Java代码技巧,才能够在实际开发中灵活运用Spring MVC框架,构建高效、可靠、易于维护的Web应用程序。

基于注解的控制器

Spring MVC允许使用注解来定义控制器和处理方法,这使得代码更加简洁清晰。常用的注解包括@Controller、@RequestMapping等。

基于注解的控制器是Spring MVC框架中一种常用的开发方式,它允许使用注解来定义控制器和处理方法,从而使得代码更加简洁清晰。常用的注解包括@Controller、@RequestMapping等。

下面我们将深入探讨Spring MVC基于注解的控制器的核心概念和相应Java代码示例。

1. 控制器(Controller):

在基于注解的控制器中,我们通常使用@Controller注解来定义一个控制器类。

java 复制代码
@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ModelAndView getUser(@PathVariable("id") Long id) {
        User user = userService.getUserById(id);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("user", user);
        modelAndView.setViewName("user");
        return modelAndView;
    }
}

在上面的示例中,我们定义了一个UserController控制器类,并在类级别使用@RequestMapping注解来指定所有请求映射的父路径为"/user"。该类还使用@Autowired注解来自动注入UserService对象。此外,我们还使用@GetMapping注解来定义一个HTTP GET请求的处理方法,该方法获取指定id的用户对象,并将其添加到ModelAndView对象中,最后返回一个封装了模型数据的ModelAndView对象,并指定视图名称为"user"。

2. 请求映射(Request Mapping):

在基于注解的控制器中,我们使用@RequestMapping注解来对HTTP请求进行映射。

java 复制代码
@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ModelAndView getUser(@PathVariable("id") Long id) {
        User user = userService.getUserById(id);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("user", user);
        modelAndView.setViewName("user");
        return modelAndView;
    }

    @PostMapping("/")
    public String createUser(@ModelAttribute("user") User user) {
        userService.saveUser(user);
        return "redirect:/user";
    }
}

在上面的示例中,我们在类级别使用@RequestMapping注解来指定所有请求映射的父路径为"/user"。该类还定义了两个处理方法:getUser()方法和createUser()方法。其中,getUser()方法使用@GetMapping注解来对HTTP GET请求进行映射,createUser()方法使用@PostMapping注解来对HTTP POST请求进行映射。

3. 参数绑定(Request Parameter Binding):

在基于注解的控制器中,我们可以使用@RequestParam注解将HTTP请求参数自动绑定到方法参数中。

java 复制代码
@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/")
    public ModelAndView getUsers(@RequestParam(value = "page", defaultValue = "1") int page) {
        List<User> users = userService.getUsersByPage(page);
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("users", users);
        modelAndView.setViewName("users");
        return modelAndView;
    }
}

在上面的示例中,我们定义了一个名为"getUsers"的处理方法,并使用@GetMapping注解将其映射到HTTP GET请求。该方法通过@RequestParam注解来自动绑定"page"参数,并指定了默认值为1。这样,在访问"/user/"路径时,Spring MVC框架将会自动将请求中的"page"参数绑定到page方法参数中。

通过以上的介绍,我们可以看出,基于注解的控制器是Spring MVC框架中非常常用的一种开发方式。它能够大大简化控制器和处理方法的定义,提高代码的可读性和可维护性。只有深入理解基于注解的控制器的概念,并熟练掌握相应的Java代码技巧,才能够在实际开发中灵活运用Spring MVC框架,构建高效、可靠、易于维护的Web应用程序。

相关推荐
SteveCode.5 小时前
高性能微服务架构:Spring Boot 集成 gRPC 实现用户与订单服务即时交互
spring boot·微服务·架构
m0_728647085 小时前
Feed流系统重构:架构篇
重构·架构
java_heartLake6 小时前
微服务中间件之Nacos
后端·中间件·nacos·架构
_.Switch7 小时前
构建现代应用的Python Serverless架构详解
运维·开发语言·python·云原生·架构·serverless·restful
爱上语文12 小时前
Springboot三层架构
java·开发语言·spring boot·spring·架构
ღ᭄ꦿ࿐Never say never꧂14 小时前
微服务架构中的负载均衡与服务注册中心(Nacos)
java·spring boot·后端·spring cloud·微服务·架构·负载均衡
CaritoB15 小时前
中台架构下的数据仓库与非结构化数据整合
数据仓库·架构
canonical_entropy1 天前
金蝶云苍穹的Extension与Nop平台的Delta的区别
后端·低代码·架构
沛沛老爹1 天前
服务监控插件全览:提升微服务可观测性的利器
微服务·云原生·架构·datadog·influx·graphite
huaqianzkh1 天前
了解华为云容器引擎(Cloud Container Engine)
云原生·架构·华为云