我们利用Maven创建一个web项目,使用注解的处理器映射器、处理器适配器和非注解的处理器映射器、处理器适配器。
编写SpringMVC程序的步骤:
-
需求
-
环境准备
-
配置前端控制器
-
配置处理器适配器
-
配置处理器映射器
-
配置视图解析器
1. 非注解开发SpringMVC
1.1 需求
向前端页面输出hello world!
1.2 环境配置
Maven及导包注意点
- 资源过滤问题
- 导包不要漏
pom.xml
<?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>org.xaio</groupId>
<artifactId>SpringMVC-Study01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>SpringMVC-Study01 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<dependencies>
<!--junit包单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Spring MVC 及 Spring系列包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.24.RELEASE</version>
</dependency>
<!--jstl 和 jsp的包-->
<!--Servlet核心-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<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>
1.3 注册SpringMVC核心Servlet
-
注册前端控制器
DispatcherServlet
-
关联SpringMVC的配置文件,
springmvc-servlet.xml
-
启动级别为1,要和服务器一起启动; load-on-startup,启动级别,数字越小级别越高!
-
映射路径为 / 【不要用/*,会404】
【注意】路径配置方式:
- 第一种:
.action
,访问以.action结尾的DispatcherServlet进行解析。 - 第二种:
/
,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析。
使用此种方法,可以实现RESTful风格的url。 - 第三种:
/*
,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler进行解析 。
- 第一种:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!--1.配置前端控制器 DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联SpringMVC配置文件-->
<!--contextConfigLocation:配置springmvc加载的配置文件,配置处理映射器、处理适配器-->
<!--若不配置,默认加载的是/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml)-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--3.这个东西要和服务器一起启动;
load-on-startup,启动级别,数字越小级别越高!-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--所有请求都会经过这个DispatcherServlet请求分发器-->
<!--
/和/*的区别:
< url-pattern > / </ url-pattern > 不会匹配到.jsp, 只针对我们编写的请求;
即:.jsp不会进入spring的 DispatcherServlet类 。
< url-pattern > /* </ url-pattern > 会匹配*.jsp,
会出现返回jsp视图时再次进入spring的DispatcherServlet 类,导致找不到对应的controller所以报404错。
-->
<!--4.映射路径为 / -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
1.4 编写SpringMVC的配置文件
- 配置处理器适配器
- 配置处理器映射器
- 配置视图解析器
springmvc-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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--2. 配置处理器映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--请求映射 将url映射到指定的处理器 Controller。
将自己的类交给SpringIOC容器,注册bean-->
<bean id="/hello" class="org.xiao.controller.HelloController"/>
<!--3. 配置处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--4.配置视图解析器-->
<bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
1.5 编写处理器 Controller类
- 类需要实现Controller接口 , 可以让IOC容器管理 , 等价于Bean
- 我们使用ModelAndView来存储处理完的结果数据;显示该数据的视图;
使用ModelAndView需要自己手动实例化ModelAndView的对象; return modelAndView;
它会去视图解析中拼接前缀和后缀来找到对应的视图
HelloWorldController.java
package org.xiao.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 编写处理器Handler,
// 返回Model and View
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
// 封装对象,放在ModelAndView中。
// 在jsp页面中,通过"msg"取数据
modelAndView.addObject("msg", "hello world!");
//指定视图
modelAndView.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
return modelAndView;
}
}
1.6 视图层
-
注意视图的位置,要和视图解析器对应 /WEB-INF/jsp ,
为什么需要在web-inf路径下 ?, 因为这个路径下的东西用户无法直接访问 , 更加安全;
-
可以通过EL表示取出Model中存放的值,或者对象;
hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC</title>
</head>
<body>
${msg}
</body>
</html>
1.7 测试
启动Tomcat测试。
1.8 结果
2. 注解开发SpringMVC
2.1 需求
(同上)
2.2 环境配置
(同上)
2.3 注册SpringMVC核心Servlet
(同上)
2.4 编写SpringMVC的配置文件
-
配置处理器映射器、处理器适配器
<mvc:annotation-driven/>
-
让IOC的注解生效
-
静态资源过滤
-
视图解析器
springmvc-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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://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的注解生效-->
<!--扫描指定包下的注解,让指定的类能够被IOC容器管理-->
<context:component-scan base-package="org.xiao.controller"/>
<!--2.3.MVC的注解驱动 配置处理器映射器、处理器适配器 -->
<!--annotation-driven:支持MVC注解驱动 -->
<mvc:annotation-driven/>
<!--.静态资源过滤 :HTML . JS . CSS . 图片 , 视频 .....-->
<mvc:default-servlet-handler/>
<!--4.配置视图解析器-->
<!-- 视图解析器 作用;方便统一管理 -->
<bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2.5 编写处理器 Controller类
-
需要给类加注解 :
@Controller
, 可以让IOC容器管理 , 等价于Bean -
请求映射的路径 :
@RequestMapping ("路径")
,如果类上有就先写类的,再写方法的;若只有方法上有,则请求路径为http://localhost:8080/项目名/方法请求路径;
若类和方法上都有,则请求路径为http://localhost:8080/项目名/类请求路径/方法请求路径。
-
Model :模型传递参数
-
return "hello";
它会去视图解析中拼接前缀和后缀来找到对应的视图AnnoController.java
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
//@RequestMapping("/hi") 可省
public class AnnoController {
//请求映射(路径)
@RequestMapping("/hello")
// Model是在每次请求中都存在默认参数;
// 我们利用addAttribute方法将服务器的运行的结果或者程序猿自己写的值传递到jsp页面中;
// Model拿来即用,当做请求的参数传递进去即可!
public String hello(Model model){
model.addAttribute("msg","Hello,SpringMVC");
System.out.println("进入HELLO");
return "hello"; //WEB-INF/jsp/hello.jsp
}
//ModelAndView , 模型和视图
@RequestMapping("/hello2")
//我们使用ModelAndView来存储处理完的结果数据;显示该数据的视图;
//使用ModelAndView需要自己手动实例化ModelAndView的对象;
public ModelAndView hello(HttpServletRequest req, HttpServletResponse resp){
//业务逻辑
ModelAndView mv = new ModelAndView();
mv.addObject("msg","Hello,SpringMVC!!");//给ModelAndView放入数据
mv.setViewName("hello");
return mv;
}
}
2.5 视图层
(同上)
2.6 测试
启动Tomcat进行测试。
2.7 结果
若只有方法上有@RequestMapping
类和方法上都有@RequestMapping