SpringMVC学习

SpringMVC是javaEE项目表述层开发首选

主要作用:简化前端参数接收与后端数据响应

SpringMVC结构

DispatcherServlet用于处理所有请求,与其他组件联络。要使用web.xml配置(SpringMVC提供)

handlerMapping用于缓存handler方法和地址,放入IoC容器即可(SpringMVC提供)

handlerAdapter适配器,用于简化参数和响应,连接用户和controller,放入IoC容器即可(SpringMVC提供)

Handler又称处理器,是Controller类内部方法的简称,自定义用来接收参数,调用业务,返回响应结果

viewResolver用于查找视图页面,允许用简单的名字查找对应视图,放入IoC容器即可(SpringMVC提供)后端如果返回JSON数据,不返回页面则不需要视图解析器

SpringMVC使用流程

1.声明@Controller方法,return给前端,在方法前加注解@RequestMapping("对外访问地址"),相当于在handlerMapping中注册。加注解@ResponseBody表示直接返回字符串,给前端,不找视图解析器

2.指定RequestMappingHandlerMapping和RequestMappingHandlerAdapter方法,返回new 对象,放入IoC容器中(在创建方法前加@Bean注解),在mvcConfig注解类前加@Configuration注解和@ComponentScan("Controller方法所在的包")

3.写SpringMvcInit类继承抽象类接口AbstractAnnotationConfigDispatcherServletInitializer

接收数据

路径设置注解

精准地址@RequestMapping({"地址一,地址二"})

