MVC设计模式
-
视图(View)-对应组件:JSP或者HTML文件
-
控制器(Controller)-对应组件:Servlet
-
模型(Model) -对应组件:JavaBean
三层:表示层、业务逻辑层、数据访问层
MVC与三层:
表示层:V C
业务逻辑层、数据访问层
JSP Model2
-
JSP:负责生成动态网页
-
Servlet:负责流程控制
-
JavaBean:负责业务逻辑处理
MVC 优点
-
MVC 优点
-
多视图共享一个模型,大大提高代码的可重用性
-
MVC三个模块相互独立,松耦合架构
-
控制器提高了应用程序的灵活性和可配置性
-
有利于软件工程化管理
-
完美的系统架构 = 松耦合+高重用性+高扩展性
-
-
-
MVC 缺点
-
原理复杂
-
增加了系统结构和实现的复杂性
-
视图对模型数据的低效率访问
-
Spring MVC
-
结构最清晰的MVC Model2实现
-
Controller
-
ModelAndView
Hello
maven创建war
导入jar包
<properties> <spring.version>5.3.6</spring.version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> </dependencies>
配置文件
在web.xml中配置DispatcherServlet
<!-- Spring MVC配置 --> <servlet> <servlet-name>springMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
Spring MVC的配置文件
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--注解驱动控制器--> <context:component-scan base-package="com.zking.ssm.controller"/> <!--注册RequestMapping,RequestAdapter--> <mvc:annotation-driven/> <!-- 完成视图的对应 --> <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
<context:component-scan />
@Controller:标注一个普通的JavaBean成为可以处理请求的控制器
@RequestMapping:通过请求URL进行映射
<mvc:annotation-driven />
一键式配置,通过注解的方式进行Spring MVC开发
DefaultAnnotationHandlerMapping
AnnotationMethodHandlerAdapter
创建Controller
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/") public class HelloController { @RequestMapping("/hello") public String hello(){ return "hello"; } }
创建View-JSP
创建在WEB-INF/jsp/hello.jsp
<body> hello spring mvc </body>
Spring MVC请求处理流程
-
用户发送请求至前端控制器DispatcherServlet
-
DispatcherServlet收到请求调用HandlerMapping处理器映射器。(url与handler之间的关系)
-
处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
-
DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
-
执行处理器(Controller,也叫后端控制器)。
-
Controller执行完成返回ModelAndView
-
HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
-
DispatcherServlet将ModelAndView传给ViewReslover视图解析器
-
ViewReslover解析后返回具体View
-
DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
-
DispatcherServlet响应用户
Spring MVC体系结构
DispatcherServlet
DispatcherServlet(前端控制器)
* Spring MVC最核心的类 * web.xml中配置
HandlerMapping
HandlerMapping(处理器映射):
功能:根据当前请求的找到对应的 Handler,并将 Handler(执行程序)与一堆 HandlerInterceptor(拦截器)封装到 HandlerExecutionChain 对象中
-
BeanNameUrlHandlerMapping(默认) 将请求URL映射到同名的控制器Bean上
-
RequestMappingHandlerMapping
-
注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method。
-
@RequestMapping:定义请求url到处理器功能方法的映射
-
HandlerAdapter
HandlerAdapter(适配器)
功能:根据 Handler 来找到支持它的 HandlerAdapter,通过 HandlerAdapter 执行这个 Handler 得到 ModelAndView 对象。
-
RequestMappingHandlerAdapter
-
注解式处理器适配器,对标记@ResquestMapping的方法进行适配。
-
-
HttpRequestHandlerAdapter
-
SimpleControllerHandlerAdapter
-
BeanNameUrlHandlerMapping适配器
-
Handler
Handler(处理器):对应MVC中C(Controller层)
-
类型:Object
-
作用:实际处理请求
-
标注了@RequestMapping的所有方法都可以看作是一个Handler
ModelAndView
ModelAndView
-
逻辑视图名
-
模型对象
ViewResolver
ViewResolver(视图解析器)
功能:将模型数据与视图进行绑定渲染
-
将逻辑视图名与JSP等视图技术进行匹配
-
InternalResourceView
-
prefix
-
suffix
-
-
Spring MVC框架特点
-
清晰地角色划分
-
灵活的配置功能
-
提供了大量的控制器接口和实现类
-
真正做到与View层的实现无关(JSP、Velocity、Xslt等)
-
国际化支持
-
面向接口编程
-
Spring提供了Web应用开发的一整套流程,不仅仅是MVC,他们之间可以很方便的结合一起
@RequestMapping
通过@RequestMapping注解可以定义不同的处理器映射规则。
URL路径映射
@RequestMapping(value="/item")或@RequestMapping("/item) value的值是数组,可以将多个url映射到同一个方法
窄化请求映射
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
请求方法限定
限定方法请求方式
@RequestMapping(method = RequestMethod.XXX)
XXX:GET,POST等
controller方法返回值
ModelAndView
controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。
返回void
在controller方法形参上可以定义request和response,使用request或response指定响应结果:
使用request转向页面,如下:
request.getRequestDispatcher("页面路径").forward(request, response);
通过response页面重定向:
response.sendRedirect("url")
通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");
返回字符串
逻辑视图名
controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
return "user_list";
Redirect重定向
Contrller方法返回结果重定向到一个url地址.
return "redirect:user/list.action";
forward转发
controller方法执行后继续执行另一个controller方法
return "forward:user/edit.action";
参数绑定
默认支持的参数类型
-
HttpServletRequest
-
HttpServletResponse
-
HttpSession
-
Model
注解适配器对RequestMapping标记的方法进行适配,对方法中的形参会进行参数绑定,3.X之后springmvc就开始使用Converter进行参数绑定
org.springframework.core.convert.converter
converter可以实现任意java类型的转换
StringToBooleanConverter (org.springframework.core.convert.support) StringToCharacterConverter (org.springframework.core.convert.support) StringToCharsetConverter (org.springframework.core.convert.support) StringToCurrencyConverter (org.springframework.core.convert.support) StringToEnum in StringToEnumConverterFactory (org.springframework.core.convert.support) StringToLocaleConverter (org.springframework.core.convert.support) StringToNumber in StringToNumberConverterFactory (org.springframework.core.convert.support) StringToPropertiesConverter (org.springframework.core.convert.support) StringToTimeZoneConverter (org.springframework.core.convert.support) StringToUUIDConverter (org.springframework.core.convert.support) ...
@RequestParam
@RequestParam用于绑定单个请求参数。
* value:参数名字,即入参的请求参数名字;
-
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报; TTP Status 400 - Required Integer parameter 'XXXX' is not present
-
defaultValue:默认值,表示如果请求中没有同名参数时的默认值
简单类型
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定
整型、字符串、单精度/双精度、布尔型等
pojo
将pojo对象中的属性名于传递进来的属性名对应,如果传进来的参数名称和对象中的属性名称一致则将参数值设置在pojo对象中
页面定义如下; <input type="text" name="name"/> <input type="text" name="price"/> Contrller方法定义如下: @RequestMapping("/editItemSubmit") public String editItemSubmit(Items items)throws Exception{ System.out.println(items); 请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。
Public class QueryVo { private Items items; } 页面定义: <input type="text" name="items.name" /> <input type="text" name="items.price" /> Controller方法定义如下: public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{ System.out.println(queryVo.getItems()); }
集合类
字符串数组
页面定义如下: 页面选中多个checkbox向controller方法传递 <input type="checkbox" name="item_id" value="001"/> <input type="checkbox" name="item_id" value="002"/> <input type="checkbox" name="item_id" value="002"/> 传递到controller方法中的格式是:001,002,003 Controller方法中可以用String[]接收,定义如下: public String deleteitem(String[] item_id)throws Exception{ System.out.println(item_id); }
List
List中存放对象,并将定义的List放在包装类中,action使用包装对象接收。 List中对象: 成绩对象 Public class QueryVo { Private List<Items> itemList;//订单明细 //get/set方法.. } 包装类中定义List对象,并添加get/set方法如下: 页面: <tr> <td> <input type="text" name=" itemList[0].id" value="${item.id}"/> </td> <td> <input type="text" name=" itemList[0].name" value="${item.name }"/> </td> <td> <input type="text" name=" itemList[0].price" value="${item.price}"/> </td> </tr> <tr> <td> <input type="text" name=" itemList[1].id" value="${item.id}"/> </td> <td> <input type="text" name=" itemList[1].name" value="${item.name }"/> </td> <td> <input type="text" name=" itemList[1].price" value="${item.price}"/> </td> </tr> Contrller方法定义如下: public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{ System.out.println(queryVo.getItemList()); }
Map
在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收。 包装类中定义Map对象如下: Public class QueryVo { private Map<String, Object> itemInfo = new HashMap<String, Object>(); //get/set方法.. } 页面定义如下: <tr> <td>学生信息:</td> <td> 姓名:<inputtype="text"name="itemInfo['name']"/> 年龄:<inputtype="text"name="itemInfo['price']"/> .. .. .. </td> </tr> Contrller方法定义如下: public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{ System.out.println(queryVo.getStudentinfo()); }