SpringMVC-01-HelloSpringMVC
1、所需依赖
相关说明都写在了注释上
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bing</groupId>
<artifactId>SpringMVC</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>SpringMVC-01-servlet</module>
</modules>
<dependencies>
<!-- junit:4.12-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- MVC的包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!-- servlet2.5-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!-- 支持jsp中的一些表达式的-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
2、HelloSpringMVC
2.1、跟着官网敲一遍
1、配置 DisparateServlet,web.xml
- 作用:它用来管理所有的Controller层的servlet,让我们以后的servlet都不要配置了
<!--1.注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别-1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--/ 匹配所有的请求;(不包括.jsp)-->
<!--/* 匹配所有的请求;(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2、配置bean
-
处理映射器
-
<!--添加 处理映射器--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-
处理适配器
<!-- 添加 处理器适配器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
-
视图解析器
<!--视图解析器:DispatcherServlet给他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
3、编写Controller,并把它配置到Spring中
public class ControllerDemo01 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//ModelAndView 模型和视图
ModelAndView mv = new ModelAndView();
//封装对象,放在ModelAndView中。Model
mv.addObject("msg","HelloSpringMVC!");
//封装要跳转的视图,放在ModelAndView中
mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
return mv;
}
}
- 装配到Spring中
<bean id="/hello" class="com.bing.controller.ControllerDemo01"/>
4、测试
5、遇到的问题
发现代码都没写错,缺报错很可能是idea项目结构中没导入jar包的问题,为什么会出现这个问题呢?因为我们一上来建的是普通的maven项目,所以idea不会自动添加依赖到项目中
像jar问题之前还遇到过servlet的jar包和Tomcat不匹配的情况
而此时解决方案是:在项目结构中手动导入
问题解决~
2.2、解释原理
0、知识补充
全部的SpringMVC是围绕着DispatcherServlet进行展开的,翻译是调度Servelt
0.1、分析url
其实url是由很多部分组成:举例子:
http://localhost:8080/SpringMVC/hello
片段 | 作用 |
---|---|
http/https | 网络协议 |
localhost:8080 | 服务器域名 |
SpringMVC | 表示部署在服务器上的站点 |
hello | hello表示控制器 |
1、DispatcherServlet
-
HanderMapping:由DispatcherServlet调用,来查找所对应的hander
-
HanderExcute:用HanderMapping调用,来查找具体的控制器,本例中就是hello,并携带它返回给DispatcherServlet
-
HanderAdapter:DispatcherServlet调用HanderAdapter,其按照特定的规则去执行Handler,Handler让具体的Controller执行 在由这个适配器通过hander携带的信息调用对应的控制层controller,携带或者解析控制层传过来的信息在传递给DispatcherServlet,如ModelAndView
-
视图解析器:DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
视图解析器将解析的逻辑视图名传给DispatcherServlet。
DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
最终视图呈现给用户。
2.3、运行过程
1、客户访问url,之间请求DispatcherServlet
说明:<url-pattern>/</url-pattern>
中填/ 和/* 的区别:
- / 代表很处理所有/ 下的controller
- / * 范围更大包括了jsp html css···
所以我们选用 ‘/’
2、到springmvc-servlet.xml中寻找
找到这个控制器(/hello)封装成handler对象返回给DispatcherServlet
3、通过HanderAdapter找到controller并执行
返回ModleAndView给DiapatcherServlet
4、携带ModleAndView访问视图过滤器
视图过滤器渲染页面又返回给DiapatcherServlet
2.3、精简一下
-
配web.xml
-
BeanNameUrlHandlerMapping
-
SimpleControllerHandlerAdapter
-
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
-
<!-- 控制器--> <bean id="/hello" class="com.bing.controller.ControllerDemo01"/>