springmvc是spring的一部分,是一个基于mvc设计模式的前端框架
工作流程
前端控制器(DispacherServlet):负责转发请求,接受用户的请求,申请处理后,将响应返回给客户
处理器映射器(HandlerMapping):前端控制器把请求转发给处理器映射器。处理器映射器根据请求中的URL,找到对应的Handler(相当于struts2的Action),返回给前端控制器。
处理器适配器(HandlerAdapter):前端控制器知道要执行哪个Handler,但是它只是把信息转发给处理器适配器,处理器适配器调用程序写好的Handler,Handler执行完,返回一个ModelAndView对象给适配器,处理器适配器再把这个对象返回给前端控制器
处理器(Handler):编写handler按照适配器的规则来编写,比如实现哪个接口,这样适配器才可以正确执行handler
视图解析器(View resolver):前端控制器会把逻辑视图发送给视图解析器请求解析,视图解析器处理后返图物理视图(view)给前端控制器
视图view:前端控制器请求进行视图渲染,把model数据填充到request域,返回视图(jsp、html等)
前端控制器把视图响应返回给用户
配置前端控制器
前端控制器就整个框架最中心的组件,负责组织其他组件正常工作,那既然是一个servlet,就在web.xml文件中配置,我们知道应用程序部署到tomcat上,web.xml是程序执行的入口点,所以我们要在这里配置我们的前端控制器,用来接收用户请求。类似于在学习struts2时,我们在web.xml里配置的filter,它的作用和这里的前端控制器类似。
那首先我们得配置springmvc的运行环境,就是导入所需要的jar包
主要多了两个包
(1)配置servlet的名字和类
(2)配置inti-param参数,使得前端控制器找到处理器映射器和适配器等。默认会在WEB-INF目录下查找,并且要求配置文件的名字为servlet名字-servlet.xml。所以通过配置可以自己指定配置文件。我们在classpath下面创建config目录,里面新建springmvc.xml.
(3)配置servlet-mapping,通过url找到servlet。
- <url-pattern>*.do</url-pattern> 根据后缀来找
- <url-pattern>/</url-pattern> 所有url都会让这个前端控制器解析
- <url-pattern>/*do</url-pattern>有错误,不能这样配置
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 控制器通过配置文件找到处理器映射器,处理器适配器,这些都配置在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>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
配置处理器适配器
配置好前端控制器,我们在springmvc.xml中配置处理器映射器。
(1)引入约束,与spring的配置文件约束一致
(2)在springmvc的xml配置适配器,也是以bean的形式配置
我们知道适配器是去执行Handler的,打开SimpleControllerHandlerAdapter源代码,有一个supports()方法,意思只有这个Handler是Controller对象时这个适配器才可以执行这个Handler,那么我们就根据这个规则编写Handler类
编写Handler
(1)创建controller包,编写controller
(2)实现controller接口,重写public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 方法
(3)方法返回的是ModelAndView对象,在方法里调用service方法,执行数据库操作,这里模拟静态数据
(4)modelAndView.addObject("itemsList", itemsList); //request的setAttribut,在jsp页面中通过itemsList取数据,在jsp页面根据itemsList获取数据
modelAndView.setViewName("itemsList.jsp"); //设置view页面
package xidian.lili.controller;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import xidian.lili.po.Items;
public class ItemsController1 implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//里面实现servcie方法,相当于在action里调用service
ArrayList<Items> itemsList=new ArrayList<Items>();
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);
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
配置处理器映射器
映射器的作用是根据url来找到调用哪个Handler,根据这个映射器的名字,我们可以知道url就是Handler对象的 name 属性,那么顺便配置Handler
配置Handler
(1)Handler对象的class属性就是编写的controller类,name属性我们可以自己定义,但是最后要以.action结尾,因为我们在web.xml文件中配置前端控制器的时候,servlet-mapping中url-pattern中的配置,前端控制器只能解析.action结尾的url。这才会把url给处理器适配器。
(2)这样当用户请求的url是以/queryItem.action结尾,映射器扫描配置文件中的所有bean的name属性,找到对象的name属性,也就找到了要执行的Handler
配置视图解析器
配置视图解析器,发现默认使用jstl视图标签,所以要有jstl的jar包