Spring框架(四)SpringMVC基础,阿里、百度等大厂技术面试题汇总

1) 用户发送请求

2)前端控制器获得用户请求的URL,发送URL给处理器映射

3)处理器映射将Handler(包装方法信息)返回给前端控制器

4)前端控制器发送Handler给处理器适配器,适配器执行Handler方法

5)执行Handler方法后,返回ModelAndView(逻辑视图)给前端控制器

6)前端控制器将ModelAndView发送给视图解析器,解析出物理视图返回给前端控制器

7)前端控制器渲染视图,发送视图给用户

4、参数处理

====================================================================

4.1 SpringMVC的常用注解


这里介绍几个SpringMVC常用的注解:

  • @Controller 配置控制器类

  • @RequestMapping(“URL”) 配置请求方法

属性:

value 配置请求的URL

method 配置请求的方法,值包含RequestMethod.GET、RequestMethod.POST等

  • @GetMapping(“URL”) 配置GET请求方法

相当于@RequestMapping(value=“URL”,method=RequestMethod.GET)

类似的还有:@PostMapping、@DeleteMapping、@PutMapping

  • @RequestParam(“名称”) 配置请求参数

  • @PathVariable(“名称”) 配置路径参数

4.2 参数绑定


登录页面

登录

${msg}



实现参数绑定有多种方式。

4.2.1 参数直接绑定

直接定义和表单元素name相同的参数

@Controller

@RequestMapping(“user”)

public class UserController {

@PostMapping("/login")

public void login(String username, String password){…}

}

4.2.2 @RequestParam注解绑定参数

如果名称不一样,可以通过@RequestParam注解配置参数

@PostMapping("/login")

public void login(@RequestParam(“username”)String uname,

@RequestParam(“password”)String pwd){

}

4.2.3 对象绑定参数

通过对象也可以进行参数绑定

实体类

public class User {

private String username;

private String password;

}

方法定义

@PostMapping("/login")

public void login(User user){

}

4.2.4 @PathVariable绑定参数

通过URL的路径也可以实现参数绑定,需要给参数添加@PathVariable注解

在URL中可以使用{name}来定位参数的位置,name是@PathVariable注解中配置的名称

@GetMapping("/login/{username}/{password}")

public void login(@PathVariable(“username”)String username,

@PathVariable(“password”)String password){

System.out.println(username);

System.out.println(password);

}

在浏览器输入:http://localhost:8080/user/login/admin/123456

可以看到账号和密码的输出,当然登录不适合将账号和密码添加到URL中,这里只是测试

4.2.5 通过Map集合进行参数绑定

在实体类中添加Map集合

public class UserVO {

private Map<String,String> user = new HashMap<>();

//get、set

}

修改表单name为: 集合名[‘属性名’]



修改方法

@PostMapping("/login")

public void login(UserVO userVO){

String username = userVO.getUser().get(“username”);

String password = userVO.getUser().get(“password”);

}

4.2.6 通过List集合进行参数绑定

修改集合为List

public class UserVO {

private List user = new ArrayList<>();

//get、set

}

修改表单name为: 集合名[下标]



修改方法

@PostMapping("/login")

public void login(UserVO userVO){

String username = userVO.getUser().get(0);

String password = userVO.getUser().get(1);

}

4.3 参数绑定的中文乱码问题


SpringMVC提供了过滤器来设置编码

在web.xml中配置

encodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

forceEncoding

true

encodingFilter

/*

4.4 自定义类型转换器


在进行参数绑定时,会自动完成完成基本类型(如byte、short、 int、long、float、double、boolean 、char )以及String类型的数据转换。

因为SpringMVC提供了大量内置的类型转换器Converter,来帮助进行参数在类型转换,如果我们需要完成某些特殊的数据格式的处理,就需要自定义类型转换器。

案例:表单输入id-name-age-subject格式的字符串,绑定到Student类型的参数。

实体类

public class Student {

private Long id;

private String name;

private Integer age;

private String subject;

…get/set

}

自定义转换器

/**

  • 学生类型转换器,将id-name-age-subject格式字符串转换为Student对象

*/

public class StudentConverter implements Converter<String, Student> {

@Override

public Student convert(String s) {

//按-分割字符串

String[] strings = s.split("\-");

if(strings.length != 4){

throw new IllegalArgumentException(“字符串不符合学生信息格式要求”);

}

//返回Student对象

Student student = new Student();

student.setId(Long.valueOf(strings[0]));

student.setName(strings[1]);

student.setAge(Integer.valueOf(strings[2]));

student.setSubject(strings[3]);

return student;

}

}

注册转换器,修改springmvc的annotation-driver配置

