目录
5 SpirngMVC工作流程图文
5.1 SpringMVC执行流程图
ps:
- 前端控制器也就是DisPatcherServlet。
5.2 SringMVC工作原理图
相关路径的具体文字说明:
1. DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心,用户发来请求,DispatcherServlet接收请求并拦截请求。
2. HandlerMapping是处理器映射器,被DispatcherServlet调用,HandlerMapping根据请求Url查找Handler。
3. HandlerExcuter 表示具体的Handler,其主要作用是根据url查找控制器。
4. HandlerExcuter 会将一些解析后的信息返回给DispatchServlet,例如解析控制器映射等。
5. HandlerAdapter 表示处理器适配器,其按照特定的顺序去执行Handler。
6. Handler让具体的Controller去执行。
7. 返回一个具体执行信息给HandlerAdapter,如ModelAndView。
8. HandlerAdapter返回一个具体的ModelAndView给DispatcherServlet.
9. DispatcherServlet把ModelAndView传给视图解析器解析HandlerApater传递过来的逻辑视图名。
10. ViewResolver将解析完的逻辑视图名传给DispatcherServlet.
11. Diapatcher根据视图解析器返回的逻辑视图名,去调用具体的视图。
12. 最终将视图呈现给用户。
重新写了HelloSpringMVC项目,发现了几个问题:
- 在Controller中写setViewName的时候只是写对应页面的名字。因为在springmvc-servlet.xml中对ModelAndView设置了默认添加前缀和后缀。
- 在springmvc-servlet.xml中配置bean的时候,相关的conrtonl类对应的id是\页面名.
6 使用注解进行SpringMVC开发
6.1 编写web.xml文件,配置DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 配置DispatcherServlet-->
<!--注册Servlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
<!--通过初始化参数指定SpringMVC配置文件的位置,进行关联-->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--所有请求都会被DispatcherServlet拦截-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
注意事项:
- 注意web.xml的版本问题,一定是要最新版的
- 映射路径不能是/* 会导致报错404,因为.jsp无限循环。
- 要在web.xml中配置DispatcherServlet。
- 启动级别为1,数字越小启动越早。和服务一起启动。
6.2 编写SpringMVC对应的springmvc-servlet.xml配置文件:
在这个配置文件中要达到的目的:
- 让IOC的注解生效
- 静态资源过滤:HTML、JS、CSS、图片、视频。。。
为了支持基于注解的IOC,设置了自动扫描包的功能
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc = "http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--自动扫描包,让指定包下的注解生效,由IOC容器统一管理-->
<context:component-scan base-package="com.swrici.controller"/>
<!--让Spring MVC不处理静态资源-->
<mvc:default-servlet-handler />
<!--
支持mvc注解驱动
在Spring中一般采用@RequestMapping注解来完成映射关系
要想使@RequestMapping 注解生效
必须向上下文中注册DefaultAnnotationHandlerMapping和
一个AnnotationMethodHandlerAdapter实例
这两个实例分别在类级别和方法级别处理
而annotation-driven 配置帮助我们自动完成上述两个实例的注入。
-->
<mvc:annotation-driven />
//配置前缀后缀,让从ModelAndView中返回的页面名加上前缀后缀
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
这个文件是固定的格式。
6.3 编写继承Controller的类(作为例子需要)
@Controller
@RequestMapping("/HelloController")
public class MyController {
//真实访问地址:localhost:端口号/HelloController/hello
@RequestMapping("/hello")
public String hello(Model model){
//封装数据,向模型中添加属性msg和值,可以在JSP页面中取出并渲染
model.addAttribute("msg","Hello,SpringMVCAnnotation");
return "hello";//返回视图名称,会被视图解析器处理转变成对应的页面名
}
}
6.4 要注意的地方
- @Controller 注解是为了让Spring IOC容器初始化时自动扫描到
- @RequestMapping是为了映射请求路径,这里因为类和方法上都有映射所以访问时应该时/HelloController/hello;
- 方法中声明的Model是为了把Action中的数据带到视图中。
- 方法返回的结果是视图的名称hello,再加上配置文件的前后缀就变成了/WEB-INF/jsp/hello.jsp
步骤小结:
- 创建一个web项目。
- 导入相应的jar包。
- 编写web.xml,在其中注册DispatcherServlet的servlet。
- 编写springmvc-servlet.xml配置文件,这个文件是为了将工作交给Spring管理。
- 创建对应的控制类,controller
- 最后完善前端视图和conrtoller之间的对应
- 测试运行调试
使用SpringMVC必须的三大组件:
- 处理器映射器
- 处理器适配器
- 视图解析器
处理器映射器和处理器适配器由Spring容器负责,要做对应的xml文件中开启注解驱动<mvc:annotation-driven />
用annotation-driven 帮助我们自动完成上述两个实例的注入。我们需要的是自己在xml配置文件中编写视图解析器。