请求响应
handler作用总结:
- 接收请求参数:param、json、pathVariable、共享域等
- 调用业务逻辑
- 响应前端数据/页面:json、转发、重定向
handler如何处理:
- 接收参数:形参列表
- 调用业务:
- 响应数据:return object 解析 json 返回,return string 还可以返回模板页面
*web开发模式
在 Web 开发中,有两种主要的开发模式:前后端分离和混合开发。
前后端分离模式:
指将前端的界面和后端的业务逻辑通过接口分离开发的一种方式。开发人员使用不同的技术栈和框架,前端开发人员主要负责页面的呈现和用户交互,后端开发人员主要负责业务逻辑和数据存储。前后端通信通过 API 接口完成,数据格式一般使用 JSON 或 XML。前后端分离模式可以提高开发效率,同时也有助于代码重用和维护。
混合开发模式:
指将前端和后端的代码集成在同一个项目中,共享相同的技术栈和框架。这种模式在小型项目中比较常见,可以减少学习成本和部署难度。但是,在大型项目中,这种模式会导致代码耦合性很高,维护和升级难度较大。
SpringMVC 视图解析器
SpringMVC 提供了可选的视图解析器,用以在web容器内简化资源路径,视图解析器可以配置前缀和后缀,当handler返回String且没有@ResponseBody注解时,将返回的string(称为逻辑视图)交给视图解析器查找对应的视图页面,再将请求转发给视图页面。
使用SpringMVC配置类配置视图解析器 ViewResolver:
@Configuration
@EnableWebMvc
@ComponentScan("com.guitar.mvc.*")
public class SpringMvcConfig implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// 注册视图解析器,在容器内寻找 prefix + 逻辑视图 + suffix
// 简单的字符串拼接,不会检验 / 和 .
registry.jsp("/WEB-INF/views/",".jsp");
}
}返回逻辑视图
逻辑视图:即没有@ResponseBody注解的handler返回的string。这个string会交给视图解析器查找视图并将请求转发。
// registry.jsp("/WEB-INF/views/",".jsp");
@RequestMapping("logic")
public String logicView(HttpServletRequest request){
request.setAttribute("data","logic view");
System.out.println("ResponseController.logicView");
return "show";
}
// 视图解析器查找 /WEB-INF/views/show.jsp 视图,再由handlerAdapter将请求转发。转发jsp——返回模板页面
JSP(全称Java Server Pages,基于Java语言实现的服务器端的页面)是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。
jsp 常用来编写模板页面作数据展示。
- 转发也可以转发给静态资源。
- 通常将要展示的数据存入请求域,再将请求转发给jsp实现数据展示。
SpringMVC 允许handler返回以 forward: 开头的字符串来绕过视图解析器实现请求转发。
return "forward:/WEB-INF/views/show.jsp";- 当返回逻辑视图时,相当于
forward: + prefix + 逻辑视图 + suffix。
重定向
和转发类似,SpringMVC 允许handler返回以 redirect: 开头的字符串进行重定向(302)。重定向可以是web容器外部的地址。
return "redirect:https://www.baidu.com";当重定向到容器内的地址时,使用原生 Servlet API 需要包含web上下文路径(request.getContextPath())。SpringMVC 会自动检测是否为web容器内部地址,如果是,则自动加上web上下文。故,SpringMVC 重定向也只需要提供web容器内的地址。
return "redirect:/outerShow.jsp";
// 302 /webContext/outerShow.jsp*WEB-INF目录
WEB-INF 目录是web容器规范要求的目录,这个目录只对web容器内部可见,不允许外部访问,故只能使用转发的方式将请求通过容器内部转发至 WEB-INF 目录(需要携带WEB-INF目录名),而不能重定向或外部访问。
返回JSON
SpringMVC 支持handler返回任意类型,当返回为string,可以视为逻辑视图,也可以视为响应内容(取决于有无@ResponseBody)。
对于handler返回的非String的其他对象类型,SpringMVC 可以通过JSON解析器将其解析为JSON格式的字符串,再作为响应内容返回。故,一般直接 return pojo;,剩下的交给 SpringMVC。
添加jackson依赖
使用@EnableWebMvc注解添加JSON解析器
添加@ResponseBody,返回pojo
添加 @CrossOrigin,启用跨域请求:Controller类上或handler方法上
@Controller @ResponseBody @CrossOrigin public class JsonController { @PostMapping("data") public User data1(@RequestBody User user){ System.out.println("user = " + user); return user; } }
对于
@Controller + @ResponseBody,SpringMVC 提供了复合注解@RestController,注解这是个 RESTful 风格的controller。RESTful 风格指导了前后端分离项目的请求设计,后端只响应数据,而不会返回模板页面/视图。
