SpringMVC框架-MVC模式

SpringMVC框架-MVC模式

一.SpringMVC原理

1.MVC模式

1.1MVC 设计模式:

            一般指 **M(Model)**指数据模型层,业务模型层,**V(View)**指视图层,**C(Controller**)指控制层。
      使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。VC 属于架构模式的一种,
      所谓架构就是如何设计一个程序的结构。

​ 1.2MVC 的程序结构

划分为三层,每一层都对外提供了可供上层调用的接口,既能维系三层之间的联系,也能保持相对的独立性。这种将业务逻辑、数据和界面分离的代码组织形式,降低了模块间的耦合度,有利于日后的维护与扩展。

2.SpringMVC

2.1介绍

    2.1.1springmvc是基于spring Framwork**衍生出来的一个mvc框架**,主要解决原有mvc架构中,控制器(Controller)的问题,常见的控制器有servlet等
    
     2.1.2 SpringMVC主要负责的就是:
     controller如何接收请求和数据
     如何将请求和数据转发给业务层
     如何将响应数据转换成json发回到前端

2.2SpringMVC主要组件

     a.前端控制器 DispatcherServlet:接收请求、响应结果(可以理解为前端控制器只负责分配任务),相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
     b.处理器映射器HandlerMapping:根据请求的 URL 来查找 Handler(可以理解为找相对应的后台java代码)。
     c.处理器适配器 HandlerAdapter:负责执行 Handler
     d.处理器 Handler:处理业务逻辑的 Java 类
     e.视图解析器 ViewResolver:进行视图的解析,根据视图逻辑名将 ModelAndView 解析成真正的视图(view)。
     f.视图 View:View 是一个接口,它的实现类支持不同的视图类型,如 jsp,freemarker,pdf 等等。

2.3SpringMVC 的常用注解

        a.@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类
上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
        b.@RequestBody:注解实现接收 http 请求的 json 数据,将 json 转换为 java 对象。
        c.@ResponseBody:注解实现将 conreoller 方法返回对象转化为 json 对象响应给客户。
        d.@PathVariable: 用户从 url 路径上获取指定参数,标注在参数前 @PathVariabel("要获取的参数名")。
        e.@RequestParam: 标注在方法参数之前,用于对传入的参数做一些限制,支持三个属性:
                - value:默认属性,用于指定前端传入的参数名称
                - required:用于指定此参数是否必传
                - defaultValue:当参数为非必传参数且前端没有传入参数时,指定一个默认值
        f. @ControllerAdvice: 标注在一个类上,表示该类是一个全局异常处理的类。
        g. @ExceptionHandler:(Exception.class) 标注在异常处理类中的方法上,表示该方法可以处理的异常类型。

2.4SpringMVC执行流程

在这里插入图片描述
a.用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
b.由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
c.DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
d.HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
e.Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
f.HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
g.DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图解析;
h.ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
i.DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据
填充到 View 视图中的 request 域,生成最终的 View(视图);
j.视图负责将结果显示到
浏览器**(客户端)。

2.5使用SpringMVC的优势:

1)方便解耦,简化开发
通过 Spring 提供的 IoC容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度耦合。
用户也不必再为单例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2)AOP 编程的支持
通过 Spring的 AOP 功能,方便进行面向切面编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松实现。
3)声明式事务的支持
可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活的进行事务管理,提高开发效率和质量。
4)方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,测试不再是昂贵的操作,而是随手可做的事情。
5)方便集成各种优秀框架
Spring对各种优秀框架(Struts、Hibernate、Hessian、Quartz等)的支持。
6)降低 JavaEE API 的使用难度
Spring对 JavaEE API(如 JDBC、JavaMail、远程调用等)进行了薄薄的封装层,使这些 API 的使用难度大为降低。

二.SpringMVC执行实现

1.创建web项目步骤:

1.1 xml方式:

a.使用maven搭建web项目并引入 JAR 包spring-webmvc

b.Spring MVC 配置:添加Web.xml配置文件中关于SpringMVC的配置
在这里插入图片描述
c.创建 Controller(处理请求的控制器)

在这里插入图片描述

d.创建 View(使用 JSP 作为视图)

在这里插入图片描述
e.在resources文件夹下创建SpringMVC核心文件spring-mvc.xml,并添加注解扫描
在这里插入图片描述
f.配置Tomcat并启动

1.2注解方式(更优)

a.添加servlet依赖,并新建配置包(config)

javax.servlet
javax.servlet-api
4.0.1

b.在config包下创建配置类SpringMvcConfig替换spring-mvc.xml
在这里插入图片描述

