SpringMVC配置讲解
前⾔
最近⼀直在接触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
⾸先我们先配置l
步骤1:得到前端控制器类 2:根据配置到l 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或更早版<!--
1.ContextConfigLocation的配置是针对于我们到springmvc加载的配置⽂件⽤的,为什么我们需要加载springmvc的配置⽂件
因为我们需要配置springmvc的处理器映射器,适配器内容
2.其实也可以不配置,但是如果不配置程序运⾏的时候回去WEB-INF/servlet名称-l。但是
如果我们项⽬有多个模块的时候这个时候我们就需要配置
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--classpath表⽰从class⽂件下l配置⽂件,如果是classpath*表⽰不仅会在class路径还会在jar中去 -->
<param-value>l</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>
<!--配置handler
,这个时候我们需要指定我们的Controller类,映射器到我们的⽅法才可以进⾏映射。编写的handler会在spring容器中进⾏加载 -->
<bean name="/queryItems.action"class="cn.ller.ItemsController1"></bean>
<!--处理器映射器
将bean的name作为UrL进⾏查,需要再配置Handler时指定beanname(就是URL),所以这是会后Handler的url很重要
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--处理器适配器 -->
<!--为什么这个是实现了处理器适配器呢?我们通过源代码来尽⼼观察,
springmvc常用标签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 ItemsController1implements 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;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论