springboot-web基础
21.web
spring MVC
基于浏览器的 B/S 结构应用十分流行。Spring Boot 非常适合 Web 应用开发。可以使用嵌入式 Tomcat、Jetty、 Undertow 或 Netty 创建一个自包含的 HTTP 服务器。一个 Spring Boot 的 Web 应用能够自己独立运行,不依赖需 要安装的 Tomcat,Jetty 等。
Spring Boot 可以创建两种类型的 Web 应用
-
基于 Servlet 体系的 Spring Web MVC 应用
-
使用 spring-boot-starter-webflux 模块来构建响应式,非阻塞的 Web 应用程序
Spring MVC 是“model view controller”的框架。专注 web 应用开发。我们快速的创建控制器(Controller),
接受来自浏览器或其他客户端的请求。并将业务代码的处理结果返回给请求方。
spring MVC 工作图
创建web应用
创建 Web 应用,Lession12-quick-web。 依赖选择 spring-web 包含了 Spring MVC , Restful, Tomcat 这些功能。 再选择 Thymeleaf(视图技术,代替 jsp),Lombok 依赖。
项目结构
html视图
- 创建控制器
package com.yanyu.demo1.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;import java.time.LocalDateTime;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/19 17:21* @description:* @Controller:创建控制器对象,控制器能够接收请求,响应结果给浏览器* * 控制器也叫做处理器*/
@Controllerpublic class Hello {
// 导入import org.springframework.ui.Model;@GetMapping("/hello")public String hello(Model model){
// 定义方法处理请求, 方法叫做控制器方法(处理器方法)//Model表示模型,存储数据。 这个数据最后是放在request作用域。//HttpServletRequest放在的作用域中
//数据存放到模型model.addAttribute("title","第一个请求");//model.addAttribute("date", LocalDateTime.now());//获取当前时间// 指定显示到 hello 视图,接下来创建 hello 视图return "hello";}}
- 创建视图
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>视图技术</title>
</head>
<body>
<!--取出 Model 中 存放的 资源model.addAttribute("info","第一个web全球");"info" 该资源在 Model 叫什么 "第一个web全球" : 资源model.addAttribute("date", LocalDate.now());-->
<!-- 取出 Model 中 资源的格式--><div style="margin-left: 300px"><div th:text="${title}"></div><div th:text="${date}"></div></div>
</body>
</html>
tomcat 8 bin 目录文件冲突
根据您提供的错误信息,问题的根本原因是尝试在 64 位平台上加载 32 位的 tcnative-1.dll
文件。这是一个典型的架构不匹配问题。以下是详细的解决方法:
java.lang.UnsatisfiedLinkError: D:\dev\apache-tomcat-8.5.100\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platformat java.base/jdk.internal.loader.NativeLibraries.load(Native Method) ~[na:na]at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:384) ~[na:na]at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:228) ~[na:na]at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:170) ~[na:na]at java.base/jdk.internal.loader.NativeLibraries.findFromPaths(NativeLibraries.java:311) ~[na:na]at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:283) ~[na:na]
- 确认系统架构
- 检查您的操作系统和 JVM 的架构。确保它们都是 64 位的。
- 在 Windows 上,可以通过“系统属性”查看系统架构。
- 在命令行中运行
java -version
,确认 JVM 是否为 64 位。
- 下载正确的
tcnative-1.dll
- 访问 Apache Tomcat Native Library 页面,下载与您的系统架构(64 位)匹配的
tcnative-1.dll
文件。 - 确保下载的版本与您的 Tomcat 版本兼容。
- 替换错误的
tcnative-1.dll
- 找到错误的
tcnative-1.dll
文件位置(根据错误信息,它位于D:\dev\apache-tomcat-8.5.100\bin\
)。 - 将下载的正确版本的
tcnative-1.dll
替换掉现有的文件。
- 检查环境变量
- 确保
PATH
环境变量中包含 Tomcat 的bin
目录。- 在 Windows 上,可以通过“系统属性”中的“环境变量”进行检查和修改。
- 验证依赖关系
- 使用工具(如 Dependency Walker)检查新的
tcnative-1.dll
文件是否依赖于其他 32 位的 DLL 文件。 - 如果存在依赖问题,确保所有依赖的 DLL 文件也替换为 64 位版本。
- 重启 Tomcat
- 替换文件后,重启 Tomcat 以确保更改生效。
- 其他注意事项
- 如果问题仍然存在,可以尝试将
tcnative-1.dll
文件放置在系统的其他标准库路径中(如%PATH%
或%JAVA_HOME%\bin
),并确保这些路径在java.library.path
中。 - 确保您的 JVM 和 Tomcat 都是 64 位版本,避免架构不匹配。
通过以上步骤,您应该能够解决 java.lang.UnsatisfiedLinkError
错误并成功运行 Tomcat。
JSON视图
自己写JSON
上面的例子以 Html 文件作为视图,可以编写复杂的交互的页面,CSS 美化数据。除了带有页面的数据,还 有一种只需要数据的视图。比如手机应用 app,app 的数据来自服务器应用处理结果。app 内的数据显示和服务器 无关,只需要数据就可以了。主流方式是服务器返回 json 格式数据给手机 app 应用。
我们可以通过原始的 HttpServletResponse 应该数据给请求方。 借助 Spring MVC 能够无感知的处理 json。
- 控制器
package com.yanyu.demo1.controller;import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import java.io.IOException;
import java.io.PrintWriter;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/19 18:07* @description:*/
@Controller
public class JSONController {@RequestMapping("/json")// 暂时先抛出响应异常public void responseTest(HttpServletResponse response) throws IOException {
// 准备 json 格式数据/** {* user:"",* age:"";* }** */String json = "{\"user\":\"yanyu\",\"age\":20}";
// 设置在浏览器的响应类型response.setContentType("application/json;charset=utf-8");
// 响应对象PrintWriter out = response.getWriter();out.print(json);
// 刷新管道out.flush();
// 关闭流out.close();}}
利用jackson转为json
SpringMVC支持控制器方法返回对象, 由框架将对象使用jackson转为json,并输出
User–Jackson工具库的ObjectMapper对象,—user转为json格式字符串–HttpServletResponse输出
接受请求的注解
@GetMapping:接收get请求 , 简化的@RequestMapping(method=RequestMethod.GET)
@PostMapping 接收post请求
@PutMapping: 接收put请求
@DeleteMapping:接收delete请求
- 准备映射实体
package com.yanyu.demo1.vo;import lombok.Data;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/19 18:25* @description:json 映射实体*/
//使用Lombok 简化 bean规范public class User {private String name;private Integer age;private String major;public User() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getMajor() {return major;}public void setMajor(String major) {this.major = major;}
}
package com.yanyu.demo1.controller;import com.yanyu.demo1.vo.User;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/19 18:28* @description:*/
@Controller
public class JacksonController {//设置请求方式 调用 Jackson 工具库@RequestMapping("/jackson")@ResponseBody
// 自动将 对象 转为 jsonpublic User getJsonUser(){User user = new User();user.setAge(20);user.setName("yanyu666");user.setMajor("软件技术");return user;}}
加 favicon图标
我们自己的网站定制 logo。首先找一个在线工具创建 favicon.ico。比如
https://quanxin.org/favicon
图片生成我们需要的内容。生成的 logo 文件名称是 favicon.ico
step1:将生成的 favicon.ico 拷贝项目的 resources/ 或 resources/static/ 目录。
step2:在你的视图文件,加入对 favicon.ico 的引用。
在视图的
<head>部分加入 <link rel="icon" href="../favicon.ico" type="image/x-icon"/>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8">
<!-- 添加自己定制的图标--><link rel="shortcut icon" href="../favicon_32x32.ico" type="image/x-icon"><title>视图技术</title>
</head>
<body><div style="margin-left: 300px"><div th:text="${title}"></div><div th:text="${date}"></div></div>
</body>
</html>