model1:jsp充当页面展示和后端控制器
model2:jsp负责页面展示,servlet负责后端控制
Spring MVC基于model2实现的框架
一 SpringMVC demo
1 添加依赖
2 配置web.xml
先通过<url-pattern>找到<servlet>中对应的<servlet-name>,再执行<servlet-class>,<servlet>中的<init-param>为了指定执行的xml文件(不写也是可以的,默认路径是WEB-INF/[servlet-name]-servlet.xml的文件,否则会报错,在上图中就是需要WEB-INF下的dispatcherServlet-servlet.xml的文件)
3 配置SpringMVC的配置文件(有两种)
(1)如果控制类用的是实现Controller接口的话,下图即可,prefix表示前缀,suffix表示后缀,路径需要使用name来标识一个控制器的路径,因为id属性不能有特殊字符"/",根据name属性的路径执行相关的类
(2)注解的情况下
需要在添加命名空间为mvc和context, <mvc:default-servlet-handler />(配置缺省的servlet处理器,静态资源可以直接访问)<context:component-scan base-package="com.qianfeng.controller"/>(上下文组件扫描)<mvc:annotation-driven/>(配置注解驱动,不加会使requestMapping失效)
4 创建Controller包及控制类(两种)
(1)实现Controller接口
返回类型是ModelAndView,下图的对象里可以写一个参数,表示需要跳转页面的地址(因为我在xml使用了默认加入前缀和后缀,所以这里只写了"index"),也可以是三个参数,第一个参数是需要跳转页面的地址,第二和第三个参数可以看成设置request域的参数,前者是名称,后者是要放进域里的数据
(2)注解式
需要在类名上加@Controller(因为Controller已经被标明了他是一个组件,用@Controller也可以将这个类标明为组件),@RequestMapping(拦截范围)可以放在类或方法上,都写上会形成多级路径,getAll方法内参数可以是HttpServletRequestServletRequest,HttpSession和Model类型
错误
原因:tomcat中有servlet-api包,与添加的servlet-api冲突
解决方法:在servlet-api和依赖中添加<scope>provided</scope>表明该依赖只在编译和测试的时候用,tomcat启动时并不冲突
jsp-api依赖中最好也添加<scope>provided</scope>