【Spring 篇】深入探索:Spring集成Web环境的奇妙世界

在这里插入图片描述

嗨,亲爱的小白们!欢迎来到这篇有关Spring集成Web环境的博客。如果你曾对如何在Spring中构建强大的Web应用程序感到好奇,那么这里将为你揭示Web开发的神秘面纱。我们将用情感丰富、语句通顺的文字,以小白友好的方式,一探Spring在Web环境中的强大功能。

前言:Web开发的新时代

在我们踏入Spring Web环境的奇妙世界之前,让我们简单了解一下什么是Web开发。Web开发是指构建和维护通过互联网或内联网访问的网页的过程。而Spring作为一个全能型的Java框架,提供了强大的支持来简化Web应用程序的开发。

现代Web应用不仅需要提供丰富的用户体验,还需要保证性能、可维护性和安全性。Spring就像是一位强大的导演,为我们打造了一个舞台,让我们在这个Web开发的新时代中轻松驾驭。

Spring框架简介

在探索Spring Web环境之前,让我们简单回顾一下Spring框架的基本概念。Spring是一个开源框架,它简化了Java应用程序的开发,提供了广泛的基础设施支持。

Spring的核心特性包括依赖注入(DI)、面向切面编程(AOP)、事务管理、以及我们即将深入讨论的Web模块。这些特性使得Spring成为一个理想的选择,不仅用于构建大型企业级应用,也可以轻松地用于小型项目的开发。

Spring集成Web环境:如何搭建舞台

1. 项目初始化

首先,我们需要创建一个新的Spring项目。可以使用Spring Initializr(https://start.spring.io/)来初始化一个基本的Spring Boot项目。选择你需要的配置,点击"Generate"下载项目压缩包,解压后导入到你喜欢的集成开发环境中。

2. 添加Web依赖

pom.xml文件中,添加Spring Web的依赖:

<dependencies><!-- ...其他依赖 ... --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

这个依赖包含了构建基本的Spring Web应用所需的一切。

3. 创建一个简单的Controller

src/main/java/com/example/demo目录下,创建一个名为DemoController.java的类,用于处理Web请求:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@GetMapping("/hello")public String hello() {return "Hello, Spring Web!";}
}

这个简单的Controller定义了一个/hello的GET请求,返回一条简单的问候语。

4. 启动应用

在项目的根目录下执行以下命令启动应用:

./mvnw spring-boot:run

或者在集成开发环境中直接运行DemoApplication.java中的main方法。

打开浏览器访问:http://localhost:8080/hello,你将看到页面上显示着"Hello, Spring Web!"。

至此,我们已经成功搭建了一个简单的Spring Web应用。接下来,让我们更深入地探讨Spring Web环境中的一些核心概念。

MVC模式:将舞台分工明确

在Spring Web环境中,MVC(Model-View-Controller)是一个重要的设计模式。它将应用程序划分为三个主要的组件:

  • Model(模型):负责处理数据逻辑,与数据库交互,提供数据给View展示。
  • View(视图):负责用户界面的展示,将Model提供的数据呈现给用户。
  • Controller(控制器):负责处理用户请求,调用Model获取数据,并将数据传递给View展示。

1. 创建一个简单的Model

src/main/java/com/example/demo目录下,创建一个名为DemoModel.java的类,用于表示我们的数据:

public class DemoModel {private String message;public DemoModel(String message) {this.message = message;}public String getMessage() {return message;}
}

2. 修改Controller,引入Model

修改DemoController.java,将返回值从String改为DemoModel

@RestController
public class DemoController {@GetMapping("/hello")public DemoModel hello() {return new DemoModel("Hello, Spring Web!");}
}

3. 创建一个简单的View

src/main/resources/templates目录下,创建一个名为hello.html的HTML文件,用于展示我们的数据:

<!DOCTYPE html>
<html>
<body><h2 th:text="${message}"></h2></body>
</html>

4. 修改Controller,指定View

修改DemoController.java,指定要使用的View:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class DemoController {@GetMapping("/hello")public String hello(Model model) {model.addAttribute("message", "Hello, Spring Web!");return "hello";}
}

5. 启动应用

重新启动应用,访问http://localhost:8080/hello,你将看到页面上显示着"Hello, Spring Web!"。这一次,我们使用了MVC模式,将数据从Controller传递到了View,让整个Web应用更加结构清晰、分工明确。

数据绑定和表单处理:与用户互动的艺术

