springmvc框架
什么是springmvc
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。
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...)
需要spring3.2所有jar(一定包括spring-webmvc-3.2.0.RELEASE.jar)
配置前端控制器
在web.xml中配置前端控制器要点击 org.springframework.web.servlet.DispatcherServlet添加spring-webmvc-3.2.0.RELEASE-sources.jar源码
<!-- 前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--contextConfigLocation 配置springMVC加载的配置文件配置文件重要配置映射器,适配器 -->
<!-- 如果不配置 contextConfigLocation ,默认加载/WEB-INF/SERVLER-SERVLET.XML(SPRINGMVC.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结尾由DispathcherServlet进行解析
第二种 / 所有访问的地址都有DispathcherSerclet进行解析,对于静态的文件需要配置不让DispathcherSerclet进行解析
是有此种方式可以实现RESful的风格url
第三种 /* 这样配置不对,使用这种配置,最终需要转发给一个jsp页面是仍然会有DispathcherSerclet解析jsp地址,不能根据jsp找到handle
-->
<url-pattern>*.action</url-pattern>
配置处理器适配器
在classpath下的springmvc.xml中配置处理器适配器
<!-- 处理器适配器所有处理器适配器都实现 HandlerAdapter接口 -->
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 另一个非注解的适配器 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
开发Handler
在非注解适配器中,对于不同的适配器,controller 需要实现不同的接口。
采用注解适配器,则需要注解。
1 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
public classItemsController1 implements Controller{
public ModelAndViewhandleRequest(HttpServletRequest request,
HttpServletResponseresponse) throwsException {
// TODO Auto-generated method stub
// 调用service查找数据库,查询商品列表,使用静态数据模,填充数据
List<Items> itemsList=new ArrayList<Items>();
Itemsitems_1 = newItems();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
Itemsitems_2 = newItems();
items_2.setName("苹果手机6");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");
itemsList.add(items_1);
itemsList.add(items_2);
//返回ModelAndView
ModelAndViewmodelAndView=newModelAndView();
//相当于requesr的setAttribut,在jsp页面中通过itemsList来取得数据
modelAndView.addObject("itemsList",itemsList);
//指定视图
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
2 "org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
public classItemsController2 implements HttpRequestHandler{
public voidhandleRequest(HttpServletRequest request,
HttpServletResponseresponse) throwsServletException, IOException {
// 调用service查找数据库,查询商品列表,使用静态数据模 略
//设置模型数据
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 注解开发 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
//使用controller标识它是一个控制器
@Controller
public classItemsController3 {
//商品查询
//一般建议方法名和url写成一样,方便维护
//@RequestMapping实现queryItems方法和url进行映射一个方法对应一个url
@RequestMapping("/queryItems")
public ModelAndViewqueryItems()throwsException{
//调用service查找数据库,查询商品列表,使用静态数据模 略
//返回ModelAndView
ModelAndViewmodelAndView=newModelAndView();
//相当于requesr的setAttribut,在jsp页面中通过itemsList来取得数据
modelAndView.addObject("itemsList",itemsList);
//指定视图
//下边的路径在试图解析器中配置前缀和后缀
modelAndView.setViewName("items/itemsList");
//modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
//定义其他方法例如商品添加
}
视图编写
编写jsp界面
配置Handler
<!-- 配置Handler -->
<bean id="itemsController1" name="/queryItems_test.action" class="cn.hpu.ssm.controller.ItemsController1"/>
<!-- 配置另外一个Handler -->
<bean id="itemsController2" class="cn.hpu.ssm.controller.ItemsController2"/>
<!-- 对于注解的Handler可以单个配置
实际开发中建议使用组件扫描
-->
<!-- <beanclass="cn.itcast.ssm.controller.ItemsController3" /> -->
<!-- 可以扫描controller、service、...
这里让扫描controller,指定controller的包
-->
<context:component-scan base-package="cn.hpu.ssm.controller"></context:component-scan>
配置处理器映射器
<!-- 处理器映射器将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)
所有的映射器都实现 HandlerMapping接口。
-->
<!—非注解映射器 -->
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--非注解映射器简单url映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- 对itemsController1进行url映射,url是/queryItems1.action-->
<prop key="/queryItems1.action">itemsController1</prop>
<prop key="/queryItems2.action">itemsController1</prop>
<prop key="/queryItems3.action">itemsController2</prop>
</props>
</property>
</bean>
<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 使用 mvc:annotation-driven代替上边注解映射器和注解适配器配置
mvc:annotation-driven默认加载很多的参数绑定方法,
比如json转换解析器就默认加载了,如果使用mvc:annotation-driven不用配置上边的RequestMappingHandlerMapping和RequestMappingHandlerAdapter
实际开发时使用mvc:annotation-driven
-->
<!--<mvc:annotation-driven></mvc:annotation-driven> -->
配置视图解析器
<!-- 视图解析器
解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包
-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路径的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 配置jsp路径的后缀 -->
<property name="suffix" value=".jsp"/>
</bean>
部署调试