1.SprIngMVC简介
1.为什么要学SprIng MVC?
- 轻量级,简单易学
- 高效,基于请求响应的MVC框架
- 与Spring兼容性好,无缝结合
- 约定大于配置
- 功能强大:Restful,数据验证,格式化,本地化,主题等
- 简介灵活
2.SpringMVC执行原理
1.MVC执行原理:
1.用户发送一个请求,
2.控制器接收一个请求,这里控制器的作用就是,接收请求,调用业务类,派发页面
3.控制器将请求交给模型层去处理,模型层就是dao,service,entity
4.控制器返回一个处理的结果给控制器。
5.控制器视图渲染给视图层。
6.在响应给用户。
2.Spring和SpringMvc的关系:
SpringMVC是一个MVC的开源框架,SpringMVC是Spring的一个后续产品,其实就是Spring在原有基础上,又提供了web应用的MVC模块,可以简单的把SpringMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说SpringMVC和Spring无缝集成,其实SpringMVC就是Spring的一个子模块,所以根本不需要同spring进行整合。
3.SpringMVC中的组件:
前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。
处理器映射器(HandlerMapping):根据URL去查找处理器
处理器(Handler):(需要程序员去写代码处理逻辑的)
处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)
视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面
4.SpringMvc底层原理
Springmvc核心三要素:
- 处理器映射器
- 处理器适配器
- 视图解析器
案例理解:
准备工作:
需要导入的包
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
1.配置web.xml
<!--注册一个DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个spring mvc的配置文件,springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--设置启动级别-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--/是匹配所有的请求,不包括.jsp.
/*是匹配所有的请求包括.jsp
-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这里是/,它不会包含.jsp
如果是/*它会包含.jsp页面,会无限了包含.jsp.jsp最后在过滤中会出现死循环。
1 和服务器一起启动。
2.配置springmvc-servlet.xml
<!--配置一个处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!--配置一个处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!--配置一个视图解析器,DispatcherServlet给它的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--配置前缀和后缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<bean id="/hello" class="com.kuang.controller.HelloController"></bean>
注意这里的的前缀和后缀的配置中,后面的jsp/的后面杠不能丢。
这个表示在我们请求时,只用写一个hello就可以了,它自动配置为/WEB-INF/jsp/hello.jsp
BeanNameUrlHandlerMapping这个映射器就是专门来映射bean id=“/hello”的。还有很多映射器
3.配置HelloController
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//新建一个模型和视图
ModelAndView mv = new ModelAndView();
//封装对象,放在模型和视图中
mv.addObject("msg","helloSpringmvc");
//封装要跳转的视图,防止ModelAndView中。访问的地址就是/WEB-INF/jsp/hello.jsp
mv.setViewName("hello");
return mv;
}
}
这里的Controller是导入的spring的接口包。不是其他的Controller注解
这里主要是给它哦那个模型和视图,给一个对象消息和访问的地址,最后返回就可以。
4.在/WEB-INF/jsp/下建立一个hello.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>消息</title>
</head>
<body>
${msg}
</body>
</html>
当用户请求/hello时,就可以看到在页面上的hellospringmvc消息。
执行流程:
1.先进入web.xml,找到DispatcherServlet,找到对象的配置文件,springmvc-servlet.xml
2.在springmvc-servlet.xml中,我们找到其处理器映射器,获取一个handler对象,返回。在找到一个处理器适配器HandlerAdapter,执行handler,在控制中执行,返回一个modelandview对象。
3.将MV对象交给视图层解析器去解析,返回一个解析后视图逻辑。这里就是解析前缀和后缀,并将其和hello进行拼接,找到在WEB-INF/jsp/hello.jsp文件,
4.HelloController只负责把消息丢进去,在指定的文件名上发送就可以了,最后返回一个ModerAndView对象给视图层。即第三步。
可能遇到的错误:
如果启动过程中发现有404错误,
- 先看文件的地址有没有写对,value="/WEB-INF/jsp/"这里一个斜杠都不能少。
- 在idea中找到project Structure->点击artifacts—>找到对应的war包----点击----看看WEB-INF中有没有出现lib,没有就自己建一个lib,----点击+号,library files—>全选包,然后导入apply应用一下即可。在重启之后就会成功。