c.在config包下创建配置类ServletContainersInitConfig替换web.xml
在这里插入图片描述

d.启动执行

2.xml方式和注解方式对比

​ 2.1xml配置:书写灵活,修改方便,单修改xml时不需要修改源码,不用重新编译和部署。但维护起来相对麻烦。

2.2注解方式:写起来比较**简单方便,配置、维护简单**。是一种分散式的的元数据,与源代码紧绑定(更优)。

三.SpringMVC多种类型数据响应

1.@RequestMapping设置请求路径(路径不能重复,一个访问路径对应一个方法)

​ a.使用 @RequestMapping 注解在类上(类中所有方法的请求路径的前缀)和方法上添加路径。

​ b.@RequestMapping 的属性

value:用于指定请求的URL。它和path属性的作用是一样的

method:用于指定请求的方式

params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一样

2.视图解析器*

​ SpringMVC视图解析器的主要作用就是将逻辑视图转换用户可以看到的物理视图,视图解析器是用来接收经过处理器适配器调用具体的controller后生成的逻辑视图的,它接受 DispatcherServlet传过来的ModelAndView,ModelAndView数据填充到相应的视图中,然后返回一个带有数据的视图再传给DispatcherServlet。

2.1 xml方式

在这里插入图片描述

2.2配置类方式

在这里插入图片描述

3.SpringMVC的数据响应方式(需要配置jackson进行对象或集合的转换)​

3.1实现页面跳转的方式(直接返回字符串或通过ModelAndView对象返回)

 3.1.1配置视图解析器

​ 3.1.1.1 xml方式和注解方式

​ a.配置视图解析器

​ b.编写控制器和处理请求的方法(不变)
在这里插入图片描述

3.2返回字符串(直接返回字符串和返回带有前缀的字符串)

在这里插入图片描述

​ 3.3返回ModelAndView对象

在这里插入图片描述

​ 3.4编写控制器中处理请求的方法

在这里插入图片描述

3.5回写数据

 3.5.1直接返回字符串(需要回写的字符串直接返回,但此时需要通过@ResponseBody注解告知SpringMVC框架)
3.5.2返回对象或集合
   xml方式::spring核心配置文件中加以下配置
   <mvc:annotation-driven/>

    注解方式:spring配置类上加以下注解@EnableWebMvc

四.获得请求参数类型

1.SpringMVC获取不同类型参数

1.1基本类型参数

​ 服务端在获取到请求的基本类型参数时,就直接进行使用,不进行数据的封装(Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配),并且能自动做类型转换(自动的类型转换是指从String向其他类型的转换)

@RequestParam用于请求的参数名称与Controller的业务方法参数名称不一致

在这里插入图片描述

1.2POJO类型参数

​ 让请求的参数通过SpringMVC自动封装到POJO也就是实体类对象中,那么我们需要让请求的参数名和实体类的属性名称一致,这样参数值会自动映射匹配,将参数封装到实体对象中
在这里插入图片描述

1.3数组类型参数

客户端请求的参数名称都一样,可以将这种数据封装到数组数据中

在这里插入图片描述

1.4集合类型参数

​ 获得集合参数时,要将集合参数包装到一个JavaBean对象中才可以,这个对象我们一般命名为VO。我们在对象中创建对应的集合属性,生成get和set方法,为了方便打印也生成toString方法,接下来我们在客户端界面中模拟提交一个集合,里面存储的user对象,这个集合名要和VO对象的集合属性名相同,即userList。(因为提交的数据比较复杂,所以我们用post方法)首先我们创建一个jsp,用于提交集合数据。

在这里插入图片描述

2.获取Restful风格的参数

​ 2.1 Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。
2.2Restful风格的请求是使用"url+请求方式"表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:

GET:用于获取资源
POST:用于新建资源
PUT:用于更新资源
DELETE:用于删除资源

五.其他

1.配置过滤器来进行编码的过滤

在这里插入图片描述

2.获得Servlet相关API

SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:

HttpServletRequest
HttpServletResponse
HttpSession
我们在方法的参数中直接写ServletAPI对象,SpringMVC会自动帮我们注入

@RequestMapping(“/quick20”)//配置映射地址
@ResponseBody//告诉SpringMVC该方法不进行视图跳转, 回写数据的类型为void空
public void save20(HttpServletRequest request, HttpServletResponse response, HttpSession session){
System.out.println(request);
System.out.println(response);
System.out.println(session);
}

3.获得请求头数据

3.1 @RequestHeader 注解的属性

如下:

