3.1、xml配置
-
添加jar包依赖
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.5.RELEASE</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <!--依赖范围必须加,不加会报错--> <scope>provided</scope> </dependency> </dependencies>
-
配置web.xml文件
<!--1、注册DispatcherServlet====配置前端控制器(Controller)--> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 初始化时加载配置文件 默认查找/WEB-INF/${servlet-name}-servlet.xml文件 --> <!--初始化参数时,读取SpringMVC的配置文件。配置SpringMVC配置文件的位置--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <!--启动时加载 如果不配置:当第一次访问当前servlet,tomcat才会加载这个servlet、 配置正整数,意味着tomcat启动,就自动加载这个servlet --> <load-on-startup>1</load-on-startup> </servlet> <!--映射--> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <!-- 代表缺省(默认)的servlet,当一个请求找不到与之对应的servlet的时候,就找这个缺省的servlet 最终结果:拦截所有浏览器发出的请求 --> <!-- / 匹配所有的请求(不包括.jsp)--> <!-- /* 匹配所有的请求(包括.jsp)--> <url-pattern>/</url-pattern> </servlet-mapping>
-
配置spring-mvc.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: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"> <!--配置映射器--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--配置适配器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--Handler--> <bean id="/hello" class="com.k2.入门.controller.FirstController"></bean> <!--视图解析器:DispatcherServlet给他的ModelAndView 1、获取了ModelAndView的数据 2、解析ModelAndView的名字 3、拼接视图名字,找到对应的视图 /WEB-INF/pages/success.jsp 4、将数据渲染到这个视图 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--配置路径--> <property name="prefix" value="/WEB-INF/pages/"></property> <!--配置后缀名--> <property name="suffix" value=".jsp"></property> </bean> </beans>
-
编写controller
public class FirstController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { // ModelAndView 模型和视图 ModelAndView mv = new ModelAndView(); // 调用业务层 // 封装对象,放在ModelAndView中,model mv.addObject("msg","HelloSpringMVC"); // 封装要跳转的视图,放在ModelAndView中 mv.setViewName("success"); return mv; } }
-
编写jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h2>这是FirstController页面</h2> </body> </html>
可能遇到的问题:访问出现404,排查步骤:
- 查看控制台输出,看一下是不是缺少了什么jar包。
- 如果jar包存在,显示无法输出,就在IDEA的项目发布中,添加lib依赖!
- 重启Tomcat 即可解决!
小结:我们实际开发才不会这么写,不然就疯了,还学这个玩意干嘛!我们来看个注解版实现,这才是SpringMVC的精髓,到底有多么简单,看这个图就知道了。
3.2、注解配置
打包时候Maven存在过滤问题
<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>
步骤
- 导入jar包依赖
Spring框架核心库
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
SpringMVC
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
Servlet
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--依赖范围必须加,不加会报错-->
<scope>provided</scope>
</dependency>
JSTL(EL表达式)
<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>
- 配置web.xml
<!--1、注册DispatcherServlet====配置前端控制器(Controller)-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化时加载配置文件
默认查找/WEB-INF/${servlet-name}-servlet.xml文件
-->
<!--初始化参数时,读取SpringMVC的配置文件。配置SpringMVC配置文件的位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--启动时加载
如果不配置:当第一次访问当前servlet,tomcat才会加载这个servlet、
配置正整数,意味着tomcat启动,就自动加载这个servlet
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--映射-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!--
代表缺省(默认)的servlet,当一个请求找不到与之对应的servlet的时候,就找这个缺省的servlet
最终结果:拦截所有浏览器发出的请求
-->
<!-- / 匹配所有的请求(不包括.jsp)-->
<!-- /* 匹配所有的请求(包括.jsp)-->
<url-pattern>/</url-pattern>
</servlet-mapping>
/和/*的区别:/不会匹配到.jsp,只针对我们编写的请求:即.jsp不会进入spring的DispatcherServlet类。/**会匹配* *.jsp,会出现返回jsp视图时再次进入spring的DispatcherServlet类,导致找不到对应的controller所以报404错。
-
-
注意web.xml版本问题,要最新版!
-
注册DispatcherServlet
-
关联SpringMVC的配置文件
-
启动级别为1
-
映射路径为 / 【不要用/*,会404】
-
-
配置spring-mvc.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: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">
<!--注解扫描-->
<context:component-scan base-package="com.k2.入门.controller"></context:component-scan>
<!--
注解驱动:
不仅显示配置了映射器和适配器
还支持很多支持其他操作,例如json
-->
<mvc:annotation-driven/>
<!-- 让SpringMVC不处理静态资源-->
<mvc:default-servlet-handler />
<!--视图解析器:DispatcherServlet给他的ModelAndView
1、获取了ModelAndView的数据
2、解析ModelAndView的名字
3、拼接视图名字,找到对应的视图 /WEB-INF/pages/success.jsp
4、将数据渲染到这个视图
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置路径-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!--配置后缀名-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
在视图解析器中我们把所有的视图都存放在/WEB-INF/目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问。
-
- 注解包扫描
- 静态资源过滤:HTML、JS、CSS…
- MVC的注解驱动
- 配置视图解析器
-
创建Controller
@Controller
public class FirstController{
@RequestMapping("/firstController")
public String sayHello(Model model) {
//向模型中添加属性msg与值,可以在JSP页面中取出并渲染
model.addAttribute("msg","hello,SpringMVC");
System.out.println("访问第一个Controller");
// string返回值,默认是视图的名字(视图解析器的前缀+此处的字符串+视图解析器的后缀)
return "success";
}
}
-
- @Controller是为了让Spring IOC容器初始化时自动扫描到
- @RequestMapping是为了映射请求路径
- 方法中声明Model类型的参数是为了把Action中的数据带到视图中;
- 方法返回的结果是视图的名称hello,加上配置文件中的前后缀变成WEB-INF/pages/success.jsp。
-
创建jsp页面
在WEB-INF/ pages目录中创建success.jsp , 视图可以直接取出并展示从Controller带回的信息;
-
可以通过EL表示取出Model中存放的值,或者对象;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>这是FirstController页面</h2>
${msg}
</body>
</html>
步骤:
- 新建一个web项目
- 导入响应的jar包
- 编写web配置文件,注册DispatcherServlet
- 编写spring-mvc配置文件
- 创建Controller类
- 创建前端视图
- 运行
3.3、小结
SpringMVC必须配置的三大组件:
- 处理器映射器handleMapping
- 处理器适配器handleAdapte
- 视图解析器viewResolver
我们只需要配置 视图解析器即可,处理器映射器和处理器适配器只需要开启注解驱动即可,不需要再使用xml配置