Spring基础(Web-MVC)——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关_新建springmvc项目(1)

    <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)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值