【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.mzph.cn/news/618245.shtml

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

相关文章

Mac M2芯片pycharm配置conda python环境

Mac M2芯片pycharm配置conda python环境 详细步骤如下 1、pycharm界面右上方的小齿轮⚙️&#xff0c;进入Setting…状态 2、进入setting界面后&#xff0c;选择左边栏的Project-->python Interpreter,然后选择右边的Add Interpreter 3、进入Add Interpreter后&#xff0c…

竞赛保研 基于深度学的图像修复 图像补全

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学的图像修复 图像补全 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-se…

内网穿透远程访问

内网穿透远程访问 参考文章&#xff1a;https://blog.csdn.net/qyj19920704/article/details/135528078#comments_30865140 cpolar概述 使用了 cpolar 生成的隧道&#xff0c;其公网地址是随机生成的。 优势在于建立速度快&#xff0c;可以立即使用。然而&#xff0c;它的缺…

selenium模拟浏览器查询导出参考文献

通过使用Selenium和BeautifulSoup&#xff0c;在CNKI网站上&#xff0c;以"知识图谱"为关键词&#xff0c;通过自动化工具在搜索页面提取相关文章信息。点击清楚并全选进行文献导出&#xff0c;随后从导出页面和管理导出的页面提取参考文献。 浏览器及WebDriver下载…

postgresql迁移到mysql

1.工具方法&#xff1a;Navicat Premium16 2. 手工方法&#xff1a; 迁移流程 下面是将 Postgresql 数据库迁移到 MySQL 的步骤流程&#xff1a; 步骤描述1. 创建MySQL表结构在MySQL中创建与Postgresql中的表结构相同的表2. 导出Postgresql数据将Postgresql中的数据导出为SQ…

评估指标中的RMSE,MAE,MAPE分别表示什么,取值范围一般多大,优缺点有哪些?

评价指标 1. RMSE&#xff08;Root Mean Square Error&#xff09;&#xff1a;均方根误差2. MAE&#xff08;Mean Absolute Error&#xff09;&#xff1a;平均绝对误差&#xff0c;也叫均方误差3. MAPE&#xff08;Mean Absolute Percentage Error&#xff09;&#xff1a;平…

第九讲 单片机驱动彩色液晶屏 控制RA8889软件:显存操作

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

kafka入门(六):日志分段(LogSegment)

日志分段&#xff08;LogSegment&#xff09; Kafka的一个 主题可以分为多个分区。 一个分区可以有一至多个副本&#xff0c;每个副本对应一个日志文件。 每个日志文件对应一个至多个日志分段&#xff08;LogSegment&#xff09;。 每个日志分段还可以细分为索引文件、日志存储…

【Mybatis系列】Mybatis空值关联

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux 内核学习 2 - 用户程序如何被塞进内核进行调度?

Shell是系统的用户界面&#xff0c;提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。 fork里copy了父进程的信息&#xff0c;并激活task放到运行队列&#xff0c;当系统发生调度并获得执行机会时开始执行&#xff0c;但这时还不是hello程序…

C++力扣题目700--二叉搜索树中的搜索

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,1,3], val 2 输出&#xff1a;[2,1,…

网络安全全栈培训笔记(52-WEB攻防-通用漏洞弱口令安全社工字典生成服务协议web应用)

第52天 WEB攻防-通用漏洞&弱口令安全&社工字典生成&服务协议&web应用 知识点&#xff1a; 1、弱口令安全&配置&初始化等 2、弱口令对象&Web&服务&应用等 3、弱口令字典&查询&列表&列表等 #前置知识&#xff1a; 弱口令(weak…

C#人力资源管理系统源码

C#人力资源管理系统源码 源码描述&#xff1a; 该系统利用asp.net中mvc,linq搭建开发&#xff0c; 分权限管理 权限级别分为&#xff1a;管理员&#xff0c;经理&#xff0c;专员&#xff0c;员工等 管理员可以管理角色、菜单 经理可以管理 组织规划&#xff0c;员工管理&#…

python,序列的切片

序列的切片就是指从一个序列中取出子序列 语法&#xff1a; 序列[起始下标&#xff1a;结束下标&#xff1a;步长] 步长为1表示一个一个的取元素&#xff0c;步长为2表示每次跳过一个元素的取元素&#xff0c;步长为负数表示反向切片&#xff0c;取元素时取到结束下标&#…

分裂联邦学习论文-混合联邦分裂学习GAN驱动的预测性多目标优化

论文标题&#xff1a;《Predictive GAN-Powered Multi-Objective Optimization for Hybrid Federated Split Learning》 期刊&#xff1a;IEEE Transactions on Communications, 2023 一、论文介绍 背景&#xff1a;联邦学习作为一种多设备协同训练的边缘智能算法&#xff0…

SpringBoot中 如何优雅的 重试调用 第三方API?

引言 在实际的应用中&#xff0c;我们经常需要调用第三方API来获取数据或执行某些操作。然而&#xff0c;由于网络不稳定、第三方服务异常等原因&#xff0c;API调用可能会失败。为了提高系统的稳定性和可靠性&#xff0c;我们通常会考虑实现重试机制。 本文将深入探讨如何在…

多语言生成式语言模型用于零样本跨语言事件论证提取(ACL2023)

1、写作动机&#xff1a; 经过预训练的生成式语言模型更好地捕捉实体之间的结构和依赖关系&#xff0c;因为模板提供了额外的声明性信息。先前工作中模板的设计是依赖于语言的&#xff0c;这使得很难将其扩展到零样本跨语言转移设置。 2、主要贡献&#xff1a; 作者提出了一…

AI-图片转换中国风动漫人物

&#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI卡通秀原理 2. …

【PyQt小知识 - 8】:QFileDialog — 文件选择对话框(选择文件夹/文件)

文章目录 QFileDialog的介绍和使用 QFileDialog的介绍和使用 QFileDialog是Qt框架中提供的一个文件选择对话框。它可以让用户通过图形界面的方式选择文件或目录&#xff0c;并提供了许多与文件操作相关的实用功能&#xff0c;例如文件过滤、文件类型限制、文件名默认值、默认目…

ASP.NET进销存系统源码

ASP.NET进销存系统源码 功能介绍&#xff1a; 财务 销售清单&#xff0c;填写销售单&#xff0c;客户管理&#xff0c;添加客户资料 销售 销售清单&#xff0c;填写销售单&#xff0c;客户管理&#xff0c;添加客户资料 仓库 仓库结存&#xff0c;仓库盘点&#xff0c;盘点结…