SpringMVC 配置和请求方式
总结内容
一、什么是 Spring MVC ?
Spring MVC 是 Spring 对 MVC 思想的实现(三层架构)
优点:
- 它解决 Web 开发中常见的问题(参数接收、文件上传、表单验证、国际化等),而且使用简单
- 最优秀的 MVC 框架 (更安全,性能更好,更简单)
- 支持 RESTful 风格的 URL 请求 ,非常容易与其他视图技术集成,如 Velocity、FreeMarker、JSP 等。
- 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。
二、前端控制器
在 MVC 框架中都存在,是一个入口控制器(Controller),用来集中统一处理请求,
=> 然后把请求分发给相应的处理程序。
=> 因此提高了可重用性 和 可拓展性。
Spring MVC 中的前端控制器:
**Spring MVC:**它提供了一个 DispatcherServlet 类作为前端控制器,所以要使用它必须在 web.xml 中配置。
配置前端控制器:
<!--在 main 目录新建 webapp/WEB-INF/web.xml--> <!--添加如下内容-->
<!-- Spring MVC 前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定 Spring 容器启动加载 Spring MVC的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<!-- Tomcat 时启动初始化该 前端控制器 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置:mvc.xml
<!-- 配置 IoC DI 注解解析器,让 Spring 我们创建 XxxController 类的对象 -->
<context:component-scan base-package="cn.wolfcode.web.controller"/>
<!-- MVC 注解解析器 -->
<mvc:annotation-driven/>
编写处理器类:
@Controller
public class HelloController {
//用来处理请求地址映射的注解,可用于类或方法上
@RequestMapping("/hello")
public ModelAndView save() {
// 通过创建这个类对象,告诉 Spring MVC 找什么视图文件,往作用域或者说往模型中存入什么数据
ModelAndView mv = new ModelAndView();
// 往作用域或者模型中存入数据
mv.addObject("msg", "Hello Spring MVC");
// 找视图 类似 请求转发
mv.setViewName("/WEB-INF/views/hello.jsp");
return mv;
}
}
三、映射路径问题
Tomcat容器:
- 静态资源请求 :处理静态资源是交由内置的 DefaultServlet 来处理的(拦截路径是 /)
- jsp请求:处理 JSP 资源是交 由内置的 JspServlet 处理的(拦截路径是*.jsp | *.jspx)
- 其他请求:(自定义拦截),由具体是servlet处理。如 Spring MVC 就由DispatcherServlet处理。
项目启动,先加载(Tomcat)容器的 web.xml,而后加载项目中的 web.xml。
=> 当拦截路径在两者文件中配置的 一样,后面会覆盖掉前者。
项目启动,解析web.xml,创建所有配置的 Servlet、Filter、Listener…这些对象,由Tomcat管理。
=>而,在web.xml里配置的DispatcherServlet类里的,所有的在 mvc.xml里解析配置了注解的
XxxServlet类创建出来,并交由Spring来管理。
Spring MVC:DispatcherServlet类,推荐(拦截路径是 /)
问题:
如果 DispatcherServlet类里配置了 / 或 /*
=> 所有 静态资源 或 (静态资源和 JSP) 都会交由前端控制器处理,
=>但,由于项目里的的XxxControlle类配置了具体的访问路径 如("/hello")
=>所以,会导致访问静态资源和 JSP 被拦截(访问不到)
解决:
1、修改前端控制器的映射路径:
<!--访问控制器里的处理方法时,请求路径须携带 .do。-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2、在 mvc.xml 配置
<mvc:default-servlet-handler/>
它就会对进入 DispatcherServlet 的请求进行筛查,
=> 若不是映射的请求,就将该请求交由容器默认的 Servlet 处理。
四、处理响应
1、返回 ModelAndView:上面有例子
2、返回String (要共享数据,和 Model 参数组合使用,用其往作用域或模型中存 入数据。)
@Controller
public class ResponseController {
// 提供方法处理请求,localhost/hello2
@RequestMapping("/hello2")
public String resp2(Model model) {
// 往作用域或者模型中存入数据
model.addAttribute("msg", "方法返回类型是 String");
// 返回视图名
return "/WEB-INF/views/hello.jsp"; //消除前后缀之后 => return hello;
}
}
消除视图前缀和后缀:mvc.xml
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/views/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
请求转发及 URL 重定向:
- 请求转发: 例
return "forword:/WEB-INF/views/hello.jsp";
- 重定向: 例
return "redirect:/static/demo.html";
注意:
- 加了 /,使用是绝对路径(推荐使用),从项目根路径找( “redirect:/…”)
- 没加 /,使用是相对路径,相对于上一次访问上下文路径的上一级找( “redirect:…”)
五、处理参数
1、请求参数名和处理方法方法的形参同名:(推荐使用包装类)
2、不同名可以使用注解:@RequestParam(“username”)String name ,
3、处理复合类型请求参数:(Spring 会帮你封装好)
数组类型:可以使用对应类型的数据
自定义类型:(使用类来封装:注意传递参数名与封装对象的属性名一致)=> 底层通过set方法
日期类型:
// 在方法上
public ModelAndView resp(@DateTimeFormat(pattern="yyyy-MM-dd")Date date){...}
// 在类字段上,贴注解
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date date;
4、ModelAttribute 注解:
// 给形参贴 @ModelAttribute,用来修改存在模型中使用的 key
public String resp7(@ModelAttribute("u")User user) {...}
${u} //jsp页面回显数据
//没给形参贴@ModelAttribute时,模型对象model是用形参的类型来作为key
//这里处理方法返回类型是String,mvc会创建Model对象,并自动储存User对象,并以形参的类型来作为key,因此处理方法无需把model对象传进来用于存储User对象
//如果处理方法返回类型是ModelAndView,则需自行调用ModelAndView的addObject方法把User对象存入作用域
//形参必须是自定义类型,否则mvc创建model对象不会自动存储,需自行把module对象传进来以便存储
@RequestMapping("/noUseModelAttribute")
public String noUseModelAttribute(User user) {
return “modelAttribute”;
}
六、文件上传
1、设置文件上传大小(在web.xml 里的 标签里添加)
<multipart-config>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
</multipart-config>
2、配置上传解析器:
<!--这里 bean 名称是固定的,必须为multipartResolver-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>
3、编写上传控制器:
@Controller
public class UploadController {
// Spring 容器存在 ServletContext 类型的对象,
//所以定义好 ServletContext 类型字段贴 @Autowired 注解即可获取到
@Autowired
private ServletContext servletContext;
@RequestMapping("/upload")
public ModelAndView upload(Part pic) throws Exception {
pic.getContentType(); // 文件类型
pic.getName(); // 文件参数名
pic.getSize(); // 文件大小
pic.getInputStream(); // 文件输入流
// FileCopyUtils.copy(in, out),一个 Spring 提供的拷贝方法
// 获取项目 webapp 目录下 uploadDir 目录的绝对路径
servletContext.getRealPath("/uploadDir");
return null;
}
}
七、拦截器
作用:Spring MVC 提供的,主要用于对请求访问 控制器的方法进行拦截,项目中用于登录与权限等判断。
自定义拦截器:
定义一个类实现 HandlerInterceptor :
public class MyInterceptor implements HandlerInterceptor {
// 处理方法之前 , true 放行 ; false 拦截
public boolean preHandle(...){...} // 处理方法之后,渲染视图之前
public void postHandle(...){...} // 渲染视图之后
public void afterCompletion(...){...}
}
配置拦截器 mvc.xml
<mvc:interceptors>
<!-- 配置拦截器 -->
<mvc:interceptor>
<!-- 拦截的路径 -->
<mvc:mapping path="/**"/>
<!-- 被排除的路径
<mvc:exclude-mapping path="排除的路径"/> -->
<!-- 拦截器类 -->
<bean class="cn.wolfcode.web.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
注:若配置 /** 则会拦截所有进入 前端控制器的请求;
若是 /* ,不会拦截多层的请求如: /a/b /static/hello.html
八、乱码处理
get请求:Tomcat 8之后已经解决了。
post请求:在 web.xml 直接使用 Spring MVC 内置的过滤器来处理。
<!-- 编码过滤器,仅针对 POST 方式 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filterclass>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>
总结
以上就是对 Spring 和 SpringMVC 常用注解常用注解的总结了,代码仅供参考,欢迎讨论交流。
SpringMVC 配置和请求方式的更多相关文章
- SpringMVC(四) RequestMapping请求方式
常见的Rest API的Get和POST的测试参考代码如下,其中web.xml和Springmvc的配置文件参考HelloWorld测试代码中的配置. 控制类的代码如下: package com.ti ...
- springmvc 配置异步请求
最开始按照网上配置了一个servlet class 没有继承Filter .结果报错.网上有文章说是tomcat 启动加载的servlet-3.0- api 加载了 tomcat 安装目录下lib里边 ...
- springmvc配置首页的方式
<mvc:view-controller path="/" view-name="redirect:/user/loginUI" />
- SpringMVC(二):RequestMapping修饰类、指定请求方式、请求参数或请求头、支持Ant路径
@RequestMapping用来映射请求:RequestMapping可以修饰方法外,还可以修饰类 1)SpringMVC使用@RequestMapping注解为控制指定可以处理哪些URL请求: 2 ...
- 【spring springmvc】这里有你想要的SpringMVC的REST风格的四种请求方式
概述 之前的文章springmvc使用注解声明控制器与请求映射有简单提到过控制器与请求映射,这一次就详细讲解一下SpringMVC的REST风格的四种请求方式及其使用方法. 你能get的知识点 1.什 ...
- springmvc国际化 基于请求的国际化配置
springmvc国际化 基于请求的国际化配置 基于请求的国际化配置是指,在当前请求内,国际化配置生效,否则自动以浏览器为主. 项目结构图: 说明:properties文件中为国际化资源文件.格式相关 ...
- SpringMVC的REST风格的四种请求方式
一. 在HTTP 协议里面,四个表示操作方式的动词:GET.POST.PUT.DELETE. ·它们分别对应四种基本操作: 1.GET ====== 获 取资源 2.POST ======新建资源 ...
- springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。
springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误. 1.场景 如果在web.xml中servlet-mapping的url-pattern设置的是 ...
- 第二节(RequestMapping请求方式)学习尚硅谷-springmvc视频教程
项目中,创建测试类SpringMVCTest @Controller @RequestMapping("/springmvc1") public class SpringMVCTe ...
随机推荐
- python+pytest接口自动化(5)-发送post请求
简介 在HTTP协议中,与get请求把请求参数直接放在url中不同,post请求的请求数据需通过消息主体(request body)中传递. 且协议中并没有规定post请求的请求数据必须使用什么样的编 ...
- k8s线上某些特殊情况强制删除 StatefulSet 的 Pod 要考虑什么隐患?
k8s线上某些特殊情况强制删除 StatefulSet 的 Pod 要考虑什么隐患? 考点之什么情况下,需要强制删除 StatefulSet 的 Pod? 考点之如果 StatefulSet 操作不当 ...
- tp 七牛云文件上传
1.先创建好七牛云账号和存储空间 申请七牛云账号: 创建七牛云存储空间: 在账号的秘钥管理里面创建秘钥 获取AccessKey / SecretKey: 2.集成PHP-SDK 七牛云开发文档:htt ...
- cookie、session和Storage
概念: cookie:HTTP响应头的一部分,通过name=value的形式存储,主要用于保存登录信息.在设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭. 存放数据大小为4K左右 .有个 ...
- 【系列】关于NJUPT电赛自控方向第一次积分赛的总结
本人是NJUPT电子科学与技术专业大一摸鱼狗一枚.本博客旨在总结与分享个人准备电赛所学知识,同时也是为了防止遗忘,锻炼写文章的能力.目前电赛方向为自控方向.主要研究方向为单片机.图像处理.自动控制相关 ...
- 使用SymPy
最近工作的原因,需要进行一些积分运算,通过一些搜索得知了SymPy,记录一下使用历程. 1. SymPy介绍 SymPy是关于Symbolic Mathematics的Python库,它旨在成为一个功 ...
- 内网穿透工具--NPS
一.简介 NPS是一款轻量级,高性能,强大功能的内网穿透代理服务器.目前支持TCP,UDP流量转发,可支持任何TCP,UDP上层协议(访问内网网站,本地支付接口调试,SSH访问,远程桌面,内网dns解 ...
- 域渗透 | kerberos认证及过程中产生的攻击
文章首发于公众号<Z2O安全攻防> 直接公众号文章复制过来的,排版可能有点乱, 可以去公众号看. https://mp.weixin.qq.com/s/WMGkQoMnQdyG8UmS ...
- uoj266[清华集训2016]Alice和Bob又在玩游戏(SG函数)
uoj266[清华集训2016]Alice和Bob又在玩游戏(SG函数) uoj 题解时间 考虑如何求出每棵树(子树)的 $ SG $ . 众所周知一个状态的 $ SG $ 是其后继的 $ mex $ ...
- 如何在vscode中编写.net core 项目(vscode)
1.下载拓展 .NET Core Extension Pack (作者:保哥) 这个里面将需要的插件都打包了小白一键下载就好了 2.下载扩展 vscode-solution-explorer ...