​ value:请求头的名称
​ required:是否必须携带此请求头
@RequestMapping(“/quick21”)//配置映射地址
@ResponseBody//告诉SpringMVC该方法不进行****视图跳转
public void save21(@RequestHeader(value = “User-Agent”,required = false) String headValue){
​ System.out.println(headValue);//打印请求头信息

3.2自定义类型转换器

   3.2.1SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。(日期类型的数据就需要自定义转换器。)

3.2.2自定义类型转换器的开发步骤:

a.定义转换器类实现Converter接口

class DateConverter implements Converter<String,Date> {
public Date convert(String source) {//将String类型转换为Date类型
SimpleDateFormat format=new SimpleDateFormat(“yyyy.MM.dd-hh:mm:ss”);
Date date=null;
try {
date = format.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
b.在配置文件中声明转换器(利用转换器工厂帮我们创建转换器)

c.在中引用转换器**(配置SpeingMVC注解驱动)
<mvc:annotation-driven conversion-service=“conversionService”/>
d.启动服务器,输入需要转换的格式

4.文件上传

​ 准备:

  • ​ 编写一个form表单,用于上传并提交文件(method 必须为post 且必须要有**enctype=“multipart/form-data”**将文件转化为二进制形式)
  • SpringMvc 配置文件配置文件上传器
  • 要在pom.xml添加依赖(commons-fileupload)
    在控制器中通过SpringMVC框架获取上传的文件**(方法的参数文件名要和jsp中的name相同)

4.1单文件上传

a.表单
在这里插入图片描述

b.SpringMvc 配置文件配置文件上传器

在这里插入图片描述

c.在控制器中通过SpringMVC框架获取上传的文件(方法的参数文件名要和jsp中的name相同)

@RequestMapping(“/doUpload”)
public String doUpload(MultipartFile myfile, String description, HttpServletRequest request) throws IllegalStateException,
IOException {
//指定文件上传到服务器的位置(/uploadfiles)
String realPath = request.getServletContext().getRealPath(“uploadfiles”);
System.out.println(realPath);
//为上传到服务器的文件取名,使用UUID防止文件名重复
String filename= UUID.randomUUID().toString()+“-”+myfile.getOriginalFilename();
//将文件名和描述传递到成功页显示
request.setAttribute(“filename”, filename);
request.setAttribute(“description”, description);
File targetFile=new File(realPath,filename);
//判断路径中的文件夹是否存在,如果不存在,则创建
if(!targetFile.exists()){
targetFile.mkdirs();
}
//文件传输
myfile.transferTo(targetFile);

    return "upload/upload_succ";
}

@RequestMapping("/download/{filename}")
public ResponseEntity<byte[]> download(@PathVariable String filename, HttpServletRequest request) throws IOException {

// 获取要下载文件字节流
ServletContext servletContext = request.getServletContext();
InputStream in = servletContext.getResourceAsStream(“uploadfiles/” + filename);
//设置响应内容:将文件转换为字节数组
byte[] body = new byte[in.available()];
in.read(body);
// 设置响应头,激活下载框
HttpHeaders headers = new HttpHeaders();
headers.add(“Content-Disposition”, “attachment;filename=” + URLEncoder.encode(filename,“utf-8”));
// 设置响应状态为200
HttpStatus statusCode = HttpStatus.OK;
// 根据页面内容、页面头、页面状态创建并跳转到该页面(实际返回的是下载文件数据)
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
return response;
}

4.2多文件上传

   多文件上传:只需要将页面修改为多个文件上传项,将方法参数MultipartFile类型修改为**MultipartFile[]**

4.3文件下载

a.提交表单

在这里插入图片描述
b.控制器
在这里插入图片描述

5.下拉列表的二级联动

1.前端代码实现

在这里插入图片描述

2.ajax实现二级联动
1)js实现
在这里插入图片描述
2)控制层java代码实现

public void returnChirdname(Integer articleParentCategoryId,HttpServletResponse rep) {
List categorylistByCategoryPid = categoryService.getCategorylistByCategoryPid(articleParentCategoryId);
try {
Gson gson = new Gson();
String json = gson.toJson(categorylistByCategoryPid);
rep.getWriter().write(json);
} catch (IOException e) {
e.printStackTrace();
}
}

六.总结

Spring MVC是一个易于使用和扩展的Java Web框架,用于构建各种类型的Web应用程序。使用MVC模式,有清晰的角色划分,使用依赖注入来管理组件之间的依赖关系,使得代码更加解耦和可测试,强大的数据绑定和验证使得处理用户输入和表单提交变得更加容易,可以根据需要选择合适的视图技术来呈现数据,它可以有效地分离应用程序,提高代码的可维护性和可扩展性。

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值