一.Spring Web 框架介绍
-
MVC思想
-
Spring MVC:是Spring对MVC的思想实现
(1)Servlet:Web服务的模块,包含对MVC与REST的实现,Spring MVC
(2)Web:提供与Web的继承,基于Web应用程序上下文.
(3)WebSocket:实现客户端与服务端主动通信。
(4)Portlet:提供了在 Portlet 环境中实现 MVC。
-
好处:
(1)它解决Web开发中常见的问题(参数接收,文件上传,表单验证,国际化),使用简单,与Spring无缝集成.
(2)支持RESTful风格的URL请求,非常容易与其他视图技术集成.
(2性能好,简单,安全,采用了松散耦合可插拔组件结构,比其他MVC框架更具扩展性和灵活性.
二.前端控制器(Controller)
-
在MVC框架中都存在有个前端控制器,在WEB应用的前端(Front)设置一个入口控制器,用来提供一个集中的请求处理机制,所有的请求都被发往该控制器统一处理==>然后分发给各自的处理程序==>一般用来做一个共同的处理==>提高了可重用性和可拓展性.
-
Spring MVC中的前端控制器==DispatcherServlet类(要在web.xml中配置)
-
配置前端控制器,在 main 目录新建 webapp/WEB-INF/web.xml
<servlet> <servlet-name>dispatcherServlet</servlet-name> <servletclass>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定 Spring 容器启动加载的配置文件--> <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>
-
配置Spring MVC文件
在 resources 目录下新建 mvc.xml,配置如下
<!--配置IoC DI注解解析器--> <context:component-scan base-package="cn.wolfcode.web.controller"/> <!--配置MVC注解解析器--> <mvc:annotation-driven/> <!--dispatcherServlet映路径为/,可以访问静态资源--> <mvc:default-servlet-handler/> <!--消除视图的前缀和后缀--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--视图前缀--> <property name="prefix" value="/WEB-INF/views/"/> <!--视图后缀--> <property name="suffix" value=".jsp"/> </bean> <!--配置上传解析器--> <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/> <!--配置拦截器--> <mvc:interceptors> <!-- 配置拦截器 --> <mvc:interceptor> <!-- 拦截的路径 --> <mvc:mapping path="/**"/> <!-- 被排除的路径 <mvc:exclude-mapping path="排除的路径"/> --> <!-- 拦截器类 --> <bean class="cn.wolfcode.web.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
三.MVC注解
-
RequestMapping 注解:是一个用来处理请求地址映射的注解,可以用于类或方法上,需要
-
<!--配置MVC注解解析器--> mvc:annotation-driven/
四.其他注解
-
@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解) eg:处理请求参数名和处理方法的形参不同名的问题.
-
@Controller:IoC注解,贴在类上,spring创建类对象
-
(@DateTimeFormat(pattern="yyyy-MM-dd")Date date) 对日期进行格式化.
-
@ModelAttribute: (1)被@ModelAttribute注解的方法会在所有的controller方法执行之前执行 (2)@ModelAttribute在方法的参数上从model中获取值 eg:(1) @ModelAttribute public void showUser(String name){ System.out.println("showUser"); } (2) @RequestMapping("/req7") // 给形参贴 @ModelAttribute,用来修改存在模型中使用的 key public String resp7(@ModelAttribute("u")User user) { return "m"; }
五.前端控制器(DispatcherServlet)映射路径
-
映射路径
(1).do==>可以访问静态文件,但不支持RESTful风格,想要访问控制器里的处理方法,请求路径必须携带.do
(2)/==>可以支持流行的RESTful风格,但会导致访问不了静态资源.原因是
==>先加载容器的web.xml,再加载项目中的web.xml,
==>当拦截路径一致时,后者会覆盖前者,
==>所有静态资源会交给前端控制器处理
==>而处理静态资源是交由内置 DefaultServlet 来处理的
解决:在mvc.xml中配置:mvc:default-servlet-handler/即可
对进入 DispatcherServlet 的静态资源的请求,会创建对象去交给DefaultServlet 处理
2.
六.处理响应
-
在控制器里面编写处理方法接收请求做响应(往作用域中存入数据和找视图文件(可以写配置消除前后缀)),一般处理方法返回的类型为 ModelAndView 和 String
-
@Controller public class ResponseController { // 提供方法处理请求,localhost/resp1 @RequestMapping("/resp1") public ModelAndView resp1() { // 通过创建这个类对象,告诉 Spring MVC 找什么视图文件, 往作用域或者说往模型中存入什 么数据 ModelAndView mv = new ModelAndView(); // 往作用域或者模型中存入数据 mv.addObject("msg", "方法返回类型是 ModelAndView"); // 找视图 mv.setViewName("/WEB-INF/views/resp.jsp"); return mv; }
@Controller public class ResponseController { // 提供方法处理请求,localhost/resp2 @RequestMapping("/resp2") public String resp2(Model model) { // 往作用域或者模型中存入数据 model.addAttribute("msg", "方法返回类型是 String"); // 返回视图名 return "/WEB-INF/views/resp.jsp"; } }
-
String==>return null==>会找视图,找不到报错
ModelAndView==>return null=>不会找视图
七.请求转发和重定向
-
public String forward() { return "forward:/WEB-INF/views/welcome.jsp"; } public String redirect() { return "redirect:/static/demo.html"; }
八.处理请求参数
-
简单类型
@Controller public class RequestController { @RequestMapping("/req2") // 此时请求参数为 name,而形参名为 username public ModelAndView resp2(@RequestParam("username")String name, int age) { System.out.println(name); System.out.println(age); return null; } }
-
复合类型(数组和自定义类型)
注意:传递参数名与封装对象的属性名一致
//请求路径 /req3?ids=1&ids=2&ids=3 @Controller public class RequestController { @RequestMapping("/req3") public ModelAndView resp3(Long[] ids) { System.out.println(Arrays.toString(ids)); return null; } }
// /req4?username=hehe&password=666 public class User { private Long id; private String Username; private String password; // setter getter toString } @Controller public class RequestController { @RequestMapping("/req4") public ModelAndView resp4(User user) { System.out.println(user); return null } }
-
日期类型
@DateTimeFormat
// /req5?date=2020-05-19 @Controller public class RequestController { @RequestMapping("/req5") // 注意形参的类型为 java.util.Date public ModelAndView resp5(@DateTimeFormat(pattern="yyyy-MM-dd")Date date) { System.out.println(date.toLocaleString()); return null; } }
九.拦截器
-
Spring MVC提供,若配置在Spring MVC配置文件中,则被Spring容器管理
-
作用:主要用于对请求访问控制器的方法进行拦截,用于登录与权限判断.
-
在mvc.xml中配置拦截器
-
public class MyInterceptor implements HandlerInterceptor { //前置拦截 //若返回true,放行访问控制器的处理方法 //若返回false,阻止访问孔子器的处理方法 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); return true; } }
-
十.Spring MVC执行流程