在真实的Web应用中,我们不仅仅是向用户展示静态的信息,还需要与用户进行交互。Spring提供了强大的数据绑定和表单处理功能,让我们能够轻松地处理用户提交的数据。

1. 创建一个简单的表单

src/main/resources/templates目录下,创建一个名为form.html的HTML文件,用于展示表单:

<!DOCTYPE html>
<html>
<body><form action="/submit" method="post"><label for="name">Name:</label><input type="text" id="name" name="name" required><br><br><label for="email">Email:</label><input type="email" id="email" name="email" required><br><br><input type="submit" value="Submit">
</form></body>
</html>

2. 创建一个Controller处理表单提交

src/main/java/com/example/demo目录下,创建一个名为FormController.java的类,用于处理表单提交:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;@Controller
public class FormController {@GetMapping("/form")public String showForm() {return "form";}@PostMapping("/submit")public String submitForm(String name, String email, Model model) {// 处理表单提交逻辑model.addAttribute("name", name);model.addAttribute("email", email);return "result";}
}

3. 创建一个显示结果的View

src/main/resources/templates目录下,创建一个名为result.html的HTML文件,用于展示表单提交的结果:

<!DOCTYPE html>
<html>
<body><h2 th:text="'Hello, ' + ${name} + '! Thanks for submitting your email: ' + ${email}"></h2></body>
</html>

4. 启动应用

重新启动应用,访问http://localhost:8080/form,填写表单并提交,你将看到页面上显示着你提交的信息。通过这个简单的例子,我们演示了Spring如何处理表单提交,实现了用户与应用的互动。

拦截器和过滤器:定制Web应用的护卫

有时,我们需要在请求到达Controller之前或者之后执行一些额外的逻辑。这时,拦截器和过滤器就发挥了重要的作用。让我们看看如何在Spring中使用拦截器和过滤器。

拦截器

1. 创建一个拦截器

src/main/java/com/example/demo目录下,创建一个名为DemoInterceptor.java的类,用于定义我们的拦截器:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class DemoInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 在请求到达Controller之前执行System.out.println("Pre Handle method is Calling");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {// 在请求处理之后但视图未渲染前执行System.out.println("Post Handle method is Calling");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 在视图渲染之后执行System.out.println("Request and Response is completed");}
}
2. 注册拦截器

src/main/java/com/example/demo目录下,创建一个名为WebConfig.java的类,用于注册我们的拦截器:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Beanpublic DemoInterceptor demoInterceptor() {return new DemoInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(demoInterceptor());}
}

过滤器

1. 创建一个过滤器

src/main/java/com/example/demo目录下,创建一个名为DemoFilter.java的类,用于定义我们的过滤器:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;public class DemoFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化过滤器System.out.println("Filter initialized");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 在请求处理之前执行System.out.println("Filter is doing its job");chain.doFilter(request, response);// 在请求处理之后执行System.out.println("Filter is done");}@Overridepublic void destroy() {// 销毁过滤器System.out.println("Filter destroyed");}
}
2. 注册过滤器

src/main/java/com/example/demo目录下,创建一个名为FilterConfig.java的类,用于注册我们的过滤器:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<DemoFilter> demoFilter() {FilterRegistrationBean<DemoFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new DemoFilter());registrationBean.addUrlPatterns("/hello"); // 过滤的URLreturn registrationBean;}
}

测试拦截器和过滤器

重新启动应用,通过访问http://localhost:8080/hello,你将在控制台上看到拦截器和过滤器的输出信息。这证明了拦截器在请求到达Controller之前和之后,过滤器在请求处理前后都能够执行相应的逻辑。

异常处理:妙用ControllerAdvice

在真实的Web应用中,异常处理是一个必不可少的部分。Spring提供了@ControllerAdvice注解,允许我们集中处理全局的异常情况。

1. 创建一个自定义异常

src/main/java/com/example/demo目录下,创建一个名为CustomException.java的类,用于表示我们的自定义异常:

public class CustomException extends RuntimeException {public CustomException(String message) {super(message);}
}

2. 创建一个异常处理器

src/main/java/com/example/demo目录下,创建一个名为CustomExceptionHandler.java的类,用于处理自定义异常:

import org.springframework.http.HttpStatus;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import javax.servlet.http.HttpServletResponse;@ControllerAdvice
public class CustomExceptionHandler {@ExceptionHandler(CustomException.class)public String handleCustomException(CustomException ex, Model model, HttpServletResponse response) {model.addAttribute("error", ex.getMessage());response.setStatus(HttpStatus.BAD_REQUEST.value());return "error";}
}

