- 之前说过,SpringMVC中使用两个WebApplicationContext:ServletWebApplicationContext和RootWebApplicationContext对Web上下文环境进行分层管理。
- ServletWebApplicationContext:用于管理Servlet相关的Bean,如控制器,视图解析器等,每个Servlet(通常是DispatcherServlet)都有自己的ServletWebApplicationContext;并且Scope与Servlet相对应
- RootWebApplicationContext:是整个Web应用的上下文,用于管理应用程序级别的Bean,如Service,Repositories等,RootWebApplicationContext可以被多个Servlet共享,且Scope与整个Web应用相同。
![SpringMVC](https://img-blog.csdnimg.cn/direct/902aa259656348c2ab26bd6656e2408d.png#pic_center)
配置ServletWebApplicationContext
- 上文提到过每个DispatcherServlet都有一个ServletWebApplicationContext用于存储Servlet的相关Bean,因此我们需要扫描Controller注解标记的Bean
- @EnableWebMvc:值得注意的是,这里还需要Spring MVC开启基于注解的基础功能以及一些默认配置。
- 通过此注解SpringMVC会自动注册包括DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter等用于处理注解映射和处理方法的适配器。
- 并且允许在Controller标记类的类和方法上使用@RequestMapping,@RequestParam等HTTP请求与响应方面的注解驱动
如果你发现RequestParam没法使用的话可以查看是否开启了此注解
- 而且此注解还提供了一些常见的用于处理请求参数的类型转换,如字符串转数字,json格式之间的转换等
@Configuration
@ComponentScan({"com.nobugnolife.controller"})
@EnableWebMvc
public class SpringMvcConfig {
}
配置RootWebApplicationContext
- 上文说过RootWebApplicationContext里面是Web用于管理应用程序级别的Bean,如Service,Repositories等,而我们这里只是演示SpringMVC的功能,所以就不配置持久层了
@Configuration
@ComponentScan({"com.nobugnolife.service"})
public class SpringConfig {
}
配置ServletContext
- Spring提供了WebApplicationInitializer接口可以让我们注册并初始化DispatcherServlet
public class MyWebApplicationInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
// 加载ServletWebApplicationContext配置信息
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
// 注册SpringMVC的配置类
context.register(SpringMvcConfig.class);
// 创建并注册DispatcherServlet
DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
registration.setLoadOnStartup(1);
registration.addMapping("/");
}
}
- 官方文档里提供了一个简化的创建方案通过继承 AbstractAnnotationConfigDispatcherServletInitializer 并覆写特定的方法,用以简化配置开发
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
/\*
\* 过滤器
\* \*/
}
创建Controller控制器
- 在控制层Controller中我们需要运用到如下这些注解:
- @Controller:Controller Bean注解,用于标记controller中的类
- @RequestMapping:在之前的文章中说过SpringMVC对用户发出的请求会有HandlerMapping解析路由选择对应处理器进行处理,因此我们在创建处理器Controller的时候也需要提供处理器对应的URL路径,通过 @RequestMapping,如果不提供默认为当前上下文的根路径
- @PostMapping:@RequestMapping(value=“”, method = ReuqestMethod.POST)简化写法
- @PutMapping:@RequestMapping(value=“”, method = ReuqestMethod.PUT)简化写法
- @DeleteMapping:@RequestMapping(value=“”, method = ReuqestMethod.DELETE)简化写法
- @GetMapping:@RequestMapping(value=“”, method = ReuqestMethod.GET)简化写法
- @RequestParam:通过路径传参,允许接受用户从URL路径中传入的参数,并写入到形参中如:https://www.baidu.com/search?context=csdn,那么这里传入了个参数名为context,内容为csdn的信息,并且在SpringMVC中会自动转化成形参类型
- @RequestBody:通过请求体传参,允许接受用户将信息写入请求体中,可以避免直接从URL中暴露参数信息,但一般接收的时候会通过post方式进行接收
- @PathVariable:URL模板变量,属于简化了URL路径传参的方式,允许用户通过URL路径解析的格式将参数动态传入,但需要指明传入参数的位置如:https://www.baidu.com/search/{context},这里用户传入参数只需要在search/csdn,SpringMVC会自动将{context}路径对应的csdn解析到context参数中
- @ResponseBody:将返回数据直接作为响应参数进行返回,之前文章说过,在SpringMVC中,DispatcherServlet会将我们最终处理完的数据注入到视图模型中并返回给用户,因此正常来说Controller的返回数据会被当成URL路径解析,而如果我们不想返回视图,只想返回我们的处理数据的话则需要用到这个注解
- @RestController:将@ResponseBody与@Controller进行合并,用于简化开发代码
配置Controller响应路径
- 通过@RequestMapping配置URL的解析路径(从SpringMCV的ServletContext配置的根路径开始解析),@RequestMapping可以作用到类上(作用到类上代表当前Controller类中所有的方法都会通过此路径),也可以作用到方法上(方法上的路径会自动配置到类的路径后边)
- 比如这里我们配置一个WebController,通过访问/index/hello资源路径让服务器返回跳转到index.jsp
@Controller
@RequestMapping("/index")
public class WebController {
/\*
\* 如果没有添加RequestBody则会把返回字符串当成路径访问服务器文件
\* \*/
@RequestMapping("/hello")
public String toIndex(){
System.out.println("跳转到index.jsp");
return "index.jsp";
}
}
接收用户传递参数
接收JSON数据
- JSON是一种轻量级的数据交换格式,基于JavaScript语法的子集,但如今是可独立于JavaScript使用,通常用于Web应用程序中的数据交换和存储,包括Restful中的数据传输,Ajax请求的数据格式,配置文件等,因为其简洁性和可读性,也被广泛用于日志,数据序列化等领域
- 简洁性:JSON使用简洁的文本格式表示数据
- 可读性:JSON数据格式有良好的可读性,易于被理解
- 自我描述性:JSON支持多种数据类型,包括数字,字符串,数组,对象等,可以表示丰富的数据结构
- 易于解析:JSON数据可以通过大多数编程语言的解析器轻松解析为内部数据结构
- JSON的数据由键值对组成,其中键(Key)为字符串,值(Value)为表示的数据,一个完整的JSON对象使用
{}
表示,键值对之间使用:
分割,JSON中数组使用[]
表示,不同元素之间使用,
分割,以下为JSON的简单示例:
{
"name": "John",
"age": 30,
"isStudent": false,
"friends": ["Alice", "Bob", "Charlie"],
"address": {
"city": "New York",
"zipcode": "10001"
}
}
- 在SpingMVC中要想接收JSON数,官方文档给出Spring提供支持Jackson Json的依赖但是功能比较简单,不具备Jackson库提供的一些高级特性,同样SpringMVC也可以使用其他JSON转化库如:
- Gson:Goolge提供的JSON转化,功能齐全,转化方便
- FastJson:阿里提供的高性能JSON转化,转化非常快,
但转化复杂类型的对象容易出错,可以用Gson将Bean转为Json保证数据正确,用FastJson将Json转Bean提高性能
- Jackson Json:Jackson是一个成熟的,广泛使用的JSON处理库,其中提供了丰富的功能机制,也支持各种高级特性,在性能上处理大量JSON数据格式会比Gson更快,在支持性与功能性上又比FastJson更多
- 这里我们导入Jackson库
<properties>
<jackson.version>2.15.2</jackson.version>
</properties>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
- SpringMVC使用@RequestBody会自动将传入的Json数据转化成对象,并且会对有@ResponseBody的方法返回值自动转化成Json数据返回
@Data
public class Product {
private String productName;
private Integer productId;
private Double value;
}
@PostMapping
public String addProduct(@RequestBody Product product) {
System.out.println("请求访问商品添加接口,当前商品信息为:" + product);
return "商品信息添加成功";
}
- 测试数据
![test_json](https://img-blog.csdnimg.cn/direct/b9a369e746884beeb6f9c10477177998.png#pic_left)
![test_json_result](https://img-blog.csdnimg.cn/direct/76e85f57e8a347fea1810e938023e4f9.png#pic_left)
接收简单类型
- 对于从URL传入的参数,SpringMVC能自动传入到对应的参数名中同时也可以使用@RequestParam对传入的参数名与形参名进行映射
@RequestMapping("/login")
@ResponseBody
public String userLogin(@RequestParam("username") String username, String password) {
if (Objects.equals(password, "123")) {
System.out.println(username + "登录成功");
}else {
System.out.println("用户密码错误");
}
return username;
}
- 测试输出
![attribute](https://img-blog.csdnimg.cn/direct/4c9ccfaa57844a77963775aa1ffca02b.png#pic_left)
![arrtribute_test](https://img-blog.csdnimg.cn/direct/46967d2d7f214662a4782f6b38a7db1d.png#pic_left)
对象封装参数
- SpringMVC同时也支持将多个参数封装进类中(需类提供set方法),并将传入数据自动配置到类的属性中
@RequestMapping("/account/login")
@ResponseBody
public String accountLogin(Account account){
System.out.println(account.getUserName()+
"\n用户密码:"+account.getPassword());
return "登录成功";
}
- 测试输出
![object](https://img-blog.csdnimg.cn/direct/ee7d290e0c0642ce9fea53ff98d1e545.png#pic_left)
![object_test](https://img-blog.csdnimg.cn/direct/b3b9c89f4204409d88e50183f18c5006.png#pic_left)
接收数组类型
- 数组类型发送方式为:参数1=xxx&参数1=xxx参数1=xxx,SpringMVC会自动将参数1的数据转化为参数1数组中,数组可以是List也可以是数组[]
@RequestMapping("/cart")
@ResponseBody
public String addToCart(@RequestParam List<Integer> productIds){
System.out.println(productIds);
return productIds.toString();
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/d59ba9b76f0bc5452444296889d98cea.png)
![img](https://img-blog.csdnimg.cn/img_convert/f82f6b26aeae5c81f92460bc7f9ad326.png)
![img](https://img-blog.csdnimg.cn/img_convert/7da8d66abc9e178e604868c70fa1a3db.png)
![img](https://img-blog.csdnimg.cn/img_convert/83b6436e0b9350d60e6a6f2e6c0e3dc3.png)
![img](https://img-blog.csdnimg.cn/img_convert/a923eaa542b9bdaa70ac52e7ae553f48.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)**
![img](https://img-blog.csdnimg.cn/img_convert/83baffa0470db5cacc842fedfc64fce8.png)
-1712862838497)]
[外链图片转存中...(img-leZMOTwf-1712862838497)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)**
[外链图片转存中...(img-EboNM5d0-1712862838497)]