MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
SpringMVC框架
部分核心配置 请求大概流程
SpringMVC是新兴的MVC框架 比Struts设计更精密。扩展性更强
基于注解型的
框架可以理解成为项目根目录下的bin中的jar包、归根结底 jar包中的方法成就了这个框架。
框架通常是代码重用,应用框架的重用,即为专用领域提供通用的或现成的基础结构,以获得最高级别的重用性。
运行流程
Tomcat在启动时就加载解析web.xml,找到前端控制器。
用户发送请求开始---
找到前端控制器,并且通过它来加载相关配置文件信息。
(不考虑SSH整合,单纯的SpringMVC:
前端控制器拦截请求后 进入核心配置文件:
SpringMVC配置文件:扫描controller包,激活注解,配置视图。
这些配置对应的是引用的jar包
<!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
<context:component-scan base-package="com.jk.controller" />
<!-- 开启注解功能 -->
<mvc:annotation-driven/>
)
加载完相关配置文件,前端控制器,查找相应的handlerMapping,返回一个执行链(貌似是一个拦截器)--然后找到对应的Handeler(即controller类),随即开始执行 映射下的方法。
(@Controller定义了一个控制器类,在使用了@RequestMapping之后,controller类才真正成为了一个处理器。)
方法执行后 返回 modelandview 对象-数据对象,逻辑视图名或者视图对象。
前端控制器得到ModelAndView对象后要去解析逻辑视图名----逻辑视图名也就是不可以直接返回,需要视图解析器解析成真正的视图(.jsp),是视图对象;
解析完成后返回给前端控制器。
之后再把model传给View 进行视图渲染- - - -
视图的渲染过程是把model包装成map形式通过request的属性带到服务器端
视图解析器的作用: 就是当 DispatcherServlet将ModelAndView传递给视图解析器的时候,将ModelAndView数据填充到相应的视图中,然后返回一个带有数据的视图给DispatcherServlet. |
可以理解为
-1--modelAndView.addObject("page", page);
modelAndView.setViewName("show");
return modelAndView;
-2--request.setAttribute("page", page);
return "show";
-3--model.addAttribute("page", page);
return "show";
把model模型数据 存放 到request域中,返回给前端控制器。
通过作用域通讯对象。response
这样就可以把model和view返回给用户了。
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp" />
Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。 View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。 Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。 |
(ModelAndView类用来存储处理完后的结果数据,以及显示该数据的视图;
当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherServlet。
因此,经常需要在控制器中构造ModelAndView对象。ModelAndView类提供了几个重载的构造器和一些方便的方法,
让你可以根据自己的喜好来构造ModelAndView对象。这些构造器和方法以类似的方式支持视图名称和视图对象。
当你只有一个模型属性要返回时,可以在构造器中指定该属性来构造ModelAndView对象.通过ModelAndView构造方法可以指定返回的页面名称,(在配置文件中 配置视图解析器)也可以通过setViewName()方法跳转到指定的页面 ,
使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。
调用addObject()方法将值设置到一个名为ModelMap的类属性,ModelMap是LinkedHashMap的子类,
作者:转角遇到抢劫的_0c47
链接:https://www.jianshu.com/p/2acfc166eb2a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
ModelAndView对象被放置在Request对象中,可以在页面中利用${keyName}直接访问存在model中的对象。)
Servlet 换成了controller
Servlet是 前台接收请求,用flag判断
Spring直接用分发器 根据注解 自动判断增删改查
Servlet层和controller只用来JSP页面接收请求 选择处理请求,到底是增删改查
Dao层进行连接数据库
看到没有JDBC在jar包里
SpringMVC分发器
<servlet>
<servlet-name>springMvc(这里只要和下面<servlet-mapping>
里的名字保持一致就行,随笔写什么都可以)</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet(核心控制器/分发器:目的是为了进入后台的某一个servlet(一个程序,用来连接JDBC的,那么...也就是controller了。)。那是怎么找到的?就是根据下面的配置,进入了Spring-mvc.xml ,这个文件配置了 扫描路径的配置,视图解析器,注解的开启和扫描信息)</servlet-class>
<init-param>初始化参数 即优先加载?
filter 可以接受一些参数。 init-param 的param-name 就是参数名 param-value就是参数值, 支持多个参数 每一个 filter 都有一个 init 方法 ,可以再这个 方法中通过 getInitParamter("key"); key 就是 param-name的值,来获取对应的参数值 常用的 就是 设置编码过滤器 , 例如 : <init-param><param-name>encoding</param-name><parma-value>UTF-8</param-vaue></init-param> |
也就是说进入web.xml 先找到核心控制器,然后立刻加载Spring的配置文件 即Spring-mvc.xml
<param-name>contextConfigLocation(键)</param-name>
<param-value>classpath(类路径):spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>设置优先级
</servlet>
<servlet-mapping>
<servlet-name>springMvc(映射上面的配置)</servlet-name>
<url-pattern(路径映射路径,用来匹配用户发来的请求)>*.do</url-pattern>
</servlet-mapping>
(1)完全匹配 <url-pattern>/test/userList.action</url-pattern> 完全匹配就是等值匹配,它是最先被匹配到的客户端请求。
(2)路径匹配 <url-pattern>/*</url-pattern> 匹配根路径下的全部请求 路径匹配类似于模糊匹配,对于/list、listInfo.do、checkInfo.action、index.jsp、abc.css、my.js等等url请求,都可以被匹配到。这种匹配的顺序排在完全匹配后面。 (3)扩展名匹配 <url-pattern>*.action</url-pattern>匹配全部action 结尾的请求 <url-pattern>*.css</url-pattern> 匹配全部 css结尾的请求 <url-pattern>*</url-pattern> 不能用 * ,否则报错 说明:这种匹配匹配在开发中用的比较多,但不能使用*代替,否则会报错。 结论:容器会首先查找完全匹配,如果找不到,再查找目录匹配,如果也找不到,就查找扩展名匹配。
|
<!-- 解决post提交乱码问题 -->
<filter>
<description>字符集过滤器</description>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<description>字符集编码</description>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Spring-mvc.xml
<!-- 开启注解功能 -->
<mvc:annotation-driven/>
<!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
web.xml的注解的分发器会根据注解找到增删改查的方法。
<context:component-scan base-package="com.jk.controller" />
<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/" p:suffix=".jsp" />
<!-- 配置根视图 -->
<!-- <mvc:view-controller path="/" view-name="index"/> -->
<!-- 激活基于注解的配置 用来激活那些注解的
@RequestMapping, @ExceptionHandler,数据绑定 ,@NumberFormat , @DateTimeFormat ,@Controller ,@Valid ,@RequestBody ,@ResponseBody等 -->
<!-- 视图层配置 -->
方法如果没有返回值,默认走的是方法名.jsp..是一个model对象
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
第一步 在springmvc.xml配置文件中配置视图解析器前后缀(我这个路径放在WEB-INF目录下面,配置好了之后返回界面会直接在这个目录的这个文件夹下面查找jsp界面
<!--配置视图解析器的路径(前缀和后缀)--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--配置前缀--> <property name="prefix" value="/WEB-INF/mypage"/> <property name="suffix" value=".jsp"/> </bean> 第二步 在控制器类中返回一个界面
@Controller public class Mycontroller {
@RequestMapping("/test1.action") public ModelAndView test1() { System.out.println("来了"); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("name","hello"); //这里我返回了一个叫login的界面,没有配置他的jsp后缀名,但是仍然可以通过刚才的配置在对应的目录下面找到相应的界面 modelAndView.setViewName("/login");
return modelAndView; } } 第三步 运行服务器并点击请求查看结果即可 |
<%path%>/car/query car找到类,query找到方法
基本流程:
前台请求找到web.xml 到<url-pattern>*.do,通过<servlet-name>映射找到 前端控制器 ,前端控制器 --然后找到Spring-mvc.xml配置文件--然后扫描控制层-就可以根据注解进行增删改查-返回的model经视图解析器 存入view,然后返回给前端控制器一个响应,返回到前台。