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

news2024/11/20 11:37:12

在这里插入图片描述

嗨,亲爱的小白们!欢迎来到这篇有关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 {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 在请求到达Controller之前执行
        System.out.println("Pre Handle method is Calling");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // 在请求处理之后但视图未渲染前执行
        System.out.println("Post Handle method is Calling");
    }

    @Override
    public 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 {

    @Bean
    public DemoInterceptor demoInterceptor() {
        return new DemoInterceptor();
    }

    @Override
    public 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 {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化过滤器
        System.out.println("Filter initialized");
    }

    @Override
    public 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");
    }

    @Override
    public 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 {

    @Bean
    public FilterRegistrationBean<DemoFilter> demoFilter() {
        FilterRegistrationBean<DemoFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new DemoFilter());
        registrationBean.addUrlPatterns("/hello"); // 过滤的URL
        return 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 {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Bean
    public 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.coloradmin.cn/o/1389409.html

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

相关文章

DBeaver SQL脚本执行配置

对生产环境数据迁移到测试环境时&#xff0c;单条执行可能时间过长、或者内存装不下。最快的方法是执行SQL脚本。 本地数据库客户端&#xff1a;DBeaver 该客户端是不自带脚本执行客户端的&#xff0c;如下图&#xff1a; mysql官网下载workbench&#xff0c;可以连通客户端执…

CDMP认证与CDGA/CDGP的区别有哪些?

&#x1f451;CDMP是DAMA国际组织的全英文考试 &#x1f308;CDGA和CDGP是DAMA中国主导&#xff0c;考试为中文考试。需要在规定的时间内报名后&#xff0c;参加线下笔试考试。 &#x1f44d;CDGA、CDGP证书和英文版的CDMP证书都是国际通用的&#xff0c;是数据管理领域专业的职…

嵌入式工作岗位未来会不会越来越少?

今日话题&#xff0c;嵌入式工作岗位未来会不会越来越少&#xff1f;未来的嵌入式岗位机会将会逐渐增多&#xff0c;因为嵌入式技术是万物互联的基础&#xff0c;从智能手表到智能汽车&#xff0c;嵌入式都扮演着关键角色。虽然相比计算机科学CS&#xff0c;嵌入式领域的天花板…

Klocwork—符合功能安全要求的自动化静态测试工具

产品概述 Klocwork是Perforce公司产品&#xff0c;主要用于C、C、C#、Java、 python和Kotlin代码的自动化静态分析工作&#xff0c;可以提供编码规则检查、代码质量度量、测试结果管理等功能。Klocwork可以扩展到大多数规模的项目&#xff0c;与大型复杂环境、各种开发工具集成…

ACM:每日学习 状压dp

状压dp&#xff1a; 状压dp是对一般dp的改进&#xff1a; //对于判断多种物品的取法&#xff0c;开多维数组比较麻烦&#xff0c;也不好开&#xff0c;使用二进制来表示物品的取与否。 //使用二进制的话&#xff0c;位运算就更能省时间了&#xff0c;而且更会节省空空间&…

3D Guassians Splatting相关解读

从已有的点云模型出发&#xff0c;以每个点为中心&#xff0c;建立可学习的高斯表达&#xff0c;用Splatting即抛雪球的方法进行渲染&#xff0c;实现高分辨率的实时渲染。 1、主要思想 1.引入了一种各向异性&#xff08;anisotropic&#xff09;的3D高斯分布作为高质量、非结…

实战 php 使用 wkhtmltopdf 生成pdf的全过程

公司里边有生成pdf报告的业务需求,之前有过尝试用tcpdf,直接生成的pdf的过程,但是pdf报告的内容数据,根据不同内容的变化,都是各种各样的bug,一直处理修修补补的状态,让后台开发人员很是头疼. 经过思索和甄选,总结出我们的业务中是由于样式不可控导致的,当时从逻辑上就思考到用…

CHS_06.2.1.6_2+线程的实现方式和多线程模型

CHS_06.2.1.6_2线程的实现方式和多线程模型 知识总览线程的实现方式用户级线程&#xff08;User-Level Thread, ULT&#xff09;内核级线程 多线程模型一对一模型多对一多对多模型 知识回顾 在上个小节中 我们学习了线程相关的一些基本概念 基础的知识 那这个小节中 我们回来看…

人脸识别打卡系统的设计与应用!人脸识别打卡系统有什么用?

教育行业的快速日新月异&#xff0c;对信息化建设的要求也越来越高。学校物业管理成为保障学校正常运行的重要环节。然而&#xff0c;在实践中&#xff0c;由于服务人员数量不足、管理不规范等问题&#xff0c;服务质量往往难以保证物业对学校师生的服务质量。为了解决这一问题…

如果你正在学自动化测试,那么请你仔细看完这篇文章

接触了不少同行&#xff0c;由于他们之前一直做手工测试&#xff0c;现在很迫切希望做自动化测试&#xff0c;其中不乏工作5年以上的人。 本人从事软件自动化测试已经近5年&#xff0c;从server端到web端&#xff0c;从API到mobile&#xff0c;切身体会到自动化带来的好处与痛楚…

高级 Python 面试问题与解答

文章目录 专栏导读1.什么是PIP&#xff1f;2.什么是 zip 函数&#xff1f;3.Python 中的 __init __ () 是什么&#xff1f;4.Python 中的访问说明符是什么&#xff1f;5.Python 中的单元测试是什么&#xff1f;6.Python全局解释器锁&#xff08;GIL&#xff09;&#xff1f;7.P…

linux yum仓库

yum是基于rpm包构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。 常用命令 查询 yum list [软件名] 显示可用的安装包&#xff0c;如果不加软件名则显示所有的可用包 yum info [软件名] 显示安装包的详细信息 如果不加软件名是显示所有包…

CF1178F2 Long Colorful Strip 题解 搜索

Long Colorful Strip 传送门 题面翻译 题目描述 这是 F 题的第二个子任务。F1 和 F2 的区别仅在对于 m m m 和时间的限制上 有 n 1 n1 n1 种颜色标号从 0 0 0 到 n n n&#xff0c;我们有一条全部染成颜色 0 0 0 的长为 m m m 的纸带。 Alice 拿着刷子通过以下的过…

MybatisPlus框架入门级理解

MybatisPlus 快速入门入门案例常见注解常用配置 核心功能条件构造器自定义SQLService接口 快速入门 入门案例 使用MybatisPlus的基本步骤&#xff1a; 1.引入MybatisPlus的起步依赖 MybatisPlus官方提供了starter&#xff0c;其中集成了Mybatis和MybatisPlus的所有功能&#…

Spring Cloud 微服务中 gateway 网关如何设置健康检测端点

主要是为了让 k8s 识别到网关项目已经就绪&#xff0c;但是又不想在里面通过 Controller 实现。因为在 Controller 中这样做并不是最佳实践&#xff0c;因为 Gateway 的设计初衷是专注于路由和过滤&#xff0c;而不是业务逻辑的处理。 在 Gateway 中配置健康检查端点可以通过以…

QT报错记录

Ubuntu22.04安装Qt之后启动Qt Creator报错&#xff1a; Fron 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platforn plugin. Could not load. This application failed to start because no Qt platforn plugin could be initialized. Reinstalling t…

Qt vs开发将Graphics view提升 QChartview

1提升部件 2 添加Charts模块 3 在包含ui类的头文件添加QT_CHARTS_USE_NAMESPACE 或者添加 using namespace QtCharts #include <QtWidgets/QMainWindow> #include <QtCharts> #include "ui_mainwin.h" #include <qchartview.h> QT_CHARTS_USE_N…

k8s---pod控制器

pod控制器发的概念&#xff1a; 工作负载&#xff0c;workload用于管理pod的中间层&#xff0c;确保pod资源符合预期的状态。 预期状态&#xff1a; 1、副本数 2、容器重启策略 3、镜像拉取策略 pod出故障的出去等等 pod控制器的类型&#xff1a; 1、replicaset&#xf…

Star 72.4k!神仙级开源项目,真的一行代码都没有!

前言 在 GitHub 开源社区&#xff0c;我们经常能发现一些优秀的开源高分项目&#xff01;有时候为了找到最优秀的开源项目&#xff0c;却往往要在 GitHub 上搜罗很久&#xff0c;很消耗时间。 今天小编就给大家推荐一个近乎于完美的 GitHub 中文排行榜&#xff0c;在这里&…

java基础之线程练习题

1.关于线程设计&#xff0c;下列描述正确的是&#xff08;&#xff09; A.线程对象必须实现Runnable 接口 B.启动一个线程直接调用线程对象的 run()方法 C.Java 对多线程同步提供语言级的支持 synchronized D.一个线程可以包括多个进程 2.在java 中的线程模型包含&#xff0…