MVC框架
MVC框架开发的项目一定是MVC结构的,其开发是Controller层代码,底层还是Servlet
常见的框架:Struts框架,Struts2框架,SpringMVC框架
SpringMVC框架本身就是spring,能和Spring框架无缝整合,提供了Controller基本的功能的简单操作,提供文件上传下载的功能,Ajax处理的简单操作,拦截器功能。
MVC框架具有的功能:
1.搭建框架,实现客户端通过url方法到MVC框架的控制器
2.从客户端向控制器发送请求参数
3.控制器向视图层或控制器层进行跳转
4.控制器向视图层或控制器层传值
5.多业务方法的实现
6.如何调用ServletAPl
7.具备文件的上传和下载功能
8.拦截器功能
9.对Ajax请求响应的处理
SpringMVC框架的工作过程
浏览器发送请求给核心控制器DispatcherServlet。到HandlerMapping中查找是否有请求URL映射的控制器方法
如果没有响应404,如果存在,先经过HandlerAdapter对请求进行处理(参数值注入,参数值的类型处理),有
映射的控制器方法处理请求,控制器向核心控制器DispatcherServlet发送一个ModelAndView对象,其中包括了
发个视图层的数据和跳转地址,核心控制器经过视图解析对地址进行处理(为地址添加前缀和后缀),最后由
核心控制器完成向视图层传值并跳转的实现,视图层将html代码和数据发给客户端。
1.SpringMVC的搭建
(1)导入SpringMVC依赖
<groupId>com.oracle</groupId> <artifactId>SpringMVCDemo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <properties> <org.springframework.version>4.3.12.RELEASE</org.springframework.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1-b08</version> </dependency> </dependencies>
(2)创建Mavenweb模块
(3)在Web.xml配置DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 可以自定义servlet.xml配置文件的位置和名称,默认为WEB-INF目录下,名称为[<servletname>]-servlet.xml,如spring-servlet.xml <init-param> <param-name>contextConfigLocation</param-name> 4. 在resource下创建spring-servlet.xml并配置 2. 通过请求的URL访问Controller的方法 1. 创建Controller类,一定要在扫描的包下(com.oracle.controller),一定要有@Controller注解,这个控制器就 会被注册在Spring容器中,配合@RequestMapping注解实现控制器方法和地址的映射 <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
(4)在resource下创建spring-servlet.xml并配置
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"> <!-- 这个元素包含了 HandlerMapping 和 HandlerAdapter 两个bean的配置 开启注解模式 --> <mvc:annotation-driven/> <context:component-scan base-package="com.oracle.controller"></context:component-scan> <!-- 由于客户端的所有请求交给SpringMVC核心控制器处理 有些静态资源(js、图片、样式)的路径引用也交给了核心控制器处理 对静态资源的地址进行定向处理 --> <!-- <mvc:resources mapping="/js/**" location="/js/" /> <mvc:resources mapping="/style/**" location="/style/" /> <mvc:resources mapping="/upload/**" location="/upload/" />--> </beans>
(5)创建Controller模块
@RequestMapping("/demo") public class DemoController { //test方法映射的地址是 /demo/test1 @RequestMapping("/test1") public void test1(){ System.out.println(" 执行了 test1方法"); } } @
2.跳转
控制器方法 有两种跳转写法
1.方法返回一个ModelAndView对象,将跳转的地址封装到这个对象。
@RequestMapping("/test7") public ModelAndView test7(){ //向project/list.jsp跳转 ,默认向jsp请求转发跳转 ModelAndView mav = new ModelAndView("/pages/project/list.jsp"); return mav; }
2.控制器方法返回一个spring,就是跳转地址的字符串,SpringMVC也会将字符串自动封装为ModelAndView对象,交给DispathcerServlet(核心控制器)
@RequestMapping("/test8") public String test8(){ //默认向jsp请求转发跳转 return "/pages/project/add.jsp"; }
3.视图解析器
可以在springMVC的配置文件中配置一个事务解析器的bean,为跳转地址添加前缀和后缀
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/pages/"></property> <property name="suffix" value=".jsp"></property> </bean> @RequestMapping("/test7") public ModelAndView test7(){ //向project/list.jsp跳转 ,默认向jsp请求转发跳转 ModelAndView mav = new ModelAndView("/project/list"); return mav; } @RequestMapping("/test8") public String test8(){ //默认向jsp请求转发跳转 return "/project/add"; }
在跳转的路径自字符串中可以加forward:或redirect:跳转就不经过视图解析器了
请求转发跳转和重定向跳转,一共有四种情况
1)控制器 请求转发 跳转视图层
经过视图解析器:写跳转地址的字符串
不经过视图解析器:forward:跳转地址
2.控制器 重定向 跳转到视图层
redirect:跳转的视图地址
3.控制器 请求转发 跳转到控制器
不能经过视图解析器,forward:跳转的控制器的地址
4.控制器 重定向 跳转到控制器 redirect:跳转的控制器的地址
@RequestMapping("/test9") public String test9(){ //跳转到index.jsp 请求转发方式 //return "forward:/index.jsp"; //跳转到index.jsp 重定向方式 //return "redirect:/index.jsp"; //跳转到 test1 请求转发方式 //return "forward:/demo/test1"; //跳转到 test1 重定向方式 return "redirect:/demo/test1"; }
4.向视图层传值
(1)方式一:
通过返回ModelAndView对象,将数据封装到MOdelAndView对象中
@RequestMapping("/test9") public ModelAndView test9(){ ModelAndView mav = new ModelAndView("/project/list"); //向jsp传 name为tom mav.addObject("name","tom"); return mav; }
(2)方式二:
通过Model对象传值
@RequestMapping("/test9") public String test9(Model model){ model.addAttribute("name","tom"); return "/project/list"; }
(3)方式三:
通过Map对象传值
@RequestMapping("/test9") public String test9(@RequestParam Map map,Map m,HttpServletRequest request){ System.out.println(map); m.put("name","tom"); //等同于request.setAttribute("name","tom") //request.setAttribute("name","rose"); return "/project/list"; }