启动Tomcat,浏览器输入 http://localhost:8080/hello 页面显示success
HelloController运行流程:
1).客户端(浏览器)点击链接发送localhost:8080/hello请求
2).Tomcat收到请求
3).SpringMVC的dispatchServlet前端控制器收到所有请求
4).dispatchServlet查看请求地址和@RequestMapping标注的哪个Controller类的方法相匹配
5).前端控制器知道目标类和方法,利用反射执行目标方法
6).方法执行完成之后会有一个返回值,SpringMVC认为这个返回值就是要去的页面
7).拿到返回值,使用视图解析器拼接得到完整的页面地址
8).前端控制器根据地址转发到具体页面
applicationContext.xml配置文件
在web.xml配置文件中的param-value标签下指定了配置文件位置,Spring MVC有默认的配置文件。
注销配置文件,启动Tomcat
报错"Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]" 默认会找这个配置文件springmvc-servlet.xml
修改Servlet名字为dispatcherServlet,再次启动Tomcat,可以看出默认配置文件名称为DispatcherServlet Bean的名字-servlet.xml
如果想不指定配置文件,就需要在WEB-INF目录下配置一个名字为[Servlet名字-servlet.xml]的配置文件,Spring MVC会在Tomcat容器启动时自动查找这个文件
在WEB-INF下创建一个dispatchServlet-servlet.xml文件,文件内容就是原来resources目录下applicationContext.xml的内容,并将applicationContext.xml删除,再次启动Tomcat
不再报错,页面可以正常访问
"/" 与 "/*" 的区别
web.xml配置文件中url-parttern标签的 "/" 代表拦截所有请求(不包括JSP页面),"/*"拦截所有请求包括jsp页面这些请求,将配置中的“/”改为“/*”,重新启动容器,并访问/hello,出现404报错
控制台报错如下
说明 "/" 拦截的请求不包括jsp页面,"/*" 拦截所有的请求,包括jsp页面
在web目录下增加index.html,将 “/*” 改为 “/”,重启容器,访问index.html
页面无法访问,控制台报错,这是为什么?
首先tomcat文件中conf文件夹下本身就有一个web.xml文件,项目中的web.xml就是继承Tomcat conf文件夹下的web.xml
Tomcat中web.xml相当于是父类,其中配置了DefaultServlet,专门用来处理静态资源的,项目中web.xml是子类,都配置了 "/",相当于子类重写了父类的方法,那么Tomcat中的web.xml中的defualtServlet配置的 "/" 也就失效了,也就无法处理html静态资源了。
其中default配置类 "/"
项目中配置 “/” 不拦截jsp请求是为了放行jsp,将jsp交由tomcat处理,tomcat的web.xml中有一个JspServlet,专门处理*.jsp文件的
“/*” 就是直接拦截所有请求,"/" 是为了迎合Rest风格的URL地址
@RequestMapping注解
Spring MVC 使用@RequestMapping注解标注xxController或者方法可以处理哪些URL请求
- @RequestMapping定义在类上表明提供上层URL地址,这是针对方法上@RequestMapping的URL地址来说的
- @RequestMapping定义在方法上,标注了方法能够处理的具体请求
在controller包下创建一个MappingController,测试@RequestMapping注解
plus:不能两个方法处理同一个请求即不能有两个方法的RequestMapping中value是一样的 严格遵循一个方法处理一个请求
@RequestMapping标注在类上,为当前所有方法所处理的请求前增加前缀
@Controller @RequestMapping("/mapping") public class MappingController { @RequestMapping("/handle") public String handle(){ String method = Thread.currentThread().getStackTrace()[1].getMethodName(); System.out.println(this.getClass().getSimpleName() + "类的" + method + "方法正在执行"); return "success"; } } 复制代码
浏览器输入http://localhost:8080/mapping/handle