1、springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
2、springmvc是一个基于mvc的web框架。
MVC:MVC是一个设计模式,C控制层,M模块层,V显示层这样的设计理念,而SSM框架里面SPRING MVC本身就是MVC框架,作用是帮助(某种意义上也可以理解为约束)我们要按照MVC这样的设计来开发WEB项目,而另外两个框架spring主要是用作IOC,AOF等其他的一些设计原则,至于mybatis是用来方便操作数据库的,所以他们都在MV里面,至于V指的是展示部分,一般是指JSP,freemarks这种其实,和SSM就没有太大的关系了
mvc在B\S系统下的应用:b/s系统下模型无法将数据填充到视图。
3、pringmvc 表现层:方便前后端数据的传输。
4、SpringMVC相当于SSH框架中struts:Spring MVC 拥有控制器,作用跟Struts类似,接收外部请求,解析参数传给服务层。
既然说到SSM框架中的SpringMVC相当于SSH框架中struts,那就顺便提一下SpringMVC 和 Struts2 的对比:
1、SpringMVC 的入口是 Servlet,而Struts2是Filter。
2、SpringMVC会稍微比Struts2快些,SpringMVC是基于方法设计的,而Struts2是基于类设计的,每次发一次请求都会实例一个Action。
3、SpringMVC使用更加简洁,开发效率比Struts2高。支持JSR303,处理ajax的请求更方便。
4、Struts2的OGNL表达式使页面的开发效率相比SpringMVC更高些。
注:
1、Handler也叫controller
2、HandlerInterceptor:拦截器
3、视图:jsp\freemaker\excel\pdf
4、前端控制器请求HandlerMapping查找Handler可以根据xml配置、注解进行查找
5、ModelAndView是springMVC框架的一个底层对象,包括model和view
6、前端控制器请求视图解析器解析视图,根据逻辑视图名解析成真正的视图(jsp)
7、视图渲染:将模型数据(ModelAndView对象中)填充到request域
组件:
1、前端控制器DispatcherServlet:接受请求、响应结果,相当于转发器,有了它,就减少了各模块间的耦合性
2、处理器映射器HandlerMapping:根据请求的url查找Handler
3、处理器适配器HandlerAdapter:按照特定规则(HandlerAdapter要求的规则)去执行Handler,注意编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确地去执行Handler
4、视图解析器View resolver:进行视图解析,根据逻辑视图名解析成真正的视图(View)
5、视图View是一个接口,实现类支持不同的View类型
1、 Spring框架jar包:
为了简单,将spring-framework-3.2.0.RELEASE-with-docs.zip/dist/下的所有jar包拷贝到项目的WEB-INF/lib目录下(一定包括spring-webmvc-3.2.0.RELEASE.jar);
2、 Spring框架依赖的jar包:
需要添加Apache commons logging日志,此处使用的是commons-logging-1.1.1.jar;
需要添加jstl标签库支持,此处使用的是jstl-1.2.jar;
1、配置前端控制器(classpath:dispatcherServlet-servlet.xml在classpath路径下)
dispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:dispatcherServlet-servlet.xml
1
dispatcherServlet
/
注意:如果是用maven构建的项目,那么src目录是:src/main/resources
如果用到REST风格URL,还需在web.xml中配置HidddenHttpMethodFilter
HiddenHttpMethodFilter
org.springframework.web.filter.HiddenHttpMethodFilter
HiddenHttpMethodFilter
/*
总结:
处理器适配器:
通过查看SimpleControllerHandlerAdapter源代码,
public class SimpleControllerHandlerAdapter implements HandlerAdapter {
public boolean supports(Object handler) {
return (handler instanceof Controller);
}
...
}
此适配器能执行实现Controller接口的Handler,查看Controller接口源代码,
public interface Controller {
/**
* Process the request and return a ModelAndView object which the DispatcherServlet
* will render. A null
return value is not an error: It indicates that
* this object completed request processing itself, thus there is no ModelAndView
* to render.
* @param request current HTTP request
* @param response current HTTP response
* @return a ModelAndView to render, or null
if handled directly
* @throws Exception in case of errors
*/
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
Controller接口返回一个ModelAndView对象。
需要实现controller接口,才能由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter适配器执行:
package com.jacket.ssm.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import com.jacket.ssm.po.Items;
public class ItemsController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 调用service查找数据库,查询商品列表,这里使用静态数据模拟
List itemsList = new ArrayList();
//向list填充静态数据
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");
itemsList.add(items_1);
itemsList.add(items_2);
//创建modelAndView准备填充数据、设置视图
ModelAndView modelAndView = new ModelAndView();
//填充数据,相当于request的setAttribut,在jsp页面中通过itemsList获取数据
modelAndView.addObject("itemsList", itemsList);
//指定视图
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}