3. 创建一个显示错误信息的View

src/main/resources/templates目录下,创建一个名为error.html的HTML文件,用于展示错误信息:

<!DOCTYPE html>
<html>
<body><h2 th:text="${error}"></h2></body>
</html>

4. 测试异常处理

DemoController.java中,添加一个新的请求处理方法,用于抛出自定义异常:

@GetMapping("/error-demo")
public String errorDemo() {throw new CustomException("This is a custom exception");
}

重新启动应用,访问http://localhost:8080/error-demo,你将看到页面上显示着自定义异常的错误信息。

通过这个简单的例子,我们演示了如何使用@ControllerAdvice注解来集中处理全局的异常情况,使得异常处理更加统一和可维护。

安全性:保护Web应用的护盾

Web应用的安全性是非常重要的,Spring提供了一套强大的安全性机制,使我们能够轻松地保护我们的Web应用。

1. 添加Spring Security依赖

pom.xml文件中,添加Spring Security的依赖:

<dependencies><!-- ...其他依赖 ... --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
</dependencies>

2. 创建一个简单的Security配置

src/main/java/com/example/demo目录下,创建一个名为SecurityConfig.java的类,用于配置Spring Security:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

3. 创建一个登录页面

src/main/resources/templates目录下,创建一个名为login.html的HTML文件,用于展示登录页面:

<!DOCTYPE html>
<html>
<body><form th:action="@{/login}" method="post"><label for="username">Username:</label><input type="text" id="username" name="username" required><br><br><label for="password">Password:</label><input type="password" id="password" name="password" required><br><br><input type="submit" value="Login">
</form></body>
</html>

4. 测试Spring Security

重新启动应用,访问http://localhost:8080/login,你将看到登录页面。输入任意用户名和密码,点击登录按钮,你将被重定向到首页。

通过这个简单的例子,我们演示了如何使用Spring Security来保护我们的Web应用,限制访问权限,以及提供登录认证功能。

结语:在Spring的指导下舞动Web的旋律

通过这篇博客,我们深入浅出地探讨了Spring集成Web环境的世界。从项目初始化、MVC模式、数据绑定和表单处理,到拦截器和过滤器、异常处理、以及安全性,我们一步步地领略了Spring框架在Web开发中的强大功能。

在这个Web的舞台上,Spring为我们打造了一个灵活而强大的舞台,让我们能够自如地表演、与用户互动,同时又有着强大的安全性保障。希望这篇博客对于初学者来说是一次愉快的学习之旅,让你能够在Web的世界里舞动自如。

如果你有任何疑问或者想要分享自己的经验,不妨在评论区留下你的足迹。让我们一起共同探索Spring集成Web环境的奇

妙之处,愉快地编写出安全、高效、可维护的Web应用。感谢你的阅读,希望你在Web的旋律中找到属于自己的节奏!🚀🌐

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig&#xff1b;.&#xff1b;..&#xff1b;./boot) 指定脚本执行路…

SpringBoot集成Minio

pom文件导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…

C盘满了,我用什么思路清理?

20240115 上周六同事传了一个很大的虚拟机给我&#xff0c;C盘就红了 虽然是飞秋选错了存储文件的路径&#xff0c;但后来忘了&#xff0c;就开始毫无目的删除文件&#xff0c;过程中会有没有权限删除的&#xff0c;这样还是没有改善。 咨询了公司IT技术人员&#xff0c; 告…

leetcode-344. 反转字符串、9. 回文数

题目1&#xff1a; 解题方法 直接用reverse()即可 代码&#xff1a; class Solution(object):def reverseString(self, s):""":type s: List[str]:rtype: None Do not return anything, modify s in-place instead."""return s.reverse()如果不…

SpringIOC之support模块GenericXmlApplicationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

深入理解 Flink(八)Flink Task 部署初始化和启动详解

JobMaster 部署 Task 核心入口&#xff1a; JobMaster.onStart();部署 Task 链条&#xff1a;JobMaster --> DefaultScheduler --> SchedulingStrategy --> ExecutionVertex --> Execution --> RPC请求 --> TaskExecutor TaskExecutor 处理 JobMaster 的 …

服务异步通讯——springcloud

服务异步通讯——springcloud 文章目录 服务异步通讯——springcloud初始MQRabbitMQ快速入门单机部署1.1.下载镜像安装MQ SpringAMQPwork Queue 工作队列Fanout Exchange广播模式DirectExchange路由模式TopicExchange话题模式 消息转换器 初始MQ RabbitMQ快速入门 官网https:/…

