什么是SpringMVC
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。springmvc是一个基于mcv的web框架。
mvc在b/s中的应用
mvc是一个设计模式,
springmvc框架原理(掌握)
- 前端控制器
- 处理器映射器
- 处理器适配器
- 视图解析器
- SpringMVC和mybatis整合
- 自定义参数绑定
springmvc执行步骤
- 发起请求到前端控制器(DispatcherServlet)
-
前端控制器请求处理器映射器HandlerMapping查找Handler
可根据xml配置、注解进行查找
- 处理器映射器HandlerMapping向前端控制器返回Handler
- 前端控制器调用处理器适配器去执行Handler
- 处理器适配器执行Handler
- Handler执行完成给处理器适配器返回ModelAndView
-
处理器适配器给前端返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括Model和View
-
前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp)
- 视图解析器向前端控制器返回View
-
前端控制器进行视图渲染
视图渲染将模型数据(在ModelAndView对象中)填充到request域
- 前端控制器向用户响应结果
组件的作用
-
前端控制器DispatcherServlet
作用:接受请求,响应结果。相当于转发器
-
处理器映射器HandlerMapping
作用:根据请求的URL查找Handler
-
处理器适配器HandlerAdapter
作用:按照规定规则(HandlerAdapter要求的规则)去执行Handler
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler -
视图解析器View resolver
作用:进行视图解析,根据逻辑视图名解析成真正的视图
-
视图View
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf......)
第一个程序
-
导入jar包,spring-webmvc.jar
-
在web.xml中配置springmvc的前端控制器
<!-- 配置springmvc前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- contextConfigLocation配置springmvc加载的配置文件(处理器映射器、适配器等) 如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet。xml(这里是springmvc-servlet.xml) --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 第一种:*.action,访问以.action结尾的请求,由DispatcherServlet进行解析 第二种:/,所有的访问地址都有DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,使用这种方式可以实现REDTful风格的url 第三种:/*,这种配置不对,这种配置最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到Handler,会报错 --> <url-pattern>*.action</url-pattern> </servlet-mapping>
-
配置springmvc.xml(首先引入Spring约束)
-
配置处理器适配器。这个适配器的support方法可以处理实现Controller接口的类
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
-
创建处理器实现Controller接口
public class ItemController implements Controller{ public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { Item item1=new Item(); item1.setName("乒乓球"); item1.setPrice("5"); item1.setDetail("好球"); Item item2=new Item(); item2.setName("蓝球"); item2.setPrice("100"); item2.setDetail("球"); List<Item> listitem=new ArrayList<Item>(); listitem.add(item1); listitem.add(item2); ModelAndView modelAndView=new ModelAndView(); //相当于setAttribute modelAndView.addObject("listitem",listitem); //指定视图 modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp"); return modelAndView; } }
-
创建视图(这里是在/WEB-INF/jsp/items/item路径下创建itemList.jsp)
-
在springmvc.xml配置处理器、处理器映射器、视图解析器
<!-- 配置Handler --> <bean name="/queryItems.action" class="cn.zcw.ssm.controller.ItemController"></bean> <!-- 配置处理器映射器 将bean的name作为Url进行查找,需要在配置Handler时指定bean的name(url) --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!-- 视图解析器 jsp解析,默认使用jstl标签,所以classpath下得有jstl的包 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
- 测试
非注解处理器映射器
-
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="hello.action">itemController1</prop> </props> </property> </bean>
key表示URL,值为handel的idspringmvc会自己选择正确的处理器映射器,所以可以同时配置以上两种处理器映射器
非注解的处理器适配器
- org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
-
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
对应的handler类
public class ItemController2 implements HttpRequestHandler{ @Override public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Item item1=new Item(); item1.setName("乒乓球"); item1.setPrice("5"); item1.setDetail("好球"); Item item2=new Item(); item2.setName("蓝球"); item2.setPrice("100"); item2.setDetail("球"); List<Item> listitem=new ArrayList<Item>(); listitem.add(item1); listitem.add(item2); request.setAttribute("listitem", listitem); request.getRequestDispatcher("/WEB-INF/jsp/items/item/itemList.jsp").forward(request, response); } }
这个适配器可以指定传给jsp页面的数据格式,例如json
注解方式的适配器和映射器
第一种方式:
<!-- 注解适配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
第二种方式(推荐):
<!-- 使用mvc:annotation-driven代替上边注解映射器和注解适配器
mvc:annotation-driven默认加载很多的参数绑定方法
比如json转换解析器就默认加载,如果使用mvc:annotation-driven就不用配置上面两个注解映射器、注解适配器
实际开发中也是使用mvc:annotation-driven
-->
<mvc:annotation-driven></mvc:annotation-driven>
Handler使用注解方式
@Controller
public class ItemController3{
@RequestMapping("/itemlist.action")
public ModelAndView itemList(){
Item item1=new Item();
item1.setName("乒乓球");
item1.setPrice("5");
item1.setDetail("好球");
Item item2=new Item();
item2.setName("棒球");
item2.setPrice("100");
item2.setDetail("球");
List<Item> listitem=new ArrayList<Item>();
listitem.add(item1);
listitem.add(item2);
ModelAndView modelAndView=new ModelAndView();
//相当于setAttribute
modelAndView.addObject("listitem",listitem);
//指定视图
modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp");
return modelAndView;
}
}
在springmvc.xml开启组件扫描
<!-- 可以扫描controller、service。。。。 -->
<context:component-scan base-package="cn.zcw.ssm.controller"></context:component-scan>
视图解析器的参数配置
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路径前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!-- 配置JSP路径后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
在控制其中做出jsp路径相应修改
//modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp");
modelAndView.setViewName("items/item/itemList");
ssm框架整合步骤
-
整合dao层
mybatis和Spring整合,通过Spring管理mapper接口使用mapper的扫描器自动扫描mapper接口在Spring中进行注册
-
整合service层
通过Spring管理service接口使用配置方式将service接口配置在Spring配置文件中实现事务控制
-
整合springmvc
由于springmvc是Spring的模块,不需要整合