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

【Java项目实战】牛客网论坛项目1 - Spring入门与初识SpringMVC

目录

    • Spring 入门
      • SpringInitializr
      • ApplicationContextAware
      • Controller
      • DAO
      • DAO 名称索引
      • Service
      • Config
      • 自动装配
    • 初识 SpringMVC
      • Http 请求
      • GET
      • POST
      • HTML 渲染
      • 响应 JSON 数据

Spring 入门

SpringInitializr

IDEA 专业版自带的功能,也可以直接搜索对应网站,通过网站生成包后导入 IDEA 中使用

下面是初始化的参数:

  • 选用 SpringBoot2.7.15
  • 导入依赖 Web、DevTools、Thymeleaf

之后等待构建完毕即可


ApplicationContextAware

在测试函数中使用 ApplicationContextAware 来获取应用上下文

package com.zhiller.community.zhillercommunity;import com.zhiller.community.zhillercommunity.dao.AlphaDao;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeansException;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.test.context.ContextConfiguration;@SpringBootTest
// @SpringBootTest 是 Spring Boot 提供的测试注解,用于表示这是一个 Spring Boot 的测试类。
// 它会自动加载 Spring Boot 的配置,并启动 Spring 容器,以便进行集成测试。
@ContextConfiguration(classes = ZhillerCommunityApplication.class)
// @ContextConfiguration 用于指定 Spring 容器的配置信息。
// 这里使用 ZhillerCommunityApplication.class 表示使用该类所在的包作为配置信息。
class ZhillerCommunityApplicationTests implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}// 实现 ApplicationContextAware 接口的方法,用于获取 Spring 应用上下文对象。}

Controller

创建 controller 文件

package com.zhiller.community.zhillercommunity.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@RequestMapping("/alpha")
public class AlphaController {// 处理"/alpha/helloworld"请求,返回字符串响应@RequestMapping("/helloworld")// @ResponseBody注解表示将方法的返回值直接作为响应体返回,而不是将其解析为视图名称@ResponseBodypublic String hello(){return "shit man!";}
}

运行 Application,之后打开浏览器,输入 localhost:10086/alpha/helloworld 获取请求结果


DAO

主应用包下新建两个文件,分别是 DAO 接口以及其对应实现类

代码清单:AlphaDao.java

package com.zhiller.community.zhillercommunity.dao;public interface AlphaDao {String select();
}

代码清单:AlphaDaoImpl.java

package com.zhiller.community.zhillercommunity.dao;import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;@Repository
// @Repository 是 Spring 提供的注解,用于表示该类是一个数据访问对象(DAO)。
// 它会被 Spring 自动扫描并将其注册为 Spring 容器中的一个 Bean。
@Primary
// @Primary 是 Spring 提供的注解,用于表示当存在多个同一类型的 Bean 时,优先选择被标记为 @Primary 的 Bean。
// 在自动装配时,如果没有明确指定要注入哪个 Bean,将会选择被标记为 @Primary 的 Bean。
public class AlphaDaoImpl implements AlphaDao {// AlphaDao 是一个接口,AlphaDaoImpl 类实现了该接口。@Overridepublic String select() {return "hibernate";}// 实现了 AlphaDao 接口中的 select() 方法,返回字符串 "hibernate"。
}

最后在主测试类中对这个 DAO 进行测试

@SpringBootTest
@ContextConfiguration(classes = ZhillerCommunityApplication.class)
class ZhillerCommunityApplicationTests implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}@Testpublic void testContext(){System.out.println(applicationContext);AlphaDao alphaDao = applicationContext.getBean(AlphaDao.class);System.out.println(alphaDao.select());}
}

DAO 名称索引

对 DAO 实现类的注解@Repository添加一段字符串描述,即可直接通过该字符串获取该 DAO

@Repository("alpha_hibernate")
@Primary
public class AlphaDaoImpl implements AlphaDao {@Overridepublic String select() {return "hibernate";}
}

故对应的测试类可以这么写

@Test
public void testContext(){System.out.println(applicationContext);AlphaDao alphaDao = applicationContext.getBean("alpha_hibernate",AlphaDao.class);System.out.println(alphaDao.select());
}

Service

创建 service 包,下含一个 Service 类

代码清单 AlphaService.java

