前言
最近一直在接触springmvc,所以抽个空给大家总计一下,给我的感觉就是真的是好方便啊,首先呢我们不慌,一步步的去讲解,从最基础的开始
什么是SpringMvc
SpringMvc 全名叫做:Spring Web MVC 他是基于java实现的Web MVC框架,使用了请求驱动类型的轻量级web框架,什么是请求驱动类型:表示我们通过请求和响应来实现开发
SpringMvc 是我们spring框架中其中一个子架构,我们来看看架构图
为什么用SpringMvc
首先给大家说一个套路只有是问框架问题基本上都是这么回事:使用者只关心核心业务的开发,框架帮助你屏蔽了于技术无关的开发问题。
SpringMvc从哪里来
SpringMVC会经常与Struts2进行对比,为什么他们两个会经常对比呢,是因为他们干的是同样的事情,但是实现的方式是不一样的,并且效果和效率也是不一样的,SpringMvc的源头是Servlet
Springmvc 与Struts2的区别
??????????这个得留一段时间,因为springmvc还不是特别的深入
配置名称
首先说一下Springmvc都有什么内容
1 前端控制器DispatchServlet:主要起到的作用是转发
2处理器映射器HandlerAdapter:主要的作用是找到Handler
3处理器适配器HandlerAdapter:主要是执行handler
4Handler处理器:指的是Controller
5视图解析器:把逻辑视图转换为物理视图,目前认为就是把页面路径找到页面
配置步骤
第一步:发起请求到前端控制器,使用的是前端控制器(despatchServlet)
第二步:前端控制器请求HandlerMapping查找Handler
查找的时候可以根据xml配置,或者是使用注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler(ps:为什么前端控制器不直接执行,却让处理器适配器执行,原因就是我们为了项目的可扩展性或者说可以不让前端控制器的压力过大所以多出来一个处理器适配器专门执行Handler)
第五步:处理器适配器调用Handler处理器,Handler处理器去执行Handler
第六步:Handler处理器向处理器适配器返回modelAndview
第七步:处理器适配器向前端控制器返回modelAndview
modelAndview:是springmvc框架的一个底层对象,他包括Model和view,就是返回页面和页面中的数据
第八步:前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成为真正的视图(jsp)
第九步:视图解析器向前端控制器返回view
第10步:前端控制器进行视图渲染
第11步:前端控制器向用户响应结果
流程图
配置xml
首先我们先配置web.xml
步骤1:得到前端控制器类
2:根据配置找到spring.xml
3.处理映射器
<!-- 配置springmvc中的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化参数 -->
<!--创建一个新的DispatcherServlet,它将根据通过servlet * init-params提供的默认值和值创建自己的内部web *应用程序上下文。通常用于Servlet 2.5或更早版本的环境中,其中Servlet注册的唯一*选项是通过需要使用无参数构造函数的代码web.xml来实现的。 -->
<!--
1.ContextConfigLocation的配置是针对于我们找到springmvc加载的配置文件用的,为什么我们需要加载springmvc的配置文件
因为我们需要配置springmvc的处理器映射器,适配器内容
2.其实也可以不配置,但是如果不配置程序运行的时候回去找WEB-INF/servlet名称-serlvet.xml。但是如果我们项目有多个模块的时候这个时候我们就需要配置了
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--classpath表示从class文件下找springmvc.xml配置文件,如果是classpath*表示不仅会在class路径找还会在jar中去找 -->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!--处理器映射配置 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
映射的写法总共有3种
1. *.action。表示访问以.action结尾,由DispatcherServlet进行解析
2. /,所有访问都是有DispatcherServlet进行解析,对于静态文件我们不让他解析
3. /* 这种写法是不对的 -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
springmvc.xml配置
<!--配置handler
,这个时候我们需要指定我们的Controller类,映射器找到我们的方法才可以进行映射 。编写的handler会在spring容器中进行加载 -->
<bean name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"></bean>
<!--处理器映射器
将bean的name作为UrL进行查找,需要再配置Handler时指定beanname(就是URL),所以这是会后Handler的url很重要
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--处理器适配器 -->
<!--为什么这个是实现了处理器适配器呢?我们通过源代码来尽心观察,
public class SimpleControllerHandlerAdapter implements HandlerAdapter 这是源代码
的方法,他实现了HandlerAdapter,HandlerAdapter里面是 boolean supports(Object handler); 使用的Handler
就是看适配器支持哪一种类型的Handler
并且我们看看他的方法都干了什么,首先这个是方法使用了Controller,说明他能够实现Controller接口的Handler
public boolean supports(Object handler) {
return (handler instanceof Controller);
}
Controller里面执行的时候执行的是
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
所以根据这个方法我就可以知道Handler执行完之后返回的是ModelAndView
编写handler
1实现是Controller接口,只有这样我们才知道应该由哪一个适配器去执行,由org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter来去帮助我们执行
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--视图解析器
解析jsp解析,默认使用的是jstl标签,classpath下必须有jstl的包
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>
具体执行的类handler
/**
* 实现Controller接口的适配器
* @author 雪芬芬
*
*/
public class ItemsController1 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//调用serveice查找数据库,查询商品列表,这是使用的是静态数据模拟
List<Items> itemsList=new ArrayList<Items>();
//向list填充静态数据
。。。。。。。。。
//因为我们最后返回ModelAndView,所以我们必须制定数据和视图,用于返回
ModelAndView modeAndView= new ModelAndView();
//把"数据"放到ModelAndView中,这样我们就可以在前台取出来了
modeAndView.addObject("itemsList", itemsList);
//把"视图"找到,制定视图的路径
modeAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modeAndView;
}
出错
下面是我们可能出现的错误,根据错误我们也可以分析我们他的理论
一、如果是报404错误,则说明找不到页面,出现的问题应该是在处理器映射器,为什么是在处理器映射器,原因是因为处理器映射器跟具url去找handler,说明url错误
二、处理器映射器根据url找到了地址,但是转发的jsp页面报错了,说明你写的jsp页面地址有问题
使用注解实现前面的功能
对于前面我们使用的是非注解形式的,下面我们主要使用注解方式的,首先把非注解的列出来看看
非注解的映射器
第一种方式很简单,直接使用:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
第二种方式使用简单的url映射,我们必须有handler的id哦,否则他是找不到的,也就是url和id非常重要的哦
<bean id="itemsController1" name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"></bean>
<bean id="itemsController2" class="cn.itcast.ssm.controller.ItemsController2"></bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappins">
<props>
<!--对itemsController进行url映射,url是key中指定的 -->
<prop key="/queryItems1.action">ItemsController1</prop>
<prop key="/queryItems2.action">ItemsController1</prop>
</props>
</property>
</bean>
非注解的处理器适配器
第一种org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求编写的handler必须实现controller接口
第二种org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求编写的handler必须实现HttpRequestHandler接口
由于实现的接口不一样所以方法也不一样,HttpRequestHandler主要是使用的servlet的方式,例如
//设置模型数据
request.setAttribute("itemsList", itemsList);
//设置转发的视图
request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request, response);
}
注解适配器和映射器
在spring3.1之前使用org.springframework.web.servlet.annotation.DefaultAnnotationHandlerMapping注解映射器
在spring3.1之后使用RequestMappingHandlerMapping注解映射
注解适配器
在spring3.1之前使用org.springframework.web.servlet.annotation.AnnotationMethodHandlerMapping注解映射器
在spring3.1之后使用RequestMappingHandlerAdapter注解映射
目前使用注解
目前使用的注解更为简单主需要一步就可以代替两步哦
<mvc:annotation-driven></mvc:annotation-driven>
在handler方式中我们使用@Controller和@ RequestMapping方法进行映射。在@RequestMapping里面定义映射URl,使用注解的映射器,这时候时候我们不需要添加一句话,为什么呢?因为我们已经把用注解让他找到了,并且以前我的一个类中只能写一个方法,现在我们的类里面可以写多个方法,只需加加上注解和url就可以喽。
<bean id="itemsController1" name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"></bean>
正确写法
@Controller
public class ItemsController3 {
//商品查询列表
//@RequestMapping实现对queryItems方法和url进行映射,一个方法对应一个url
@RequestMapping("/queryItems")
}
注解的处理器和适配器
注解处理器适配器和注解的处理器映射器是配对使用的,他的意思就是说用了注解器就别用非注解器来进行映射
效果显示
总结
在这个过程中没有找别人帮助,都是自己一步步的做,高效的工作。