ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

JAVA基础学习,记录===自用。关于html资源位置,controller,页面跳转,以及一些注解用法

JAVA基础学习,记录===自用。关于html资源位置,controller,页面跳转,以及一些注解用法 一关于html以及css等页面资源在标准的 Java Web 项目中HTML、CSS、JavaScript 等静态页面资源的存放位置取决于你使用的项目框架和构建工具。以下是几种最常见的情况1. Spring Boot 项目目前最主流在 Spring Boot 项目中静态资源默认存放在src/main/resources/目录下的static文件夹中。my-spring-boot-project/ ├── src/ │ ├── main/ │ │ ├── java/ # Java 代码 (如 Controller) │ │ └── resources/ │ │ ├── static/ # 静态资源存放处 (HTML, CSS, JS, 图片等) │ │ │ ├── css/ │ │ │ ├── js/ │ │ │ └── index.html │ │ ├── templates/ # 动态模板文件 (Thymeleaf, FreeMarker 等) │ │ └── application.yml # 配置文件 │ └── test/ └── pom.xml访问规则放在static下的资源可以直接通过根路径访问。例如static/css/style.css可以通过http://localhost:8080/css/style.css访问。补充Spring Boot 默认还会识别resources/META-INF/resources/、resources/resources/和resources/public/这几个目录作为静态资源路径但static是最常用和推荐的。2. 传统的 Spring MVC 项目非 Boot如使用 web.xml 配置在传统的 WAR 包项目中静态资源通常存放在src/main/webapp/目录下。my-traditional-project/ ├── src/ │ ├── main/ │ │ ├── java/ # Java 代码 │ │ └── webapp/ # Web 资源根目录 │ │ ├── WEB-INF/ # 安全目录 (外部无法直接访问, 存放 web.xml, jsp 等) │ │ ├── css/ │ │ ├── js/ │ │ └── index.html │ └── test/ └── pom.xml3. 前后端分离项目如果你的项目是前后端分离的后端只提供 API 接口前端使用 Vue/React/Angular 等框架那么前端项目包含 HTML、CSS、JS通常是一个完全独立的项目文件夹不放在 Java 后端的resources目录下。前端开发完成后会经过打包构建如 Webpack/Vite生成纯静态文件dist文件夹这些打包后的文件如果需要由后端托管才会被复制到后端项目的src/main/resources/static/中。 常见问题与注意事项不要把 HTML 放在templates里当静态页面用resources/templates/目录是留给模板引擎如 Thymeleaf、FreeMarker的。这里的文件通常包含动态语法如${user.name}不能直接通过 URL 访问必须通过 Controller 渲染后才能返回。纯静态的 HTML 请放在static中。拦截器/过滤器拦截问题如果你在 Spring Boot 中配置了全局拦截器Interceptor或过滤器Filter很容易误把静态资源也拦截掉导致页面加载 404 或 CSS/JS 失效。在配置拦截路径时通常需要排除静态资源的后缀如/css/**,/js/**。自定义静态资源路径如果你不想用默认的static文件夹可以在application.yml中自定义spring: web: resources: static-locations: classpath:/my-custom-folder/二关于controller直接跳转在 Spring MVC / Spring Boot 中如果要从 Controller 直接跳转到页面你需要配合模板引擎如 Thymeleaf、FreeMarker 等来渲染页面。以下是具体的注解和返回类型说明1. 方法上需要写什么注解不需要特殊的注解只要你的类上加了Controller注解那么方法默认的返回值就会被视图解析器当作页面路径来处理。(⚠️注意千万不要在类或方法上用RestController或ResponseBody这会让返回值直接变成 JSON 数据而不是跳转页面。类上Controller方法上ResponseBody类上加RestController)2. 返回什么类型的数据通常有两种选择方式一返回String类型最常用返回的字符串代表视图的逻辑名称即页面的文件名Spring 会自动去resources/templates/目录下寻找对应的 HTML 文件。import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; Controller // 注意这里用 Controller public class PageController { // 访问 http://localhost:8080/index 时 RequestMapping(/index) public String toIndex() { // 返回 indexSpring 会自动去找 resources/templates/index.html return index; } // 如果页面在子目录下比如 resources/templates/user/profile.html RequestMapping(/profile) public String toProfile() { return user/profile; // 使用 / 分隔目录 } }方式二返回ModelAndView类型如果你既想跳转页面又想往页面传递数据使用ModelAndView是最直观的方式。它包含了页面路径和模型数据。import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; Controller public class PageController { RequestMapping(/welcome) public ModelAndView toWelcome() { ModelAndView mv new ModelAndView(); // 1. 设置要跳转的页面名称 (对应 resources/templates/welcome.html) mv.setViewName(welcome); // 2. 设置要传递给页面的数据 (键值对) mv.addObject(msg, 你好欢迎访问本系统); return mv; } } 进阶技巧传递数据的更简洁写法在实际开发中更推荐使用String作为返回值配合Model参数来传数据代码更简洁import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.ui.Model; Controller public class PageController { RequestMapping(/home) public String toHome(Model model) { // 往 Model 里存数据页面可以通过 ${username} 获取 model.addAttribute(username, CodeGeeX); // 返回页面路径 return home; } } 重要注意事项新手必看必须引入模板引擎依赖直接返回 String 跳转页面的前提是你的项目中必须有模板引擎通常是 Thymeleaf。如果没有Spring 找不到页面会报错。在pom.xml中需要添加dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-thymeleaf/artifactId /dependency页面存放位置这种跳转方式HTML 文件必须放在src/main/resources/templates/目录下不能放在static/下。static下的静态页面不需要经过 Controller 跳转直接通过浏览器地址栏即可访问。重定向如果你不想走模板引擎渲染而是想重定向到另一个 URL比如重定向到另一个接口或外部网站可以在返回的字符串前加redirect:例如return redirect:/other-url;三关于跳转到static文件夹下的index.html静态页面跳转到static文件夹下的静态页面和跳转到templates下的动态页面逻辑不同。因为static下的资源不需要经过模板引擎解析Spring Boot 默认也不允许直接通过返回视图名来访问static下的 HTML。你有两种常见的方式来实现这个跳转方式一使用重定向推荐这是最标准、最符合 Web 规范的做法。当用户访问 Controller 的接口时服务器告诉浏览器“请你重新去请求那个静态资源的路径”浏览器就会自动跳转到index.html。实现方式在返回的字符串前加上redirect:前缀。import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; Controller public class TestController { RequestMapping(/toIndex) public String toIndex() { // 告诉浏览器重定向到根路径下的 index.html // 因为 static 下的资源默认映射路径是项目根路径 return redirect:/index.html; } }原理解释用户访问/toIndex- 服务器返回 302 重定向状态码和/index.html地址 - 浏览器自动发起对/index.html的请求 - Spring Boot 从static文件夹返回该文件。方式二使用请求转发如果你不想让浏览器的地址栏发生变化即浏览器地址栏还停留在/toIndex但页面已经展示了index.html的内容可以使用请求转发。实现方式在返回的字符串前加上forward:前缀。import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; Controller public class TestController { RequestMapping(/toIndex) public String toIndex() { // 在服务器内部将请求转发给 /index.html 处理 return forward:/index.html; } }⚠️ 新手避坑指南非常重要路径必须带前缀/无论是redirect还是forward后面的路径必须以/开头redirect:/index.html是对的redirect:index.html是错的否则 Spring 会把它当作相对于当前接口路径的相对路径导致 404。不要省略.html后缀跳转到templates时我们返回index是因为模板引擎会自动补全后缀如.html。但static下的资源是纯静态的必须写全文件名index.html。子目录问题如果你的index.html放在static的子目录下比如static/pages/index.html那么重定向路径需要对应加上目录return redirect:/pages/index.html;。总结绝大多数情况下跳转static下的页面使用redirect:/index.html就可以了。四ResponseBody和RequestBody的含义和作用这两个注解是 Spring MVC 中处理 HTTP 请求与响应数据的灵魂注解。它们的作用刚好相反简单来说RequestBody接收请求中的数据将 JSON 数据转为 Java 对象。ResponseBody返回数据给前端将 Java 对象转为 JSON 数据。1.RequestBody(请求体)含义获取 HTTP 请求体中的数据并将其转换为你指定的 Java 对象。作用在前后端分离的开发中前端如 Vue、React向后端发送数据时通常会把数据序列化成JSON 格式放在 HTTP 请求的 Body 中发送过来。RequestBody的作用就是接住这个 JSON 串并自动映射反序列化到你定义的 Java Bean 属性上。代码示例PostMapping(/users) public String addUser(RequestBody User user) { // 前端传来的 JSON 数据会自动封装到 user 对象中 System.out.println(user.getName()); System.out.println(user.getAge()); return 添加成功; }前端发送的请求类似这样// POST 请求Body 中携带 JSON 数据且 Header 中 Content-Type 为 application/json { name: CodeGeeX, age: 3 }⚠️ 注意事项它只能用在方法参数上。一个请求方法中最多只能有一个RequestBody因为一个 HTTP 请求只有一个 Body。前端发送请求时必须设置请求头Content-Type: application/json否则后端无法解析。2.ResponseBody(响应体)含义将方法的返回值直接作为 HTTP 响应体的内容返回给客户端而不是跳转到页面。作用默认情况下Controller 方法的返回值是“视图名称”用来跳转 HTML 页面的。如果在方法上加了ResponseBodySpring 就知道你不想跳转页面而是想把返回的 Java 对象如实体类、List、Map 等转换成JSON 格式或 XML直接写给前端。代码示例GetMapping(/users/{id}) ResponseBody // 告诉 Spring不要找页面把 user 对象转成 JSON 返回 public User getUserById(PathVariable Integer id) { User user userService.findById(id); return user; // 返回的是 Java 对象但前端收到的是 JSON 字符串 }{ id: 1, name: CodeGeeX, age: 3 }进阶用法RestController如果一个 Controller 里面的所有方法都是返回数据而不是跳转页面在每个方法上都加ResponseBody太麻烦了。所以 Spring 提供了RestController注解它是ControllerResponseBody的组合注解。上面说controller时提到过。RestController // 类上加了它下面的所有方法都默认带有 ResponseBody public class ApiController { GetMapping(/test) public User test() { return new User(CodeGeeX, 3); // 直接返回对象 } }总结对比特性RequestBodyResponseBody数据流向前端 ➡️ 后端 (接收请求)后端 ➡️ 前端 (发送响应)作用位置方法的参数前方法的返回值前 (或类上)核心转换JSON 字符串 ➡️ Java 对象Java 对象 ➡️ JSON 字符串应用场景前端提交复杂表单数据、JSON 数据前后端分离架构下的 API 接口开发五Resource和Autowired的微小差异ResourceJDK 提供默认先按名称匹配如果找不到再按类型匹配。AutowiredSpring 提供默认先按类型匹配。如果同一类型有多个实现需要配合Qualifier按名称指定。
返回列表