2.4.9、相关错误
2.4.10、入门程序总结
三、非注解的处理器适配器和映射器
3.1、非注解处理器适配器HttpRequestHandlerAdapter
3.2、非注解处理器映射器SimpleUrlHandlerMapping
3.3、部署调试
3.4、非注解的处理器适配器和映射器总结
四、注解的处理器映射器和适配器
4.1、配置注解映射器和适配器。
4.2、开发注解Handler
4.3、在spring容器中加载Handler
4.4、部署调试
五、入门程序总结
5.1、springmvc开发步骤:针对注解式的,非注解了解就好
5.2、springmvc框架详解
六、参考文献
一、什么是springmvc
==============
1.1、springmvc的地位
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。
1.2、springmvc框架(工作原理)
工作原理:
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找 Handler
可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染
视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
涉及到的组件分析:
1、前端控制器DispatcherServlet(不需要程序员开发)
作用:接收请求,响应结果,相当于转发器,中央处理器。
有了DispatcherServlet减少了其它组件之间的耦合度。
2、处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
4、处理器Handler(需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
5、视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
6、视图View(需要程序员开发jsp)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
从组件分析可以知道:我们需要重点开发的是处理器Handler(或者Controller)和视图View;至于前端控制器DispatcherServlet、处理器映射器HandlerMapping、处理器适配器HandlerAdapter、视图解析器View resolver都是现成的,我们只需要把他们配置好就可以直接使用。
二、入门程序
======
2.1、背景需求
以案例作为驱动。
springmvc和mybaits使用一个案例(商品订单管理)。
功能需求:商品列表查询
2.2、环境准备
数据库:mysql5.5(其他也可以)
java环境:jdk1.8(eclipse或者IDEA都可以)
spring版本:spring4
需要的jar包:ssm全部jar包,参照https://mp.csdn.net/postedit/86485520这篇博客,百度云免费下载。
2.3、工程结构
2.4、组件配置及开发
2.4.1、配置前端控制器
在web.xml中配置前端控制器。
<?xml version="1.0" encoding="UTF-8"?>springmvcfirst
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
springmvc
*.action
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
web.xml文件中主要做了这几件事:
1、配置了前端控制器DispatcherServlet
2、加载了springmvc的配置文件contextConfigLocation
3、指定url的解析方式
2.4.2、配置处理器适配器
在springmvc.xml文件中配置处理器适配器
<bean
class=“org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter”>
这里先使用SimpleControllerHandlerAdapter这个非注解处理器适配器。(接下来会介绍另一个非注解的处理器适配器,以及注解的处理器适配器)
非注解处理器适配器SimpleControllerHandlerAdapter要求:编写的Handler实现 Controller接口。
2.4.3、开发Handler
Handler是一个类,存于Controler包下
package cn.itcast.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 cn.itcast.ssm.po.Items;
public class ItemsController1 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);
//指定视图
//下边的路径,如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为
//modelAndView.setViewName(“/WEB-INF/jsp/items/itemsList.jsp”);
//上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
modelAndView.setViewName(“items/itemsList”);
return modelAndView;
}
}
2.4.4、视图编写
编写itemsList.jsp文件,存于/springmvcfirst/WebRoot/WEB-INF/jsp/items/itemsList.jsp
<%@ page language=“java” contentType=“text/html; charset=UTF-8”
pageEncoding=“UTF-8”%>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=“fmt”%>
查询条件:
商品列表:
<c:forEach items=“${itemsList }” var=“item”>
${item.name } ${item.price } ${item.detail }id=${item.id}">修改
</c:forEach>
2.4.5、在springmvc.xml中配置编写的Handler
2.4.6、配置处理器映射器
在springmvc.xml文件中配置
<bean
class=“org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping” />
2.4.7、配置视图解析器
在springmvc.xml文件中配置
<bean
class=“org.springframework.web.servlet.view.InternalResourceViewResolver”>
2.4.8、部署调试
Debug方式执行Service打开浏览器,输入相应的Handler的url即可。
2.4.9、相关错误
处理器映射器根据url找不到Handler,报下边的错误。说明url错误。
处理器映射器根据url找到了Handler,转发的jsp页面找到,报下边的错误,说明jsp页面地址错误了。
2.4.10、入门程序总结
由上面的组件分析可以知道,我们在web.xml我文件中配置了前端控制器、加载了springmvc的配置文件
在springmvc.xml中配置了处理器适配器、处理器映射器、Handler、视图解析器
入门程序中的处理器适配器使用的是SimpleControllerHandlerAdapter,它要求编写的Handler实现 Controller接口。
入门程序中的处理器映射器使用的是BeanNameUrlHandlerMapping,也就是需要在配置Handler时指定beanname,该处理器映射器才能找到它。
接下来我们会使用另一个非注解处理器适配器和处理器映射器,也会对Handler有相应的要求。
三、非注解的处理器适配器和映射器
================
上面我们已经实现了springmvc的第一个程序,其中的处理器适配器使用的是SimpleControllerHandlerAdapter,处理器映射器使用的是BeanNameUrlHandlerMapping。接下来我们使用另一个处理器适配器HttpRequestHandlerAdapter,另一个处理器映射器SimpleUrlHandlerMapping。
3.1、非注解处理器适配器HttpRequestHandlerAdapter
理器适配器HttpRequestHandlerAdapter要求:编写的Handler实现 HttpRequestHandler接口
于是我们再写一个Handler
package cn.itcast.ssm.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import cn.itcast.ssm.po.Items;
public class ItemsController2 implements HttpRequestHandler{
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
//调用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);
//设置模型数据
request.setAttribute(“itemsList”, itemsList);
//设置转发的视图
request.getRequestDispatcher(“/WEB-INF/jsp/items/itemsList.jsp”).forward
(request, response);
//使用此方法可以通过修改response,设置响应的数据格式,比如响应json数据
/*
response.setCharacterEncoding(“utf-8”);
response.setContentType(“application/json;charset=utf-8”);
response.getWriter().write(“json串”);*/
}
}
3.2、非注解处理器映射器SimpleUrlHandlerMapping
itemsController1
itemsController1
itemsController2
3.3、部署调试
我们对后配置的非注解处理器适配器HttpRequestHandlerAdapter和非注解处理器映射器SimpleUrlHandlerMapping进行调试
Debug方式执行Service打开浏览器,输入相应的Handler的url即可。
3.4、非注解的处理器适配器和映射器总结
通过上面的讲解,估计大家也发现了,不同的处理器适配器对编写的Handler有不同的要求,严重限制了我们的开发。同时springmvc.xml文件中可以存在多个不同的处理器适配器和映射器,如果这样一个一个的显示配置,工作量是繁琐繁重的。于是,就引出了注解的处理器映射器和适配器,他可以解决非注解方式存在的弊端。
四、注解的处理器映射器和适配器
===============
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping注解映射器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping注解映射器。
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter注解适配器。
在spring3.1之后使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter注解适配器。
大家对照自己的spring版本相应使用(我是用的是3.1之后的RequestMappingHandlerMapping和RequestMappingHandlerAdapter)
4.1、配置注解映射器和适配器。