当前位置: 首页 > article >正文

我的Java-Web进阶--SpringMVC

1.三层架构与MVC模式

三层架构

MVC模式

 

 

 2.SpringMVC执行流程

 

3.SpringMVC的基本使用方法

1. 配置

1.1 Maven依赖

首先,在pom.xml文件中添加Spring MVC的依赖:

<dependencies>
    <!-- Spring MVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.10</version>
    </dependency>

    <!-- Servlet API, JSP, and other web dependencies -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</version>
        <scope>provided</scope>
    </dependency>
    <!-- Other dependencies like logging, testing, etc. -->
</dependencies>
1.2 配置DispatcherServlet

web.xml中配置DispatcherServlet,它是Spring MVC的核心组件,用于接收所有的HTTP请求并分发给相应的控制器处理。

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-mvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
1.3 配置Spring MVC

创建spring-mvc-config.xml文件来配置Spring MVC的组件扫描、视图解析器等。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 扫描控制器所在的包 -->
    <context:component-scan base-package="com.example.controller" />

    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

</beans>

2. 创建控制器

创建一个简单的控制器类,使用@Controller注解,并定义一个处理GET请求的方法,返回一个逻辑视图名称。

package com.example.controller;

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

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String sayHello(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "hello"; // 返回逻辑视图名,对应到/WEB-INF/views/hello.jsp
    }
}

3. 创建视图

/WEB-INF/views/目录下创建一个名为hello.jsp的JSP页面作为视图,用来展示控制器传递过来的数据。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>Hello Page</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

4. 运行应用

启动你的Web容器(例如Tomcat),访问http://localhost:8080/your-app-context/hello,你应该能看到显示“Hello, Spring MVC!”的消息。

3.SpringMVC请求参数获取

如果不添加@ResponseBody,则会自动把回传的字符串添加前后缀,变成请求jsp

请求参数获取

在Spring MVC中,有多种方式可以获取请求参数:

  1. 通过方法参数直接绑定:Spring MVC支持将请求参数直接绑定到控制器方法的参数上。对于GET和POST请求中的表单数据,可以使用简单类型的参数或命令对象来接收。

  2. 使用@RequestParam注解:当需要指定请求参数的名字,或者参数是可选的时候,可以使用@RequestParam注解。它可以用来获取查询字符串参数或表单提交的数据。

  3. 使用@PathVariable注解:当URL模式中包含占位符时,可以使用@PathVariable注解来提取URL路径中的变量。

  4. 使用@RequestBody注解:如果请求体是以JSON或XML等格式发送的,可以使用@RequestBody注解将请求体的内容转换成Java对象。

  5. 使用@MatrixVariable注解:用于从URI路径段中获取矩阵变量(matrix variables),这是一种较少用的方式。

数据回传

为了回传数据,我们可以直接返回一个简单的类型(如String、Integer等),或者返回一个复杂对象(如POJO)。当我们想要将Java对象序列化为JSON或XML并将其作为响应体的一部分发送给客户端时,我们应该使用@ResponseBody注解。

下面是一个详细的示例,展示了如何使用上述概念来获取请求参数,并使用@ResponseBody来返回数据:

package com.example.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController // 相当于 @Controller + @ResponseBody
@RequestMapping("/api")
public class ExampleController {

    // 通过方法参数直接绑定
    @GetMapping("/greet/{name}")
    public String greet(@PathVariable String name) {
        return "Hello, " + name + "!";
    }

    // 使用@RequestParam获取查询参数
    @GetMapping("/search")
    public String search(@RequestParam("query") String query) {
        return "You searched for: " + query;
    }

    // 使用@RequestBody处理POST请求体
    @PostMapping("/user")
    public User createUser(@RequestBody User user) {
        // 处理用户创建逻辑
        return user; // 返回创建的用户对象
    }

    // 使用ResponseEntity封装响应
    @PutMapping("/user/{id}")
    public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {
        // 假设这里执行了更新操作
        user.setId(id);
        return new ResponseEntity<>(user, HttpStatus.OK);
    }

    // 定义一个简单的User类
    static class User {
        private Long id;
        private String name;

        // Getters and Setters (省略)

        // 必须提供无参构造函数以供Jackson序列化/反序列化使用
        public User() {}

        // 可选的有参构造函数
        public User(Long id, String name) {
            this.id = id;
            this.name = name;
        }

        // Getter and Setter methods
        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

在这个例子中:

  • greet方法使用@PathVariable来获取URL中的name参数,并直接返回一个字符串。
  • search方法使用@RequestParam来获取查询参数query,并返回搜索结果。
  • createUser方法使用@RequestBody来接受一个JSON格式的用户对象,并返回该对象。
  • updateUser方法不仅使用了@PathVariable@RequestBody,还使用了ResponseEntity来封装HTTP响应,包括状态码和响应体。

4.SpringMVC高级用法

拦截器

实现拦截类 

配置拦截器 

 异常处理器

文件上传

 

静态资源过滤

 

5.完成流程

 


http://www.kler.cn/a/469447.html

相关文章:

  • 六祖坛经主要讲什么,现代心理学或哲学,有什么和它对应
  • touch详讲
  • 物联网:七天构建一个闭环的物联网DEMO
  • Java中的CAS操作是什么?它如何实现无锁编程?
  • element-ui 2的级联选择器,回显已存储的子选项名称
  • 10-C语言项目池
  • Unity加载CSV配置表
  • 前端同步发送HTTP请求 Ajax、Fetch和Axios实现HTTP同步请求
  • YOLOv5部署到web端(flask+js简单易懂)
  • 第27天:Web开发-PHP应用原生语法全局变量数据接受身份验证变量覆盖任意上传
  • 谷歌浏览器的安全检测工具使用指南
  • 开源复刻 | Matlab实现蚁狮优化算法ALO优化Transformer-LSTM实现负荷数据回归预测
  • Sql中WITH的作用
  • pygame飞机大战
  • SpringMVC(二)原理
  • 【QT】C++线程安全的单例模板
  • Docker容器中Elasticsearch内存不足问题排查与解决方案
  • 【车载网络】BUSOFF状态简述和制造
  • Go语言的 的输入/输出流(I/O Streams)核心知识
  • LeetCode:700.二叉搜索树中的搜索
  • ThreadLocal` 的工作原理
  • Apache zookeeper集群搭建
  • Java-数据结构-时间和空间复杂度
  • Python 标准库:hashlib——安全哈希与消息摘要
  • ARM CCA机密计算安全模型之加密建议
  • 26 go语言(golang) - GC原理