SpringMVC-02HelloSpringmvc
2、HelloSpringMVC
2.1、配置版
-
创建一个新的Moudle,并添加web的支持
-
确认是否导入了SpringMVC的依赖!
-
配置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 :这个是SpringMVC的核心;请求分发器,前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 绑定 SpringMVC 的配置文件 --> <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> <!-- 在SpringMVC 中 / 和 /* 的区别 / : 只匹配所有的请求,不会去匹配.jsp文件 /*: 匹配所有请求,包括.jsp文件 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
编写SpringMVC的配置文件!名称:springmvc-servlet.xml :[servletname]-servlet.xml
说明 :[servletname]-servlet.xml 是按照官方的要求来的
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
-
添加 处理器映射器
<!-- 添加 处理映射器 --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-
添加 处理器适配器
<!-- 添加 处理器适配器 --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
-
添加 视图解析器
<!-- 添加 视图解析器 --> <!--视图解析器:DispatcherServlet给他的ModelAndView 1、获取了 ModelAndView 的数据 2、解析了 ModelAndView 中的视图名字 3、拼接视图名字 找到对应的视图 即 前缀 + 名字 + 后缀 /WEB-INF/jsp/hello.jsp 4、将数据渲染到视图 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 后缀 --> <property name="suffix" value=".jsp"/> </bean>
-
编写我们要操作的业务Controller,要么实现Controller接口,要么增加注解;需要返回一个ModelAndView,来封装数据根视图
public class MyController implements Controller { public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView(); // 处理业务 String result = "hello SpringMVC"; mv.addObject("msg",result); // 视图跳转 mv.setViewName("hello"); return mv; } }
-
将类注册到SpringIOC容器中,注册bean
<!-- BeanNameUrlHandlerMapping : bean --> <bean id="/hello" class="com.hello.springmvc.MyController"/>
-
编写跳转的jsp页面,展示ModelAndView中封装的数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${msg} </body> </html>
-
启动tomcat,测试
-
可能遇到的问题 :访问出现404,排查步骤:
-
查看控制台输出,看一下是不是缺少了什么jar包
-
如果jar包存在,显示无法输出,就在IDEA项目发布中,添加lib依赖
-
重启tomcat。
-
小结:看这个估计大部分同学都能理解其中的原理了,但是我们实际开发才不会这么写,不然就疯了,还学这个玩意干嘛!我们来看个注解版实现,这才是SpringMVC的精髓,到底有多么简单,看这个图就知道了。
2.2、注解版
-
新建一个moudle,并添加依赖!
-
由于maven可能存在资源过滤问题,在pom.xml中添加以下配置
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
-
在pom.xml中引入的相关依赖有 :Spring框架核心库、SpringMVC、servlet、JSTL等。这些在父依赖中已经引入了!
-
配置web.xml
注意点:
<?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"> <?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 :这个是SpringMVC的核心;请求分发器,前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 绑定 SpringMVC 的配置文件 --> <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> <!-- 在SpringMVC 中 / 和 /* 的区别 / : 只匹配所有的请求,不会去匹配.jsp文件 /*: 匹配所有请求,包括.jsp文件 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> <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> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
- 在SpringMVC 中 / 和 /* 的区别
/ : 只匹配所有的请求,不会去匹配.jsp文件
/*: 匹配所有请求,包括.jsp文件 - 注意web.xml版本问题,要最新版!
- 注册DispatcherServlet
- 关联springmvc-servlet.xml文件
- 启动级别为1
- 映射路径为 / 【不要用 /* ,会报404】
- 在SpringMVC 中 / 和 /* 的区别
-
添加Spring MVC配置文件
- 让IOC的注解生效
- 静态资源过滤 :HTML . JS . CSS . 图片 , 视频 …
- MVC的注解驱动
- 配置视图解析器
在resource目录下添加springmvc-servlet.xml配置文件,配置的形式与Spring容器配置基本类似,为了支持基于注解的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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 --> <context:component-scan base-package="com.springmvc.controller"/> <!-- 让Spring MVC不处理静态资源 过滤掉一些静态资源,如.css .js .html .mp3--> <mvc:default-servlet-handler /> <!-- 支持mvc注解驱动 在spring中一般采用@RequestMapping注解来完成映射关系 要想使@RequestMapping注解生效 必须向上下文中注册DefaultAnnotationHandlerMapping 和一个AnnotationMethodHandlerAdapter实例 这两个实例分别在类级别和方法级别处理。 而annotation-driven配置帮助我们自动完成上述两个实例的注入。 --> <mvc:annotation-driven /> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 后缀 --> <property name="suffix" value=".jsp" /> </bean> </beans>
-
创建Controller
@Controller @RequestMapping("hello") public class HelloController { /* 如果在类上有@RequestMapping注解的时候,该路劲为 hello/h1 类上的路劲为父路径,方法上的为子路径 */ @RequestMapping("h1") public String hello(Model model){ // 封装数据 model.addAttribute("msg","Hello,Annotation,SpringMVC"); return "hello"; // return的数据会被视图解析器处理 前缀 + name + 后缀 } }
- @Controller是为了让Spring IOC容器初始化时自动扫描到;
- @RequestMapping是为了映射请求路径,这里因为类与方法上都有映射所以访问时应该是/HelloController/hello/h1;
- 方法中声明Model类型的参数是为了把Action中的数据带到视图中;
- 方法返回的结果是视图的名称hello,加上配置文件中的前后缀变成WEB-INF/jsp/hello.jsp。
-
创建视图层
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${msg} </body> </html>
-
配置Tomcat,启动并测试
-
小结
实现步骤其实非常的简单:
- 新建一个web项目
- 导入相关jar包
- 编写web.xml , 注册DispatcherServlet
- 编写springmvc配置文件
- 接下来就是去创建对应的控制类 , controller
- 最后完善前端视图和controller之间的对应
- 测试运行调试.
使用springMVC必须配置的三大件:
处理器映射器、处理器适配器、视图解析器
通常,我们只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可,而省去了大段的xml配置