SpringMVC

    技术2026-03-01  6

    学习资料

    https://www.bilibili.com/video/BV1aE41167Tu?p=15 学SpringMVC前需懂MVC 和 Spring

    简介

    一、springMVC是Spring Framework的一部分,是轻量级的基于请求和响应的MVC框架,基于java实现MVC的轻量级Web框架。

    二、优点: 1、性能较struts2好(struts2的开发效率高) 2、简单、便捷、易学 3、和spring无缝集成(使用spring的IOC和AOP ) 4、约定大于配置 5、能进行简单的junit单元测试 6、支持restful风格 7、异常处理 8、本地化、国际化 9、数据验证、类型转换 10、拦截器 restful风格特点:/del/123 不需要用问号传参

    学习目标

    1、springMVC的执行原理 2、注解 2、SSM框架整合

    MVC

    一、MVC是一种软件设计规范 M :模型(dao,service) V :视图(jsp) C :控制器(servlet) MVC的主要作用就是降低视图层和业务逻辑的双向耦合

    二、mvc的任务 1、将url映射到java类或者java类的方法 2、封装用户提交的数据 3、处理业务请求-封装响应的数据 4、将响应的数据进行渲染,jsp或者json

    三、最典型的MVC模式是JSP+servlet+javabean模式 MVVM:M V VM VM是viewMode :双向绑定

    SpringMVC结构

    一、 1、浏览器发送请求,并将请求发送给控制器Controller 2、控制器里的核心组件是DispatcherServlet。控制器Controller的作用是将请求委托给处理器。 3、处理器依赖HandlerMapping和HandlerAdaper将请求url和类方法对应起来。 4、处理器调用Service层进行业务处理 5、Service层处理完数据将结果返回给处理层 6、处理器将返回结果转给控制器Controller,数据类型是ModelandView 7、Controller并不能将ModelandView直接转化为浏览器数据。Controller会调用视图渲染器生成json、jsp等 8、Controller返回响应结果 二、Spring的web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求分发到不同的处理器。从spring2.5开始,使用java5或者以上版本的用户可以采用基于注解的controller声明方式

    SpringMVC以请求为驱动,围绕中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet(它继承自HttpServlet基类)

    快速创建helloword项目

    说明:实际开发不会这么写,这样写是为了理解原理。实际开发用注解 1、新建一个Module. 2.添加web的支持 3、确定导入SpringMVC的依赖 4、配置web.xml,注册DispatcherServlet 5、添加处理器配置

    使用注解开发SpringMVC

    1、添加spring mvc配置文件 (1)让IOC的注解生效,自动扫描包 (2)静态资源过滤 (3)MVC注解驱动 (4)配置视图解析器

    <?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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 配置扫描的包,让指定包下的注解生效,由IOC容器统一管理--> <context:component-scan base-package="com.swallow" /> <!-- 访问静态资源,springmvc不处理.css,.js,.html --> <mvc:default-servlet-handler /> <!--mvc注解驱动 在spring中一般采用@RequestMapping注解来完成映射关系 要使@RequestMapping注解生效,必须向上下文中注册HandlerMapping和HandlerAdapter实例, 这两个实例分别在类级别和方法级别处理。 annotation-driven配置帮我们自动完成上述两个实例的注入。 --> <mvc:annotation-driven/> <!-- 视图页面配置 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> </beans>

    创建Controller类

    package com.swallow; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.ui.Model; @Controller public class DemoController { @RequestMapping("/hello") public String hello(Model model){ //封装数据 model.addAttribute("msg","nihaoa"); return "hello";//会被视图解析器处理 } }

    控制器Controller

    一、控制器负责提供访问应用程序的行为,通常通过接口定义或注解定义两种方式实现。 1、public class DemoController implements Controller 缺点:一个控制器里只能写一个请求方法 2、@Controller public class DemoController 二、控制器负责解析用户的请求并将其转换为一个模型 三、在SpringMVC中一个控制器类可以包含多个方法 四、在SpringMVC中,对Controller的配置方式有很多

    RequestMapping

    RequestMapping注解用于映射url到控制器类或者一个特定的处理程序方法,可用于类或者方法上。用在类上表示类中的所有响应请求的方法都是以该地址作为父路径

    package com.swallow; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.ui.Model; @Controller @RequestMapping("/ask") public class DemoController { @RequestMapping("/hello") public String hello(Model model){ //封装数据 model.addAttribute("msg","nihaoa"); return "hello";//会被视图解析器处理 } }

    RestFul风格

    一、restful是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。 二、 1、查询 (1)传统写法:

    请求路径必须传a和b,http://localhost/ask/hello?a=1&b=2 @Controller @RequestMapping("/ask") public class DemoController { @RequestMapping("/hello") public String hello(int a, int b, Model model){ //封装数据 model.addAttribute("msg","nihaoa"); return "hello";//会被视图解析器处理 } }

    (2)restful风格的写法

    请求路径:http://localhost/ask/hello/1/2 使用@PathVariable注解,让方法参数的值对应绑定到一个URI模板变量上。 @Controller @RequestMapping("/ask") public class DemoController { @RequestMapping("/hello/{a}/{b}") public String hello(@PathVariable int a, @PathVariable int b, Model model){ //封装数据 model.addAttribute("msg","nihaoa"); return "hello";//会被视图解析器处理 } }

    2、新建

    @Controller @RequestMapping("/ask") public class DemoController { // @RequestMapping(value = "/hello/{a}/{b}", method = RequestMethod.POST) @PostMapping(value = "/hello/{a}/{b}") public String hello(@PathVariable int a, @PathVariable int b, Model model){ //封装数据 model.addAttribute("msg","nihaoa"); return "hello";//会被视图解析器处理 } }

    三、使用路径变量的好处 1、使路径变的更加简洁; 2、获得参数更加方便,框架会自动进行类型转换。 3、通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法。 四、@RequestMapping 对应url默认是Get类型请求,可以通过method指定请求类型,也可以使用简洁的注解 @GetMapping @PostMapping @PutMapping @DeleteMapping @PatchMapping

    视图解析器

    主要就是拼接视图路径,加前缀和后缀

    重定向和转发

    一、转发url地址不变;重定向url地址会变化 二、实现方式 方法一、ServletAPI 使用ServletAPI不需要视图解析器. 使用HttpServletResponse进行输出、实现重定向和转发 方法二、ModelAndView 设置ModelAndView对象,根据viewname和视图解析器跳转到指定的页面。 页面:视图解析器前缀+viewName+视图解析器后缀

    <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean>

    对应的Controller类 或者 方法三:通过SpringMVC实现转发和重定向,无需视图解析器 方法三:通过SpringMVC实现转发和重定向,有视图解析器 默认是转发,重定向的话加redirect

    接收请求参数

    一、处理提交数据 1、提交的域名称和处理方法的参数名一致 域名称和处理方法的参数名不一致会返回null

    提交数据:http://localhost/hello?name=kuangshen 处理方法: @RequestMapping("/hello") public String Hello(String name, Model model){ // 接收前端参数 supt(name); //将返回的结果传输给前端 model.addAttribute("msg",name); //视图跳转 return "hello"} 后台输出hello

    2、提交的域名称和处理方法的参数名不一致 建议无论域名称和处理方法的参数名一样或者不一样,都加上@RequestParam

    提交数据:http://localhost/hello?username=kuangshen 处理方法: @RequestMapping("/hello") public String Hello(@RequestParam("username") String name){ supt(name); return "hello"} 后台输出hello

    3、提交的是一个对象 自动配置对象中的属性名称 要求提交的表单域和对象的属性名一致,参数使用对象即可 前端传递的参数名和对象的属性名必须一致,否则就是null

    实体类 public class User{ private String name; private int id; } 提交数据:http://localhost/user?name=kuang&id=1 处理方法: @RequestMapping("/user") public String Hello(User user){ supt(user); return "hello"} 后台输出:User(id=1,name="shend")

    数据回显

    一、ModelAndView 二、通过ModelMap

    三、Model

    乱码问题

    一、使用过滤器解决,get请求ok,post请求还是有乱码 1、编写encoding过滤器 2、web.xml中配置过滤器 3、修改tomcat的配置文件,设置编码 二、使用springMVC的配置 这种有时候对get支持不好 在web.xml中配置

    json和javascript对象互转

    一、json转javascript var obj = JSON.parse(’{“a”:“hello”,“b”:“world”}’); 二、javascript转json var json = JSON.stringify({a:“hello”,b:“world”});

    Jackson使用

    一、Jackson是目前比较好的json解析工具 二、使用

    Jackson需要导入jar包 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.11.0</version> </dependency>

    2、解决乱码 (1)在springmvc-servlet.xml中配置 (2)或者使用@RequestMaping的produces属性来实现 3、 三、时间戳

    默认返回的是时间戳

    Date date = new Date();

    配置后返回的是时间

    public String json1() throws JsonProcessException{ ObjectMapper mapper = new ObjectMapper(); //不使用时间戳的方式 mapper.configuse(SerializationFeature.WRITE_AS_TIMESTAMPS, false); //自定义日期格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); mapper.setDateFormat(sdf); Date date = new Date(); return mapper.writeValueAsString(date); }

    Fastjson使用

    一、Fastjson是阿里巴巴开发的,可以方便实现json对象和javabean对象的转换,实现JavaBean对象和json字符串的转换,实现json对象和json字符串的转换, 二、fastjson的pom依赖 三、fastjson三个主要的类

    @ResponseBody

    一、使用@ResponseBody不会执行视图解析器,会直接返回一个字符串 二、@ResponseBody和@Controller合成@RestController 使用@RestController 也只会返回字符串

    SSM整合:Mybatis层

    1、新建Maven项目,添加web支持 2、导入相关的pom依赖 3、Maven资源过滤设置 4、创建项目目录 5、配置mybatis (1)新建database.properties,并添加配置信息 (2)配置mybatis-config.xml 6、创建实体类 7、写dao层 8、写mapper.xml 一个mapper对应一个接口 8、写service层

    SSM整合:Spring层

    一、配置spring-dao.xml 二、配置spring-service.xml

    SSM整合Spring MVC

    一、增加web支持 二、配置web.xml 三、配置spring-mvc.xml 四、编写controller层

    Ajax

    一、ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术 二、

    拦截器

    一、拦截器用于对处理器进行预处理后后置处理。 二、过滤器和拦截器的区别 三、自定义拦截器需实现HandlerInterceptor接口

    文件上传下载

    Processed: 0.014, SQL: 9