springMVC总结
- springMVC简介
- SpringMVC 和 Struts2 对比
- springMVC的工作流程
- springmvc配置文件
- 在此之前,需要导入spring所需jar包:
- 在我们的web.xml中添加如下配置:
- 在我们的dispatcherServlet-servlet.xml中添加如下配置:
- 编写Handler
springMVC简介
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系统下模型无法将数据填充到视图。
request请求
response响应
用户
C 控制器_controller\接口用户请求\响应
请求模型进行处理
视图渲染,将模型数据填充到request域
处理结果返回
C 控制器_controller\接口用户请求\响应
M 模型_pojo\action\service\dao
V 视图_view
3、pringmvc 表现层:方便前后端数据的传输。
4、SpringMVC相当于SSH框架中struts:Spring MVC 拥有控制器,作用跟Struts类似,接收外部请求,解析参数传给服务层。
SpringMVC 和 Struts2 对比
既然说到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更高些。
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类型
springmvc配置文件
在此之前,需要导入spring所需jar包:
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;
在我们的web.xml中添加如下配置:
1、配置前端控制器(classpath:dispatcherServlet-servlet.xml在classpath路径下)
<!-- 配置前端控制器DispatcherServlet -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 在spring-webmvc-3.2.0.RELEASE.jar包中找到DispatcherServlet复制路径 -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation配置springmvc加载的配置文件(包括处理器映射器、适配器等等)
如果不配置contextConfigLocation,默认加载/WEB-INF/servlet名称-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dispatcherServlet-servlet.xml</param-value>
</init-param>
<!-- 在WEB容器启动时就实例化DispatcherServlet,而不是等到该servlet被选择时。正数数字越小,优先级越高。-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--
第一种:*/.action,访问以.action结尾由Dispatcherervlet进行解析
第二种:/,所有访问的地址都由Dispatcherervlet进行解析,对于静态文件的解析需要配置不让Dispatcherervlet进行解析
第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,仍然会由Dispatcherervlet解析jsp地址,不能根据jsp页面找到Handler,会报错
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
注意:如果是用maven构建的项目,那么src目录是:src/main/resources
如果用到REST风格URL,还需在web.xml中配置HidddenHttpMethodFilter
<!-- 配置HiddenHttpMethodFilter 作用可以把post请求转为delete或者put请求 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在我们的dispatcherServlet-servlet.xml中添加如下配置:
<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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 配置Handler -->
<bean name="/queryItems.action" class="com.jacket.ssm.controller.ItemsController"/>
<!--处理器映射器-->
<!-- 根据bean的name作为url进行查找Handler 将action的url配置在bean的name中 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!--处理器适配器:所有的处理器适配器都实现HandlerAdapter-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 视图解析器 解析jsp视图,默认使用jstl标签-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>
总结:
处理器适配器:
通过查看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 <code>null</code> 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 <code>null</code> if handled directly
* @throws Exception in case of errors
*/
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
Controller接口返回一个ModelAndView对象。
编写Handler
需要实现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<Items> itemsList = new ArrayList<Items>();
//向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;
}
}
下面是我自己利用springMVC做的项目的截图。