写点什么

Spring 框架(四)SpringMVC 基础,2021 最新大厂 Java 面经

  • 2021 年 11 月 10 日
  • 本文字数:5267 字

    阅读完需:约 17 分钟


1、SpringMVC 概述


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


SpringMVC 是 Spring 进行 Web 开发的轻量级组件,它基于 MVC 设计模式,对 Web 层的职责进行解耦,目前做 JavaWeb 开发,这个框架是必须要重点掌握的。


1.1 回顾 MVC 设计模式



1.1.1 MVC 的概念

一种 Web 和桌面应用主流的设计模式


M(Model 模型)负责数据访问、业务逻辑(dao、service、entity)


V(View 视图)负责和用户交互、展示数据(页面)


C(Controller 控制器)负责调用模型、更新视图(servlet-->Controller)


作用:解耦,便于开发和维护

1.1.2 MVC 的执行流程


1)用户来访问视图,如:在商品页面点击查看商品的详情


2)视图将请求发送给控制器,控制器调用模型查询商品数据


3)模型将查询到的数据绑定到详情页面上,控制器使页面跳转到详情页面


4)用户看到商品的详情


1.2 Struts2.0 和 SpringMVC 的区别



1.2.1 MVC 框架的演变

最早的 MVC 架构是:Servlet + JSP + JavaBean,这种方式开发项目比较复杂,管理起来很不方便,所以渐渐出现了 MVC 的框架。早期比较流行的框架是:Struts,Struts 从 1.0 发展为了 2.0,后来 Spring 推出的 SpringMVC 框架由于更加优秀,慢慢的代替了 Struts 框架。

1.2.2 Struts2.0 和 SpringMVC 的区别

  1. 实现机制


SpringMVC 基于 Servlet 机制,而 Struts2 基于 Filter 机制


  1. 拦截机制


SpringMVC 是方法级别拦截,每个请求对应一个方法;


Struts2 是类级别的拦截,每个请求对应一个 Action 类;


SpringMVC 执行速度更快


  1. 集成


SpringMVC 是 Spring 体系中的,配置起来更容易,而 Struts2 需要更多的配置


2、入门案例


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


1)导入 SpringMVC 依赖


<dependency>


<groupId>org.springframework</groupId>


<artifactId>spring-webmvc</artifactId>


<version>5.2.8.RELEASE</version>


</dependency>


2)Spring 配置文件


<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xmlns:context="http://www.springframework.org/schema/context"


xmlns:mvc="http://www.springframework.org/schema/mvc"


xsi:schemaLocation="http://www.springframework.org/schema/beans


http://www.springframework.org/schema/beans/spring-beans.xsd


http://www.springframework.org/schema/context


https://www.springframework.org/schema/context/spring-context.xsd


http://www.springframework.org/schema/mvc


https://www.springframework.org/schema/mvc/spring-mvc.xsd">


<context:component-scan base-package="com.blb.mvc"></context:component-scan>


<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">


<property name="prefix" value="/WEB-INF/pages/"></property>


<property name="suffix" value=".jsp"></property>


</bean>


mvc:default-servlet-handler/


mvc:annotation-driven/


</beans>


3) web.xml 配置文件


<?xml version="1.0" encoding="UTF-8"?>


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xmlns="http://xmlns.jcp.org/xml/ns/javaee"


xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"


id="WebApp_ID" version="3.1">


<display-name>Archetype Created Web Application</display-name>


<servlet>


<servlet-name>dispatcherServlet</servlet-name>


<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>


<init-param>


<param-name>contextConfigLocation</param-name>


<param-value>classpath:spring-mvc.xml</param-value>


</init-param>


<load-on-startup>1</load-on-startup>


</servlet>


<servlet-mapping>


<servlet-name>dispatcherServlet</servlet-name>


<url-pattern>/</url-pattern>


</servlet-mapping>


</web-app>


4) 控制器


/**


  • 自定义控制器


*/


@Controller


public class MyController {


//配置请求的 URL 路径 http://localhost:8080/index


@RequestMapping(value = "/index",method = RequestMethod.GET)


public String toIndex(){


//视图解析器 : index --> /WEB-INF/page/index.jsp


return "index";


}


}


5) 配置 Tomcat 运行效果



3、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 参数绑定




登录页面


<html>


<head>


<title>登录</title>


</head>


<body>


<span style="color:red">${msg}</span>


<form action="/user/login" method="post">


<input name="username" placeholder="请输入用户名"><br>


<input name="password" placeholder="请输入密码"><br>


<input type="submit" value="登录">


</form>


</body>


</html>


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

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 为: 集合名[‘属性名’]


<input name="user['username']" placeholder="请输入用户名"><br>


<input name="user['password']" placeholder="请输入密码"><br>


修改方法


@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<String> user = new ArrayList<>();


//get、set


}


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


<input name="user[0]" placeholder="请输入用户名"><br>


<input name="user[1]" placeholder="请输入密码"><br>


修改方法


@PostMapping("/login")


public void login(UserVO userVO){


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


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


}


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




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


在 web.xml 中配置


<filter>


<filter-name>encodingFilter</filter-name>


<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>


<init-param>


<param-name>encoding</param-name>


<param-value>UTF-8</param-value>


</init-param>


<init-param>


<param-name>forceEncoding</param-name>


<param-value>true</param-value>


</init-param>


</filter>


<filter-mapping>


<filter-name>encodingFilter</filter-name>


<url-pattern>/*</url-pattern>


</filter-mapping>


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 配置


<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">


<property name="converters">


<list>


<bean class="com.blb.mvc.converter.StudentConverter"/>


</list>


</property>


</bean>


<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());


}


页面


<form action="/saveStudent" method="post">


<input name="student" placeholder="请输入学生信息"><br>


<input type="submit" value="提交">


</form>


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" %>


<html>


<head>


<title>首页</title>


</head>


<body>


<h1>Hello ${user.username}你好</h1>


</body>


</html>


模拟登录,使用 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

  • H


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


ttpServletResponse


  • HttpSession

  • java.security.Principal

  • Local

  • InputStream

  • OutputStream

  • Reader

  • Writer


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

评论

发布
暂无评论
Spring框架(四)SpringMVC基础,2021最新大厂Java面经