模糊地址/文件名/*表示文件下任意单层字符串,**表示任意层任意字符串

可以在类上和方法上添加该注解,访问时通过类地址+方法地址访问,方法上没有注解则直接通过类地址访问

默认情况下,任何请求方式都可以访问该地址

修改为POST方式访问,在注解中添加属性:method={RequestMethod.POST,...,}

不符合请求方式会报405异常

可以使用@GetMapping等注解,代替method={RequestMethod.POST,...,}(只能用在方法上)

param和json区别

param  key=value&key=value

使用ASCII码

参数无序

仅支持字符串类型,数值类型和布尔类型等简单数据类型

不支持嵌套

简单易读

在GET请求中使用

json  {key:value,key:value}

使用UTF-8编码

参数有序

支持复杂类型,如数组,对象等

支持嵌套

在复杂数据结构中更易读

在POST请求中使用

param参数接收

1.参数名=形参名可以直接接值,但是需要传入参数名与形参名一致,并且不传入也不会报错

2.@RequestParam注解,指定绑定的请求参数名,要求请求参数必须传递,不传递则为请求参数提供默认值

@RequestParam注解加入在形参前,属性value为绑定的请求参数名,如果与形参名一致则可以省略,属性required为true则必须传递,不传会报400异常,为false则不必须传递,可以设置defaultValue为默认值

3.一个形参对应多个值,则必须加@RequestParam注解

如果不加注解会将字符串赋值给集合,会报类型异常,加了注解则会使用add方法加入对应字符串

4.使用对象接值,只需要准备一个含有set和get要接收属性方法的实体类即可,多传值不会报错,少传值可以设置默认值

路径参数接收

1.设置动态路径,在@RequestMapping("{参数一}/{参数二}")

2.接受动态路径参数,在形参前加@PathVarible注解,参数名不相同时,只需要@PathVarible("指定路径注解中参数名")即可

json参数接收

1.创建一个接收参数的类

2.接收参数使用该类接收,在前面加@RequestBody注解

java原生api只支持路径参数和param参数,不支持json,会报415异常

要使用该方法需要1.导入json依赖进入pom.xml,2.handlerAdapter配置json转化器,在config类中加入@EnableWebMvc注解

@EnableWebMvc注解

写在MvcConfig类中,不需要自己再创建handlerMapping和handlerAdapter对象

该注解会添加handlerMapping和handlerAdapter,并且会给handlerAdapter添加Jacksonjson处理器

接收cookie数据

在接收的形参前加@CookieValue(value=CookieName)注解

接收请求头在形参前加@RequestHeader(CookieName)

获取原生对象

httpServletRequest,response,session

可以直接在形参列表传入,并且不分先后顺序

要获取ServletContext对象可以通过get方法获取,也可以声明全局变量然后直接AutoWired自动装入IoC容器

响应数据

每个处理业务的方法是一个handler

简化响应数据主要靠简化return值

返回逻辑视图

通过视图解析器指定前后缀

1.在WEB-INF文件夹下创建jsp文件

2.MvcConfig实现WebMvcConfigurer接口,简化组件创建

重写configureViewResolvers方法,通过registry.jsp(路径前缀,路径后缀)设置

3.创建初始化类SpringMVCInit,放入MvcConfig.class和/

3.要查找视图需要返回字符串类型,并且不能添加@ResponseBody,返回值返回视图名称即可

请求转发和响应重定向

请求转发时返回值为字符串,return “forward:/转发地址”

转发只能是项目下的资源,地址为项目下次地址,写根地址后的地址即可

响应重定向时返回值为字符串,return “redirect:/重定向地址”

重定向可以是项目外的资源,属于二次请求,项目下的地址不要写成全地址(SpringMvc协助处理)

不能添加@ResponseBody

返回JSON数据

1.导入依赖

2.使用@EnableWebMvc注解,可以加入json处理器

在返回方法或类前加@ResponseBody注解返回JSON对象,方法返回直接返回类即可

可以用@RestController注解,代替@Controller和@ResponseBody

返回静态资源

正常静态资源会通过handlerMapping寻找,但是找不到对应路径对应的handler方法,所以会报404

想要找到静态资源要通过配置类中重写configureDefaultServletHanding方法,在里面设置configurer.enable()开启静态资源查找

实际是通过DefaultServletHandler方法handlerRequest传入路径,进行转发寻找真实资源

RESTFul风格

http协议的标准使用方案和风格,规范了路径设计,参数传递,请求方式选择

风格特点:1.每个URI代表一种资源

2.客户端使用GET获取资源,POST新建或更新资源,PUT更新资源,DELETE删除资源

3.资源表现形式是XML或JSON

4.客户端与服务端交互在请求间是无状态的,从客户端到服务端每个请求都必须包含理解请求所必须的信息

路径中不要添加动作,不同动作通过请求方式区分,路径中仅作为名词

优点:含蓄安全,风格统一,无状态,严谨规范,简洁优雅

传参方式

请求参数最好在十个以内

敏感信息使用POST传参

get和delete方式没有请求体,只能用路径传参和param传参。参数为id时使用路径传参,范围参数使用param传参

POST和put方式有请求体,可以用三种方法传参,一般用json方式传参

异常处理机制

可以通过编程显式处理异常

可以将异常处理的逻辑从具体业务逻辑中分离出来,通过配置进行统一管理处理,可以从架构层面统一处理异常

单独处理异常的类前加@ControllerAdvice注解,表示发生异常会进入该类处理,根据方法前的@ExceptionHandler(异常类)寻找方法处理。指定的异常可以精确查找或查找父异常

@RestControllerAdvice注解表示@ControllerAdvice加@ResponseBody注解

拦截器

与过滤器对比

相似点:都需要先拦截请求;存在的意义是对请求统一处理;对请求执行了必要操作后放行,

不同点:过滤器工作在Servlet容器中,拦截器工作在SpringMVC基础上;过滤器能拦截整个Web应用,拦截器能拦截整个SpringMVC负责的请求;过滤器想得到IOC容器需要专门的工具方法间接获得,拦截器本身就在IOC容器中,可以直接装配组件

拦截器使用

1.创建拦截器类,实现HandlerInterceptor接口

2.重写方法

preHandle(request,response,handler),请求执行前触发,返回true表示放行

postHandle(request,response,handler,viewer),请求执行后触发,检查结果

afterCompletion(request,response,handler,ex),整体处理完毕后触发,

3.在配置类中配置,addInterceptors(InterceptorRegistry registry){

拦截全部请求

registry.addInterceptor(new 拦截器对象)

指定地址拦截(也可以通过*和**模糊一层或多层字符串)

registry.addInterceptor(new 拦截器对象).addPathPatterns(路径)

排除拦截(排除地址应该在拦截地址范围内)

registry.addInterceptor(new 拦截器对象).addPathPatterns(路径).excludePathPatterns(路径)

}

参数校验

通过JSR-303提供参数校验注解,通过hibernate框架实现,被SpringMVC支持

@NotNull表示包装类型不为null

@NotEmpty检查集合属性是否为null或size==0

@NotBlank检查字符串是否为null或空字符串

使用流程:

1.在实体类属性中添加校验注解

2.在Handler方法接收的形参前加@Validated注解

自己接受错误绑定信息,自定义返回结果:1.在校验对象后加Binding result形参,要紧挨着校验对象

2.if(result.hasErrors()){}有绑定错误就不直接返回,而是自己决定

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值