<mvc:annotation-driven conversion-service=“conversionService”/>

控制器

@PostMapping("/saveStudent")

public void saveStudent(Student student){

System.out.println(student.getId());

System.out.println(student.getName());

System.out.println(student.getAge());

System.out.println(student.getSubject());

}

页面


5、页面数据绑定

======================================================================

5.1 EL实现后台数据绑定


在JSP页面中可以通过EL表达式来绑定后台的数据,后台数据可以保存到:

  1. 将数据保存到HttpServletRequest、HttpSession、ServletContext中

  2. 在参数中定义Model参数保存数据

  3. 在参数中定义Map参数保存数据

5.2 页面跳转


页面跳转的两种方式:

  1. 请求转发

forward:url

  1. 重定向

redirect:url

5.3 登录案例


首页

<%@ page contentType=“text/html;charset=UTF-8” language=“java” isELIgnored=“false” %>

首页

Hello ${user.username}你好

模拟登录,使用User来获得参数,保存User对象到HttpSession,重定向到首页后,可以从首页读取用户名;

保存错误信息到Model对象中,请求转发到登录页面后,可以读取Model中的数据

@PostMapping("/login")

public String login(User user,HttpSession session,Model model){

if(“admin”.equals(user.getUsername()) && “123”.equals(user.getPassword())){

//保存用户数据到Session中

session.setAttribute(“user”,user);

//重定向到首页

return “redirect:/index”;

}

//保存错误提示数据到Model

model.addAttribute(“msg”,“账号或密码错误”);

//请求转发到当前页

return “forward:/login”;

}

5.4 处理ServletAPI


SpringMVC还支持以原生ServletAPI作为形参,包括:

  • HttpServletRequest

  • HttpServletResponse

  • HttpSession

  • java.security.Principal

  • Local

  • InputStream

  • OutputStream

  • Reader

  • Writer

使用HttpServletRequest获得参数,将用户名保存到Session中

@PostMapping("/login")

public String login(HttpServletRequest req,HttpSession session){

String username = req.getParameter(“username”);

String password = req.getParameter(“password”);

session.setAttribute(“username”,username);

return “redirect:/test”;

}

@SessionAttribute

通过@SessionAttribute注解,可以读取Session中的用户名

@PostMapping("/test")

public String test(@SessionAttribute(“username”)String username){

System.out.println(username);

return “/index”;

}

@ModelAttribute

@ModelAttribute可以将模型数据注入到方法参数中

定义方法,在方法上加@ModelAttribute,将返回的User对象作为模型

@ModelAttribute(“user”)

public User getUser(){

User user = new User();

user.setUsername(“admin”);

user.setPassword(“123”);

return user;

}

在方法的参数上加入@ModelAttribute,注入模型对象

@RequestMapping("/test2")

public void test2(@ModelAttribute(“user”)User user){

System.out.println(user);

}

==============================================================

6、SpringMVC和Ajax交互

================================================================================

目前后台和前端进行通信主要的数据格式是:JSON

6.1 JSON简介


JSON是JavaScript的对象,代码简洁,可读性很高

格式有两种:

  1. 单个对象

{“name”:“张三”,“age”:“20”}

  1. 对象数组

[{“name”:“张三”,“age”:“20”},{“name”:“李四”,“age”:“20”}]

Java后台和前端Ajax通信时,经常需要接受JSON参数,也可能需要返回JSON给Ajax

6.2 相关的注解


SpringMVC和Ajax通信的相关注解

  • @RequestBody

定义在参数前面,用于接收JSON格式的对象

  • @ResponseBody

定义在方法前面,用于将数据返回给Ajax

6.3 案例


下面案例演示如何接收Ajax的JSON参数,以及如何返回JSON给Ajax

1) 导入依赖

SpringMVC需要JSON解析的相关依赖

com.fasterxml.jackson.core

jackson-databind

2.9.5

2)用户对象

public class User {

private String username;

private String password;

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

@Override

pub

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

lic String toString() {

return “User{” +

“username=’” + username + ‘’’ +

“, password=’” + password + ‘’’ +

‘}’;

}

public User(String username, String password) {

this.username = username;

this.password = password;

}

public User() {

}

}

3) 控制器,在参数中添加了@RequestBody,方法前添加@ResponseBody

将会接收一个User对象参数,然后返回一个User集合给Ajax

/**

  • 自定义控制器

*/

@Controller

public class MyController {

@ResponseBody

@RequestMapping("/ajax")

public List ajaxTest(@RequestBody User user) {

System.out.println(“收到了JSON对象:”+user);

//返回JSON集合给ajax

List users = Arrays.asList(new User(“user-1”,“123”),

new User(“user-2”,“123”),

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值