package com.zhiller.community.zhillercommunity.service;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;@Service
// @Service 是 Spring 提供的注解,用于表示该类是一个服务类。
// 它会被 Spring 自动扫描并将其注册为 Spring 容器中的一个 Bean。
@Scope("prototype")
// @Scope 是 Spring 提供的注解,用于指定 Bean 的作用域。
// 这里的 "prototype" 表示每次请求该 Bean 都会创建一个新的实例。
public class AlphaService {public AlphaService() {System.out.println("实例化service");// 在构造函数中打印一条实例化的信息。}@PostConstruct// @PostConstruct 是 Java 的注解,用于指定在构造函数执行后执行的方法。// 在该方法上添加 @PostConstruct 注解后,Spring 会在构造函数执行完毕后调用该方法。public void init(){System.out.println("初始化service");// 在 init() 方法中打印一条初始化的信息。}@PreDestroy// @PreDestroy 是 Java 的注解,用于指定在 Bean 销毁之前执行的方法。// 在该方法上添加 @PreDestroy 注解后,Spring 会在销毁 Bean 之前调用该方法。public void destory(){System.out.println("销毁service");// 在 destory() 方法中打印一条销毁的信息。}
}

对应的测试文件这里不在给出,使用方式和 DAO 完全一致


Config

配置 Config 文件和 service、dao 如出一辙

代码清单 AlphaConfig.java

package com.zhiller.community.zhillercommunity.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.text.SimpleDateFormat;@Configuration
public class AlphaConfig {@Beanpublic SimpleDateFormat simpleDateFormat(){return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");}
}

自动装配

springboot 提供了自动装配,我们无需获取 applicationcontext 就可以直接使用对应的实例了

// 测试类中使用@Autowired和@Qualifier注解来自动装配依赖关系
@Autowired
// @Qualifier("alpha_hibernate")用于指定要注入的alphaDao的Bean名称为"alpha_hibernate"
@Qualifier("alpha_hibernate")
private AlphaDao alphaDao;@Autowired
private AlphaService alphaService;

初识 SpringMVC

Http 请求

AlphaService.java 修改代码

添加一个 http 请求,并通过该请求获取指定参数

package com.zhiller.community.zhillercommunity.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;@Controller
@RequestMapping("/alpha")
public class AlphaController {/*** 处理映射到 "/alpha/http" 路径的请求* 打印请求的 HTTP 方法、请求头信息和请求参数* 设置响应内容类型为 text/html;charset=utf-8* 获取响应输出流并进行异常处理*/@RequestMapping("/http")public void http(HttpServletRequest request, HttpServletResponse response) {// 打印请求的 HTTP 方法System.out.println(request.getMethod());// 获取所有请求头的名称并打印Enumeration<String> enumeration = request.getHeaderNames();while (enumeration.hasMoreElements()) {String name = enumeration.nextElement();String value = request.getHeader(name);System.out.println(name + ":" + value);}// 打印请求参数 "code"System.out.println(request.getParameter("code"));// 设置响应内容类型为 text/html;charset=utf-8response.setContentType("text/html;charset=utf-8");try (PrintWriter writer = response.getWriter();){writer.write("<h1>zhiller labs</h1>");}catch(IOException e) {e.printStackTrace();}}
}

GET

package com.zhiller.community.zhillercommunity.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@RequestMapping("/alpha")
public class AlphaController {/*** 处理映射到 "/alpha/getage" 路径的 GET 请求* 接受名为 "age" 的请求参数,如果参数不存在则使用默认值 1* 打印参数值并返回字符串 "age"*/@GetMapping("/getage")@ResponseBodypublic String getAge(@RequestParam(name = "age", required = false, defaultValue = "1") int age) {System.out.println(age);return "age";}/*** 处理映射到 "/alpha/getid/{id}" 路径的 GET 请求* 接受路径变量 "id"* 打印路径变量值并返回字符串 "get the id"*/@GetMapping("/getid/{id}")@ResponseBodypublic String getId(@PathVariable("id") int id) {System.out.println(id);return "get the id";}
}

POST

随便写一个登录页面,存放位置:resource/static/html/student.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>oh my god</title></head><body><div class="main">look this big shit!!!</div><!-- 要注意这里的请求方法为POST,请求url要和springboot里面定义的一致 --><formmethod="post"action="/alpha/student"><p>姓名:<inputtype="text"name="name"placeholder="请输入您的姓名"/></p><p>密码:<inputtype="password"name="pwd"placeholder="******"/></p><p><inputtype="submit"value="保存"/></p></form></body>
</html><style>.main {font-size: large;font-weight: bold;}
</style>

然后就是我们的 controller 方法了

@PostMapping("/student")
public void postStudent(String name, String password) {System.out.println(name);System.out.println(password);return;
}

HTML 渲染

thymeleaf 的作用是帮助我们后端渲染简单的前端界面

但是很明显,在现在前后端分类的大趋势下,这玩意就和当年的 JSP 一样没有前景

建议不学


响应 JSON 数据

package com.zhiller.community.zhillercommunity.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;@Controller
@RequestMapping("/alpha")
public class AlphaController {/*** 处理映射到 "/alpha/emp" 路径的 GET 请求* 返回一个包含员工信息的 Map 对象*/@GetMapping("/emp")@ResponseBodypublic Map<String, Object> getEmp() {// 创建一个 Map 对象用于存储员工信息Map<String, Object> map = new HashMap<>();map.put("name", "张三");map.put("age", 123);return map;}
}

相关文章:

【Java项目实战】牛客网论坛项目1 - Spring入门与初识SpringMVC

目录 Spring 入门SpringInitializrApplicationContextAwareControllerDAODAO 名称索引ServiceConfig自动装配 初识 SpringMVCHttp 请求GETPOSTHTML 渲染响应 JSON 数据 Spring 入门 SpringInitializr IDEA 专业版自带的功能&#xff0c;也可以直接搜索对应网站&#xff0c;通…...

Gurobi使用(一)——操作指南(转自知乎)

好像还是要学一下Gurobi如何使用的&#xff0c;不然这代码着实有点抽象了 一、入门操作 一般来说&#xff0c;求解一个数学规划模型的时候&#xff0c;通常会按照如下步骤解决问题: 设置变量---addVar()。 更新变量空间---update()。 设定目标函数---setObjective()。 设定约…...

计算机网络的故事——简单的HTTP协议

简单的HTTP协议 文章目录 简单的HTTP协议一、简单的HTTP协议 一、简单的HTTP协议 HTTP是不保存状态的协议&#xff0c;为了实现保存状态功能于是引入了Cookie技术。 method: get:获取资源 post:传输实体主体 put:传输文件 head:获取报文首部&#xff0c;用于确认URI的有效性以…...

新能源商用车软件开发设计规范

目 录 前 言.............................................................................................................. 1 1 范围............................................................................................................... 2 2 规范性…...

Json“牵手”当当网商品详情数据方法,当当商品详情API接口,当当API申请指南

当当网是知名的综合性网上购物商城&#xff0c;由国内著名出版机构科文公司、美国老虎基金、美国IDG集团、卢森堡剑桥集团、亚洲创业投资基金&#xff08;原名软银中国创业基金&#xff09;共同投资成立1。 当当网从1999年11月正式开通&#xff0c;已从早期的网上卖书拓展到网…...

lazarus开发界面程序用线程显示进度条

lazarus开发界面程序用线程显示进度条&#xff0c;效果更好&#xff0c;以前没有另外显示线程&#xff0c;遇到上传文件或其他较长时间操作&#xff0c;界面就卡在那里&#xff0c;体验不好&#xff0c;现在另外启动线程操作&#xff0c;主界面就不至于卡在那里。 首先在主界面…...

解决VSCode下载速度特别慢的问题

一、下载VSCode 1.打开VSCode官网 https://code.visualstudio.com 2.download下载 3.下载特别慢 二、解决VSCode下载速度特别慢 1.单击右下角全部显示 我是用chrome浏览器&#xff0c;点击右下角的全部显示按钮&#xff0c;可以跳转到下载内容页面。 如果你是用其他浏览器…...

国家矿山安全监察局关于露天矿山边坡监测系统建设及预警响应要求

矿山是人类社会发展的物资基础&#xff0c;也是国民经济的重要组成部分。随着我国经济的快速增长&#xff0c;矿山开发步伐加快&#xff0c;使得边坡问题日益严重&#xff0c;影响了矿山的安全生产。为有效防范遏制矿山重特大事故发生&#xff0c;国家矿山安全监察局在8月30日发…...

前端使用elementui开发后台管理系统的常用功能(持续更新)

前言&#xff1a;本次的文章完全是自己开发中遇到的一些问题&#xff0c;经过不断的修改终于完成的一些功能&#xff0c;当个快捷的查看手册吧~ elementui开发后台管理系统常用功能 高级筛选的封装elementui的表格elementui的表格实现跨页多选回显elementui的表单elementui的日…...

中东 Shopify 如何使用 Bytebase 构建一站式数据库开发工作流

公司简介 Salla 是一家 2016 年成立&#xff0c;位于沙特麦加的自建站电商平台。 作为中东 Shopify&#xff0c;其最大的特点是支持阿拉伯语建站&#xff0c;并且提供更多适应中东地区特点的本地化服务。截止目前&#xff0c;已有 47,000 家店铺入驻 Salla&#xff0c;商品销售…...

谷歌Chrome庆祝15周年,推出全新设计!了解最新信息!

谷歌浏览器本月将满15岁&#xff0c;为了纪念这一时刻&#xff0c;它正在进行改造和升级。 这一点意义重大&#xff0c;因为Chrome在全球有数十亿人使用&#xff0c;因此谷歌所做的每一项改变都会对互联网以及这些人与互联网的互动方式产生巨大影响。即使你不使用Chrome或不关…...

解决Oracle SQL语句性能问题——SQL语句改写(分析函数、with as、union及or)

1. 正确使用分析函数 分析函数最早出现于Oracle 8i版本中,并在后续版本中不断得以增强。正确的使用分析函数,不但能非常方便的实现某些功能,而且,在某些场景中,还可以大幅提升SQL语句的性能。因此,为了简化应用实现逻辑或解决相关SQL语句性能问题,有时我们需要利用分析…...

Linux之SELinux

目录 概述 定义 作用 SELinux与传统的权限区别 SELinux工作原理 名词解释 主体&#xff08;Subject&#xff09; 目标&#xff08;Object&#xff09; 策略&#xff08;Policy&#xff09; 安全上下文&#xff08;Security Context&#xff09; 文件安全上下文查看 …...

Acwing算法心得——街灯(差分)

大家好&#xff0c;我是晴天学长&#xff0c;差分广泛用于一段范围的加减运算&#xff0c;可以优化时间复杂度&#xff0c;需要的小伙伴请自取哦&#xff01;如果觉得写的不错的话&#xff0c;可以点个关注哦&#xff0c;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1…...

streamlit执行报错WARNING,重新安装碰到问题如何解决

streamlit执行报错WARNING&#xff0c;重新安装碰到问题如何解决 如何解决1、卸载已经安装的程序2、再次安装程序3、出现如下yinstaller 警告问题&#xff1a;4、又出现“which is not on PATH”警告。5、解决方案 发现在安装的时候有很多WARNING出现&#xff0c;但是没有但回事…...

《C++设计模式》——行为型

前言 行为型模式是对在不同的对象之间划分责任和算法的抽象化。行为型模式不仅仅关注类和对象的结构&#xff0c;而且重点关注它们之间的相互作用。 Interpreter(解释器) Template Method(模板方法) GOOD&#xff1a;把不变的代码部分都转移到父类中&#xff0c;将可变的代…...

什么是原生IP?原生IP与住宅IP有何区别?

相信许多做跨境的都会接触到IP代理&#xff0c;比如电商平台、社媒平台、收款平台等等&#xff0c;都会检测IP。那也会经常听到一些词汇&#xff1a;原生IP、住宅IP&#xff0c;这两者之间有什么区别呢&#xff1f;什么业务需要用到呢&#xff1f;接下来带大家具体了解一下。 什…...

element-plus 表格-自定义样式实现

效果如下 代码如下 <template><h2>表格自定义样式</h2><div style"background-color: cadetblue; height: 600px;"><div class"regulaContainer"><el-table ref"tableRef" :data"tableData" border …...

MVCC

MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是数据库管理系统&#xff08;DBMS&#xff09;中的一种技术&#xff0c;用于管理并发访问数据&#xff0c;允许多个事务同时进行而不互相干扰&#xff0c;同时保持数据的一致性。 MVCC 的工作原理如下&#xf…...

你不知道的JavaScript---对象

1.语法 对象可以通过两种方式定义&#xff1a;一种是对象字面量形式&#xff0c;一种是构造形式 对象字面量&#xff1a; var muObject {key: value }构造形式的&#xff1a; var myObject new Object() myObject.key value不管是使用对象字面量形式还是构造形式创建出来…...

RePKG全解析:从资源提取到壁纸开发的终极解决方案

RePKG全解析&#xff1a;从资源提取到壁纸开发的终极解决方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 在数字内容创作领域&#xff0c;尤其是动态壁纸开发和游戏资源处理中&…...

OrangepiZERO3驱动USB摄像头的记录

关于orangepiZERO3的官方文档&#xff1a; http://www.orangepi.cn/orangepiwiki/index.php/Orange_Pi_Zero_3 按照里面有关的步骤进行操作&#xff0c;但是可能会有一点小问题&#xff0c;特此记录一下 第一步和第二步一致&#xff0c;不多说。 第三步&#xff1a; 我的命令…...

OpenClaw健康监测:用Phi-3-mini-128k-instruct分析智能手表数据

OpenClaw健康监测&#xff1a;用Phi-3-mini-128k-instruct分析智能手表数据 1. 为什么选择OpenClaw处理健康数据&#xff1f; 去年体检报告上的几项异常指标让我开始关注日常健康监测。虽然手环和智能手表能记录睡眠、心率等数据&#xff0c;但原始数据报表就像一本天书——我…...

别再死记硬背了!用C++手把手带你图解哈夫曼树构建全过程(附完整可运行代码)

从零开始&#xff1a;用C动态图解哈夫曼树构建与编码实现 哈夫曼树&#xff08;Huffman Tree&#xff09;是数据结构中一种经典的贪心算法应用&#xff0c;广泛用于数据压缩领域。对于初学者来说&#xff0c;理解其构建过程往往比单纯记忆代码更有价值。本文将用C结合动态图示的…...

短视频 SEO 推广与视频广告投放的区别是什么_短视频 SEO 优化需要结合网站整体 SEO 策略吗

短视频 SEO 推广与视频广告投放的区别是什么_短视频 SEO 优化需要结合网站整体 SEO 策略吗 在当前数字化营销的浪潮中&#xff0c;短视频平台和视频广告投放已经成为许多企业和创作者推广内容、吸引观众的重要手段。对于SEO策略的理解和应用却常常存在误解。今天&#xff0c;我…...

Pixel Aurora Engine基础教程:Streamlit状态管理与多会话隔离机制

Pixel Aurora Engine基础教程&#xff1a;Streamlit状态管理与多会话隔离机制 1. 认识Pixel Aurora Engine Pixel Aurora是一款基于AI扩散模型的高端绘图工作站&#xff0c;采用独特的复古像素游戏风格界面。这款"虚拟游戏机"能将文字描述转化为极具视觉冲击力的像…...

OpenClaw安全指南:千问3.5-27B本地化执行权限管控

OpenClaw安全指南&#xff1a;千问3.5-27B本地化执行权限管控 1. 为什么需要OpenClaw安全管控&#xff1f; 去年冬天的一个深夜&#xff0c;我被一阵急促的键盘敲击声惊醒。走进书房时&#xff0c;发现OpenClaw正在自动执行我三天前测试的爬虫脚本——由于没有设置运行时间限…...

新手福音:在快马平台用自然语言生成你的第一个powershell脚本

今天想和大家分享一个特别适合 PowerShell 新手的入门实践。作为一个从零开始学习 PowerShell 的菜鸟&#xff0c;我发现用自然语言描述需求就能生成可运行的脚本&#xff0c;这个体验真的太友好了。 变量定义与数据结构 刚开始学习时&#xff0c;最基础的就是理解变量和数据结…...

嵌入式开发中数据结构的优化与应用实践

1. 数据结构在嵌入式开发中的核心价值作为一名在嵌入式领域摸爬滚打十年的老兵&#xff0c;我深刻体会到数据结构就像瑞士军刀里的各种工具——选对工具能让工作事半功倍。在资源受限的MCU环境中&#xff0c;一个精心选择的数据结构可能意味着程序能否流畅运行和内存是否会爆掉…...

GLM-4.1V-9B-Base应用场景:零售货架图像识别与SKU自动盘点方案

GLM-4.1V-9B-Base应用场景&#xff1a;零售货架图像识别与SKU自动盘点方案 1. 零售行业面临的库存管理挑战 走进任何一家超市或便利店&#xff0c;你都会看到整齐排列的商品货架。但你可能不知道的是&#xff0c;这些看似简单的货架背后隐藏着一个巨大的管理难题 - 库存盘点。…...