我的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.完成流程

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946604.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flux中的缓存

1. cache&#xff0c;onBackpressureBuffer。都是缓存。cache可以将hot流的数据缓存起来。onBackpressureBuffer也是缓存&#xff0c;但是当下游消费者的处理速度比上游生产者慢时&#xff0c;上游生产的数据会被暂时存储在缓冲区中&#xff0c;防止丢失。 2. Flux.range 默认…

在基于Centos7的服务器上启用【Gateway】的【Clion Nova】(即 ReSharper C++ 引擎)

1. 检查启动报错日志&#xff0c;目录在 ~/.cache/JetBrains/CLion202x.x.x/log/backend.202x-xx-xx_xxxx.xxxx-err.log 2. 大致可能有两种报错 a. Process terminated. Couldnt find a valid ICU package installed on the system. 这个报错只需要装一下 libicu-devel 包即可…

【spring】参数校验Validation

前言 在实际开发中&#xff0c;我们无法保证客户端传来的请求都是合法的。比如一些要求必传的参数没有传递&#xff0c;传来的参数长度不符合要求等&#xff0c;这种时候如果放任不管&#xff0c;继续执行后续业务逻辑&#xff0c;很有可能就会出现意想不到的bug。 有人可能会…

Android实现队列出入队测试

演示效果: 安卓队列测试 入队操作 空队&#xff0c;满队判断 队列实现代码: package com.example.generalqueue;import android.content.Context; import android.widget.Toast;import java.util.Arrays;public class ArrayQueue {private int capacity;//队列容量private in…

Python Pyglet实战(1)——迷宫游戏

大家好啊&#xff0c;今天就来跟大家分享一下Python Pyglet的实战样例吧。 一.导入所需模块 1.导入__future__模块 首先&#xff0c;我们需要导入__future__模块中的division变量&#xff0c;此变量在__future__.py中的定义如下&#xff1a; division _Feature((2, 2, 0, …

第十一章 图论

题目描述&#xff1a; 阿里这学期修了计算机组织和架构课程。他了解到指令之间可能存在依赖关系&#xff0c;比如WAR&#xff08;读后写&#xff09;、WAW、RAW。 如果两个指令之间的距离小于安全距离&#xff0c;则会导致危险&#xff0c;从而可能导致错误的结果。因此&#…

“Gold-YOLO:基于聚合与分发机制的高效目标检测新范式”

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月26日8点00分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文源地址&#xff08;有视频&#xf…

python爬虫--小白篇【selenium自动爬取文件】

一、问题描述 在学习或工作中需要爬取文件资源时&#xff0c;由于文件数量太多&#xff0c;手动单个下载文件效率低&#xff0c;操作麻烦&#xff0c;采用selenium框架自动爬取文件数据是不二选择。如需要爬取下面网站中包含的全部pdf文件&#xff0c;并将其转为Markdown格式。…

去除el-tabs 下面的灰色横线,并修改每一项的左右间距,和字体颜色

HTML <el-tabs v-model"activeName" class"demo-tabs" tab-click"handleClick"><el-tab-pane label"全部" :name"null"></el-tab-pane><el-tab-pane label"问答陪练" name"general-t…

笔上云世界微服务版

目录 一、项目背景 二、项目功能 一功能介绍 三、环境准备 • 需要开发的端口 • Mysql 导入数据库 ​编辑 • Redis ​编辑 • RabbitMQ ​编辑 在创建blog虚拟主机(方法如下) • Nacos • Nginx 四、前端部署 五、后端部署 六、测试计划操作 一功能测试 二…

厦门大学联合网易提出StoryWeaver,可根据统一模型内给定的角色实现高质量的故事可视化

厦门大学联合网易提出StoryWeaver&#xff0c;可以根据统一模型内给定的角色实现高质量的故事可视化。可根据故事文本生成与之匹配的图像&#xff0c;并且确保每个角色在不同的场景中保持一致。本文的方法主要包括以下几个步骤&#xff1a; 角色图构建&#xff1a;设计一个角色…

vscode 多项目冲突:进行 vscode 工作区配置

问题&#xff1a;多个项目&#xff0c;每次打开会因为配置问题/包版本冲突&#xff0c;花费过长时间。 解决&#xff1a;可以通过启用工作区&#xff0c;使得各个项目的开发环境隔离。 vscode官网 对此有两种方法&#xff1a;方法一&#xff1a;启用工作区&#xff08;workspa…

Unity3D仿星露谷物语开发14之Custom Property Attribute

1、目标 创建自定义属性特性&#xff0c;类似于[SerializeField]的属性标签。 当用该自定义属性特性标记变量时&#xff0c;可以在Inspector面板中看到相应的效果。 2、Property类 &#xff08;1&#xff09;PropertyAttribute类 propertyAttribute是Unity中用于派生自定义…

赛博周刊·2024年度工具精选(图片资源类)

1、EmojiSpark emoji表情包查找工具。 2、fluentui-emoji 微软开源的Fluent Emoji表情包。 3、开源Emoji库 一个开源的emoji库&#xff0c;目前拥有4000个emoji表情。 4、中国表情包大合集博物馆 一个专门收集中国表情包的项目&#xff0c;已收录5712张表情包&#xff0c;并…

RK3588,基于 Npu 实现 yolov11 Segment 推理

Ultralytics YOLO11是一款尖端的、最先进的模型,它在之前YOLO版本成功的基础上进行了构建,并引入了新功能和改进,以进一步提升性能和灵活性。YOLO11设计快速、准确且易于使用,使其成为各种物体检测和跟踪、实例分割、图像分类以及姿态估计任务的绝佳选择。 https://github.…

MySQL启动报错:发生系统错误 5。拒绝访问。

参考:https://blog.csdn.net/qq_40762011/article/details/105768798/ 1、错误样式 错误样式&#xff0c;如下图所示&#xff1a; 2、导致原因 未使用管理员角色进行此操作&#xff1b; 3、解决办法 3.1、临时办法 不需要更改任何东西&#xff0c;只需要在打开CMD命令提示符时…

数势科技:解锁数据分析 Agent 的智能密码(14/30)

一、数势科技引领数据分析变革 在当今数字化浪潮中&#xff0c;数据已然成为企业的核心资产&#xff0c;而数据分析则是挖掘这一资产价值的关键钥匙。数势科技&#xff0c;作为数据智能领域的领军者&#xff0c;以其前沿的技术与创新的产品&#xff0c;为企业开启了高效数据分析…

网络编程原理:回显服务器与客户端通信交互功能

文章目录 路由器及网络概念网络通信基础TCP/IP 五层协议封装和分用封装分用 网络编程&#xff08;网络协议&#xff09;UDP类 API使用实现回显通信程序回显服务器(UDP代码)回显客户端(UDP代码) TCP API使用回显服务器(TCP代码)回显客户端(TCP代码) 路由器及网络概念 网络发展是…

云手机+Facebook:让科技与娱乐完美结合

移动互联网时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;早已成为企业、品牌和组织竞相角逐的营销阵地。而云手机的出现&#xff0c;则为Facebook营销注入了新的活力&#xff0c;其独特的优势让营销活动更加高效、精准且灵活。本文将深入探讨云手机在Fa…

git使用指南-实践-搭建git私服

一.创建git私服的核心基础 所谓的git私服&#xff0c;其实就是在一个服务器上创建一个个的git仓库&#xff0c;并且这些仓库允许其在一个网络上被其他用户访问。 创建一个最素的git私服&#xff1a;随便找一台linux服务器&#xff0c;这里假设其ip为192.168.0.6&#xff0c;使…