SpringMVC知识总结

1. MVC 设计模式了解

MVC 设计模式一般指 MVC 框架,M(Model)指数据模型层,V(View)指视图层,C(Controller)指控制层。使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面。

总结:

  • 视图层(View):负责格式化数据并把它们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。
  • 控制层(Controller):负责接收并转发请求,对请求进行处理后,指定视图并将响应结果发送给客户端。
  • 数据模型层(Model):模型对象拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)。

MVC优缺点

任何一件事都有利有弊,下面来了解一下 MVC 的优缺点。

优点

多视图共享一个模型,大大提高了代码的可重用性
MVC 三个模块相互独立,松耦合架构
控制器提高了应用程序的灵活性和可配置性
有利于软件工程化管理

总之,我们通过 MVC 设计模式最终可以打造出一个松耦合+高可重用性+高可适用性的完美架构。

缺点

原理复杂
增加了系统结构和实现的复杂性
视图对模型数据的低效率访问

MVC 并不适合小型甚至中型规模的项目,花费大量时间将 MVC 应用到规模并不是很大的应用程序,通常得不偿失,所以对于 MVC 设计模式的使用要根据具体的应用场景来决定。

2. 什么是SpringMVC?

Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

3. Spring MVC优点

  • 清晰地角色划分,Spring MVC 在 Model、View 和 Controller 方面提供了一个非常清晰的角色划分,这 3 个方面真正是各司其职,各负其责。
    灵活的配置功能,可以把类当作 Bean 通过 XML 进行配置。
  • 提供了大量的控制器接口和实现类,开发者可以使用 Spring 提供的控制器实现类,也可以自己实现控制器接口。
  • 真正做到与 View 层的实现无关。它不会强制开发者使用 JSP,可以根据项目需求使用 Velocity、FreeMarker 等技术。
  • 国际化支持
  • 面向接口编程
  • 与 Spring 框架无缝集成

4. Spring MVC和Struts2的区别

1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。

2、由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。
3、由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。

4、 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。

5、SpringMVC的入口是servlet,而Struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。

6、SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。

7、SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。

8、Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。

9、 设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。

10、SpringMVC开发效率和性能高于Struts2。
11、SpringMVC可以认为已经100%零配置。

5. SpringMVC使用

1)导入jar包依赖
2)Web.xml文件中配置springmvc的核心servlet
3)配置springmvc的配置文件
4)编写Controller层代码

6.SpringMVC执行流程

在这里插入图片描述

SpringMVC 的执行流程如下。

1.用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
2.由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
3.DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
4.HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
5.Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
6.HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
7.DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
8.ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
9.DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
10.视图负责将结果显示到浏览器(客户端)。# 7.Spring MVC传递参数
1.通过实体 Bean 接收请求参数
2.通过处理方法的形参接收请求参数
3.通过 HttpServletRequest 接收请求参数
4.通过 @PathVariable 接收 URL 中的请求参数
5.通过 @RequestParam 接收请求参数
6.通过 @ModelAttribute 接收请求参数
详情参考:http://c.biancheng.net/spring_mvc/pass-param.html

8.SpringMVC怎么样设定重定向和转发的?

请求转发与重定向的区别
1.请求转发在服务器端完成的;重定向是在客户端完成的。
2.请求转发的速度快;重定向速度慢。
3.请求转发的是同一次请求;重定向是两次不同请求。
4.请求转发不会执行转发后的代码;重定向会执行重定向之后的代码。
5.请求转发地址栏没有变化;重定向地址栏有变化。
6.请求转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成。
原文链接:https://blog.csdn.net/weixin_44176169/article/details/104852285
(1)在返回值前面加"forward:“就可以让结果转发,譬如"forward:user.do?name=method4”

@RequestParam("/login")
public String redirect(User user){
    if{
        //登录成功...
    }else{
        //登录失败,转发到登录页面
        return "forward:tologin";
    }
}

(2)在返回值前面加"redirect:“就可以让返回值重定向,譬如"redirect:http://www.baidu.com”

@RequestParam("/login")
public String redirect(User user){
    if{
        //登录成功...
    }else{
        //登录失败,重定向到登录页面
        return "redirect:tologin";
    }
}

9.SpringMVC的常用注解

@Controller
@Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。处理器适配器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。

@RequsestMapping
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。返回值会通过视图解析器解析为实际的物理视图,对于 InternalResourceViewResolver 视图解析器,通过 prefix + returnValue + suffix 这样的方式得到实际的物理视图,然后做转发操作。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
</bean>

@RequsestMapping有如下6个属性

1.value:指定请求的实际地址。
2.method:指定请求的method类型, GET、POST、PUT、DELETE等。
3.consumes:指定处理请求的提交内容类型(Content-Type),例如 application/json, text/html。
4.produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
5.params:指定request中必须包含某些参数值是,才让该方法处理。
6.headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

@ResponseBody
@ResponseBody把Java对象转化为json对象,这种方式用于Ajax异步请求,返回的不是一个页面而是JSON格式的数据。

@Valid
标志参数被Hibernate-Validator校验框架校验。

@PathVariable
1.@PathVariable用于接收uri地址传过来的参数,Url中可以通过一个或多个{Xxx}占位符映射,通过@PathVariable可以绑定占位符参数到方法参数中,在RestFul接口风格中经常使用。
2.例如:请求URL:http://localhost/user/21/张三/query
(Long类型可以根据需求改变为String或int,SpringMVC会自动做转换)

@RequestMapping("/user/{userId}/{userName}/query")
public User query(@PathVariable("userId") Long userId, @PathVariable("userName") String userName){

}

@RequestParam
@RequestParam用于将请求参数映射到控制器方法的形参上,有如下三个属性

1.value:参数名。
2.required:是否必需,默认为true,表示请求参数中必须包含该参数,如果不包含抛出异常。
3.defaultValue:默认参数值,如果设置了该值自动将required设置为false,如果参数中没有包含该参数则使用默认值。
4.示例:@RequestParam(value = “pageNum”, required = false, defaultValue = “1”)

@ControllerAdvice
@ControllerAdvice标识一个类是全局异常处理类。

@ControllerAdvice
public class ControllerTest {
    //全局异常处理类
}

@ExceptionHandler
@ExceptionHandler标识一个方法为全局异常处理的方法。

@ExceptionHandler
public void ExceptionHandler(){
    //全局异常处理逻辑...
}

10.如何解决POST请求中文乱码问题,GET的又如何处理呢?

JavaWeb乱码问题一般是客户端(浏览器)与服务器端字符集不一致产生的,如果两者字符集一致就不会出现乱码问题。

解决post请求乱码
SpringMVC默认提供一个解决post请求乱码的过滤器,在web.xml中配置即可

<filter>
    <filter-name>characterEncodingFilter</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>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

解决get请求乱码

1.修改tomcat配置文件添加编码与工程编码一致。

<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

2.对请求参数进行重新编码,ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码.

String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8");

11. SpringMVC用什么对象从后台向前台传递数据的?(SpringMVC向页面传值的方式)

可以使用ModelAndView,Model,ModelMap或者使用request,前台可以通过el表达式拿到。

12. SpringMVC中获取request,response,session对象

直接在方法参数中定义即可使用,SpringMVC会自动注入对象。

13. SpringMVC中拦截器的使用:

SpringMVC拦截器 implements HandlerInterceptor
实现3个方法:
preHandler
postHandler
AfterCompletion
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14. SpringMVC上传和下载

文件上传
在这里插入图片描述
文件下载
在这里插入图片描述

参考文档:http://c.biancheng.net/spring_mvc/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值