Next.js 开发指​南(GitHub 115k star​)

Next.js 是一个构建于 Node.js 之上的开源 Web 开发框架&#xff0c;它扩展了最新的 React 特性&#xff0c;集成了基于 Rust 的 JavaScript 工具&#xff0c;可以帮助你快速创建全栈 Web 应用 &#xff08;full-stack Web applications&#xff09; 。 对于有一定 React 基础…

mesh 如何接线

水星 1900 mg 二手 约 40 一个 参考 https://post.smzdm.com/p/aoozepzr/ https://service.mercurycom.com.cn/article-1565.html

HTML5+CSS3+JS小实例:实时给中文添加拼音

实例:实时给中文添加拼音 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"&…

nxp s32k144芯片使用J-LINK程序刷写

1.nxp s32k144 (1)打开软件&#xff1a;J-Flash V6.30j (2)新建工程&#xff1a;file->new project (3)选择芯片型号和 target interface (4)可以保存芯片和接口配置 (5)打开程序&#xff1a;File->open data file &#xff08;6&#xff09;程序刷写&#xff1a;T…

Node cool 跨域问题的解决

1.问题 自己在写后端接口的时候 发现一个接口在抖音小程序上可以调用 浏览器上也可以直接打开 但是在H5 的请求中 一直就是cors error 前端报这个跨域问题 在后端 报not Found 一开始以为是找不到 经过确定 发现是跨域问题 2.解决 在全局 configuration.ts 文件里有个全局…

自动驾驶轨迹规划之碰撞检测(二)

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.基于凸优化 2.具身足迹 3. ESDF 自动驾驶轨迹规划之碰撞检测&#xff08;一&#xff09;-CSDN博客 大家可以先阅读之前的博客 1.基于…

josef约瑟 电流继电器 DL-13/2 0.5 -1A 1NC, 1NO柜内安装,带附件

系列型号 DL-11电流继电器; DL-12电流继电器; DL-13电流继电器&#xff1b; 一、应用范围 DL-13/2电流继电器 板前接线为电磁式瞬动过电流继电器&#xff0c;它广泛用于电力系统二次回路继电保护装置线路中&#xff0c;作为过电流启动元件。 二、主要技术参数据 动作时间…

普冉32位单片机 PY32C642,M0+内核,1.7 V ~ 5.5 V宽工作电压

PY32C642 单片机采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围。嵌入 24Kbytes Flash 和 3 Kbytes SRAM 存储器&#xff0c;最高工作频率 24 MHz。包含多种不同封装类型产品。工作温度范围为-40C ~ 85C&#xff0c;工作电压范围 1.7 V ~ 5.5 V。1 路 12 位A…

【开源】基于JAVA语言的民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

Kubernetes (K8S) 3 小时快速上手 + 实践

1. Kubernetes 简介 k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序&#xff0c;可帮助创建和管理应用程序的容器化。用一个的例子来描述&#xff1a;"当虚拟化容器Docker有太多要管理的时候&#xff0c;手动管理就会很麻烦&#xff0c;于是我们便可以通…

纯c++简易的迷宫小游戏

一个用c写的黑框框迷宫 适合新手入门学习 也适合大学生小作业 下面附上代码 总体思路 初始化游戏界面&#xff1a;设置迷宫的大小&#xff08;WIDTH和HEIGH&#xff09;&#xff0c;生成迷宫地图&#xff08;map&#xff09;&#xff0c;包括墙壁、空地、起点和终点。显示…

Maven 依赖传递和冲突、继承和聚合

一、依赖传递和冲突 1.1 Maven 依赖传递特性 1.1.1 概念 假如有三个 Maven 项目 A、B 和 C&#xff0c;其中项目 A 依赖 B&#xff0c;项目 B 依赖 C。那么我们可以说 A 依赖 C。也就是说&#xff0c;依赖的关系为&#xff1a;A—>B—>C&#xff0c; 那么我们执行项目 …

数据结构——二叉树(先序、中序、后序及层次四种遍历(C语言版))超详细~ (✧∇✧) Q_Q

目录 二叉树的定义&#xff1a; *特殊的二叉树&#xff1a; 二叉树的性质&#xff1a; 二叉树的声明&#xff1a; 二叉树的先序遍历&#xff1a; 二叉树的中序遍历&#xff1a; 二叉树的后序遍历&#xff1a; 二叉树的层序遍历&#xff1a; 二叉树的节点个数&#xff1a; 二叉…