<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 做web项目的包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.22</version>
</dependency>
</dependencies>
### 3.写主启动类Main.java文件@SpringBootApplication
要点:
* 是spingMvc的配置类:@SpringBootApplication;
* 启动: SpringApplication.run(Main.class);
* 目录层级的问题,和其他同级目录;
![在这里插入图片描述](https://img-blog.csdnimg.cn/0a501472b6f84308a963dfdaafede9d6.png)
Main.java文件
package com.tianju;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
/**
* springMvc的主启动类
* 1.本质是配置类;@SpringBootApplication :@Configuration是它的爷爷辈
* 2.启动容器,SpringApplication.run(Main.class);
*/
@SpringBootApplication
public class Main {
public static void main(String[] args) {
// 集成了的new对象,放容器,启动执行
ApplicationContext ac = SpringApplication.run(Main.class);
}
}
### 4.写application.yml文件spring的配置文件
要点:
* 文件名是 application.yml
* 颜色要是黄色,要有空格
![在这里插入图片描述](https://img-blog.csdnimg.cn/7b5b780abc43425c88ea4dd49d167f8d.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/04994b7248fc4657897d06818908653e.png)
server:
port: 80
### 5.启动,运行main.java就可以启动
![在这里插入图片描述](https://img-blog.csdnimg.cn/2c15e44f38cb4120a4d7a95485cf3db2.png)
## SpringMvc的浏览器请求初步
### 1.初识springMvc @RequestMapping(“/demo”)
要点:
* 1.controller要在容器中:@Controller
* 2.用来处理浏览器的请求:@RequestMapping(“/demo”)
* @RequestMapping(“/demo”)可以在类上,也可在方法上:一级、二级目录;
![在这里插入图片描述](https://img-blog.csdnimg.cn/3dccf42d4ae24be0b94f28160db80001.png)
ResponseControllerDemo.java文件
package com.tianju.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {
@RequestMapping({“/hello”,“/hello2”}) // 二级目录
@ResponseBody
public String hello(){
return “Hello SpringMvc”;
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/135dd03153bd44dbb1ed098257507aa9.png)
### 2.由@RequestMapping衍生出来的
@PostMapping,@GetMapping,@DeleteMapping,@PutMapping
![在这里插入图片描述](https://img-blog.csdnimg.cn/509b78f9cf774a988e24aa84c4c8f80a.png)
@RequestMapping
@PostMapping(“/hello”)
@GetMapping
@DeleteMapping
@PutMapping
#### 405异常:服务器只能处理post,浏览器请求的是get方法
![在这里插入图片描述](https://img-blog.csdnimg.cn/562337c970824b909277806e3edf9dbe.png)
## 浏览器请求Request传参数的方式
### 1.基础数据类型和String
要点:
* string不传默认是,空字符串;
* Integer不传,默认是null;
http://localhost/demo/hello?username=&age=
package com.tianju.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {
@RequestMapping(“/hello”) // 二级目录
@ResponseBody
public String hello(String username,Integer age){
System.out.println(username);
System.out.println(age);
return “Hello SpringMvc”;
}
}
### 2.发送name,接收是username,@RequestParam(value = “name”)
要点:
* 默认必须传值,不传会报400异常;
* 如果不想传,就加required=false;
* 还可以给个默认值,defaultValue=“admin”;【应用:分页的时候,默认第一页,默认每页10条数据】
http://localhost/demo/hello?name=hell
@RequestMapping("/hello") // 二级目录
@ResponseBody
public String hello(@RequestParam(value = "name") String username){
System.out.println(username);
return "Hello SpringMvc";
}
#### 400异常,加了@RequestParam(value = “name”) 必须传值
![在这里插入图片描述](https://img-blog.csdnimg.cn/cbe905f964de4c20908e3deccd018a31.png)
#### 400异常,后端类型是Integer,前端传的是string,转换失败
![在这里插入图片描述](https://img-blog.csdnimg.cn/feba06f0ff564988b9d1f8a31dc210f1.png)
### 2.【应用】分页可以用@RequestParam(value = “pageNum”,defaultValue = “1”)
package com.tianju.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {
@RequestMapping(“/hello”) // 二级目录
@ResponseBody
public String hello(@RequestParam(value = “pageNum”,defaultValue = “1”) Integer pageNum,
@RequestParam(value = “pageSize”,defaultValue = “10”) Integer pageSize){
System.out.println(pageNum);
System.out.println(pageSize);
return “Hello SpringMvc”;
}
}
### 3.Rest风格的查询xxx/search/手机/白色----xxx/search?item=手机&color=白的
要点:
* 访问路径:@RequestMapping(“/search/{item}/{color}”);
* 获取参数:@PathVariable(“item”)
![在这里插入图片描述](https://img-blog.csdnimg.cn/281db5a40f1742459399b7a06b4dcbf0.png)
http://localhost/demo/search/mobilephone/red
package com.tianju.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.security.SignedObject;
/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {
// http://localhost/demo/search/mobilephone/red
@RequestMapping("/search/{item}/{color}") // 二级目录
@ResponseBody
public String hello(@PathVariable("item") String item,
@PathVariable("color") String color){
System.out.println(item);
System.out.println(color);
return "Hello SpringMvc";
}
}
### 4.后端用对象接收 + 数组/集合
要点:
* 可以用对象接收前端传来的数据,会自动做映射
* 可以传数组,或集合
![在这里插入图片描述](https://img-blog.csdnimg.cn/ede883234b5c4af284fd05638b2f8fc3.png)
http://localhost/demo/add/user?username=peter&password=123&hobby=learn&hobby=game
package com.tianju.controller;
import com.tianju.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.security.SignedObject;
/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {
// http://localhost/demo/add/user?username=peter
// &password=123&hobby=learn&hobby=game
@RequestMapping("/add/user") // 二级目录
@ResponseBody
public String hello(User user){
System.out.println(user);
return "Hello SpringMvc";
}
}
### 5.日期的处理,默认格式2021/05/28,【未完待续】
要点:
* 默认只能发送2021/05/28格式的日期
http://localhost/demo/date?birthday=2021/05/28
package com.tianju.controller;
import com.tianju.entity.User;
import lombok.Data;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.security.SignedObject;
import java.util.Date;
/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {
// http://localhost/demo/date?birthday=2021/05/28
@RequestMapping("/date") // 二级目录
@ResponseBody
public String hello(Date birthday){
System.out.println(birthday);
return "Hello SpringMvc";
}
}
#### 400异常,日期格式转换失败
Failed to convert from type [java.lang.String] to type [java.util.Date] for value ‘2021-5-28’; nested exception is java.lang.IllegalArgumentException]
![在这里插入图片描述](https://img-blog.csdnimg.cn/7534bbf25ec34179b8a4020157a885b4.png)
### 6.怎么获取请求头,cookie里的值,以及原来的request和response等
要点:
* 需要啥写啥;
* HttpServletRequest request,
* HttpSession httpSession,
![在这里插入图片描述](https://img-blog.csdnimg.cn/8f2ebdad785f4f069264178fffd923c1.png)
http://localhost/demo/set/session
http://localhost/demo/native
package com.tianju.controller;
import com.tianju.entity.User;
import lombok.Data;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.security.SignedObject;
import java.util.Date;
/**
* controller层,
* 1.在容器中: @Controller
* 2.用来处理网络请求:即 @RequestMapping(“/demo”)
* 既可以放在类上:一级目录;
* 也可以在方法上:二级目录:http://localhost/demo/hello
*/
@Controller
@RequestMapping(“/demo”) // 一级目录
public class ResponseControllerDemo {
// http://localhost/demo/date?birthday=2021/05/28
@RequestMapping("/native") // 二级目录
@ResponseBody
public String hello(HttpServletRequest request,
HttpSession httpSession,
HttpServletResponse response,
@RequestHeader("Connection") String connection,
@CookieValue("JSESSIONID") String jsessionid){
// 1.request里面就可以获得session,之前servlet就是这样的
HttpSession session = request.getSession();
// 2.加上httpSession,也能获得;
Object username = httpSession.getAttribute("username");
System.out.println(username);
System.out.println(response);
System.out.println("----获取请求头里的connection------");
System.out.println(connection);
System.out.println(jsessionid);
return "Hello SpringMvc";
}
@RequestMapping("/set/session")
@ResponseBody
public String setSession(HttpSession session){
session.setAttribute("username", "peter");
System.out.println(session);
return "success";
}
}
请求头
![在这里插入图片描述](https://img-blog.csdnimg.cn/3821308e4712420b8a94dab81bfb6f29.png)获取connection和 jsessionid
![在这里插入图片描述](https://img-blog.csdnimg.cn/b472373eb95046ba8cb97357c18dbafb.png)
## 服务器响应Response—后端给前端发送内容
![在这里插入图片描述](https://img-blog.csdnimg.cn/a783f0a5e32d44f7885a8e5c05da9dae.png)
需要一个包,前端模板引擎,类似于jsp
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
### 1.响应一个Json + 时间显示@JsonFormat【有坑】
要点:
* 响应是json,要加@ResponseBody;
* 时间显示的问题,要GMT+8:
* @JsonFormat(pattern = “yyyy-MM-DD hh:mm:ss”, timezone = “GMT+8”)
* 如果一个controller响应都是json则,可以用@RestController代替 @Controller 和 @ResponseBody
![在这里插入图片描述](https://img-blog.csdnimg.cn/0c819bb135b047f28ccd9db90f9b5977.png)
注意这里,日期转换格式写错了,DD要改成小写dd
![在这里插入图片描述](https://img-blog.csdnimg.cn/26c088d2aa4647ee890291a63a83eafb.png)
日期格式的转换
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",timezone = "GMT+8")
private Date birthday;
controller的代码
package com.tianju.controller;
import com.tianju.entity.ResData;
import com.tianju.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.Date;
/**
* 响应相关:1.响应json;2.响应页面
* 要点:
* 1.在容器@Controller;
* 2.路径;@RequestMapping(“/resp”);
* 3.如果是响应json,需要加@ResponseBody;
* 4.如果响应页面,则返回值是string
* 补充:如果一个controller响应都是json
* 则,@RestController代替 @Controller 和 @ResponseBody
*/
@Controller
@RequestMapping(“/resp”)
//@RestController // 等价于@Controller + @ResponseBody
public class ResponseControllerDemo {
@RequestMapping(“/json”)
@ResponseBody // 如果响应是json,必须加
public ResData respJson(){
User user = new User(“peter”, “123”,
new Date(), Arrays.asList(new String[]{“learn”,“movie”}));
return new ResData(200, “success”, user);
}
}
可以不写responseBody,用@RestController
![在这里插入图片描述](https://img-blog.csdnimg.cn/1abb06092fd648fa8cdb040746e2d91d.png)
### 2.响应一个页面,返回值String
要点:
* 1.返回值为string;
* 2.不能加Responsebody
![在这里插入图片描述](https://img-blog.csdnimg.cn/668022fec9cb4df3ba78af55773a9fc7.png)
服务器响应html代码,显示在前端页面上
![在这里插入图片描述](https://img-blog.csdnimg.cn/8eb37d953e1845e2a92c5d8f9085c4ed.png)
访问resources下的文件可以修改,不建议
![在这里插入图片描述](https://img-blog.csdnimg.cn/cd74fdd8bd7649d5bd26ad7bb5957e6f.png)
访问连接
http://localhost/resp/list
后端代码
/\*\*
* 响应一个页面
* @return list页面,会在前面拼 /templates,后面拼.html
* 最终访问到xxx/templates/opus/list.html
*/
@RequestMapping(“/list”)
public String respHtml(){
return “/opus/list”;
}
### 2.响应页面,ModelAndView 且共享数据[[${usename}]]
要点:
// 1.定义要跳转的页面,2.添加要共享的数据
ModelAndView mv = new ModelAndView(“opus/list”);
mv.addObject(“username”, “peter”);
第一种方式:不建议
![在这里插入图片描述](https://img-blog.csdnimg.cn/8ba8350a3bbb442181b45e9caac5710c.png)
第二种方式:以后共享数据都用这种方式
![在这里插入图片描述](https://img-blog.csdnimg.cn/2cb353d4454146daa52ec8cd512878df.png)
共享值显示到前端
![在这里插入图片描述](https://img-blog.csdnimg.cn/f04a145d6c8b49449dce8807c06055ed.png)
@RequestMapping("/listAndData")
public ModelAndView respHtmlData(){
// 1.定义要跳转的页面,2.添加要共享的数据
ModelAndView mv = new ModelAndView("opus/list");
mv.addObject("username", "peter");
return mv;
}
### 3.如果想自己处理,就用void
要点:没有返回值,用void
![在这里插入图片描述](https://img-blog.csdnimg.cn/ccdcbf2a35214ac48edb7ad7a7a11392.png)
package com.tianju.controller;
import com.alibaba.fastjson.JSON;
import com.tianju.entity.ResData;
import com.tianju.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
/**
* 响应相关:1.响应json;2.响应页面
* 要点:
* 1.在容器@Controller;
* 2.路径;@RequestMapping(“/resp”);
* 3.如果是响应json,需要加@ResponseBody;
* 4.如果响应页面,则返回值是string
* 补充:如果一个controller响应都是json
* 则,@RestController代替 @Controller 和 @ResponseBody
*/
@Controller
@RequestMapping(“/resp”)
//@RestController // 等价于@Controller + @ResponseBody
public class ResponseControllerDemo {
@RequestMapping(“/json”)
总结
一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。
这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。
最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!
Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
值是string
* 补充:如果一个controller响应都是json
* 则,@RestController代替 @Controller 和 @ResponseBody
*/
@Controller
@RequestMapping(“/resp”)
//@RestController // 等价于@Controller + @ResponseBody
public class ResponseControllerDemo {
@RequestMapping(“/json”)
总结
一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。
这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。
最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!
Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
[外链图片转存中…(img-KKpvxeyD-1714472622616)]