ssm之springMVC总结

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的工作流程

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做的项目的截图。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值