Spring web MVC实现Demo

Sping web MVC介绍和实现原理

Spring web MVC的项目框架流程图如下:
这里写图片描述

通过写一个小型Demo来熟悉和深入理解Spring web MVC的流程。
项目代码下载地址
编译环境:
Intellij IDEA,tomcat

先建立一个SpringMVC web项目。
这里写图片描述
把Spring MVC和web Application勾上。

**输入项目名->next
此时会下载Spring相应的架包,网速慢,漫长等待。。。**

此时创建的项目中Spring web MVC已经提供DispatcherServlet ,HanderMapping,ViewResolver三个重要组件,具体的业务控制器和视图文件需要自己加。

Demo实现的需求是:发出一个hello.form请求,显示/WEB-INF/下的hello.jsp页面。
(WEB-INF是web应用的安全目录,web-inf文件夹在正常情况下系统是不允许外界直接访问的,因为有些页面需要接收信息显示,只是一个模板,如果直接访问就只有模板信息而没有处理结果的数据信息,但是系统可以自身进行访问,所有要使系统去访问的话就需要使用拦截控制器去接受外界命令,由控制器来转发访问请求,当然如果JSP不放在安全目录中,也可以加一个过滤器阻止对某些jsp的直接访问)

建立一个业务控制器HelloController来转发请求,再在/WEB-INF/下建立一个请求调用的hello.jsp页面。
项目目录结构如下:
这里写图片描述
先不贴代码,跟着框架流程一步一步走。

如果客户端发出一个form请求,这个请求要经过DispatcherServlet这个前置控制器,DispatcherServlet配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,分析一下web.xml文件(IDEA自动配置了,不知道其他开发工具是否也补全)
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">
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.form</url-pattern>
    </servlet-mapping>
</web-app>
<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>

在启动 Web 项目时 , web 容器 ( 比如tomcat ) 会先读取 web.xml 文件中的两个节点listener 和 context-param,接着容器会创建一个 ServletContext 对象 (也就是 servlet上下文 ), 这个 web 项目的所有部分都将共享这个上下文。我理解的是,在context-param节点中设值applicationContext.xml,那么web容器就可以使用Spring配置的组件了。

<servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>*.form</url-pattern>
    </servlet-mapping>

设置Servlet拦截匹配规则,拦截下来.form请求,将请求分发给相应的Controller业务控制器处理,那么经过DispatcherServlet拦截下来的请求如何分发呢?此时就需要用到HanderMapping组件了,HanderMapping有四种映射处理器,其原理一样,只是实现方式不同,映射就是将请求名和Controller对应起来,现在使用较简单的一种,使用注解来映射寻找controller,
DefaultAnnotationHandlerMapping,步骤是:
1.开启注解扫描组件
2.在类上标记:@Controller 声明该类是一个springMVC Controller
3.在方法上使用:@RequestMapping() 声明该方法处理哪一个请求
按照这个步骤
先在applicationContext.xml开启注解扫描

<context:component-scan base-package="com.hnust.springmvc"/>

在applicationContext.xml添加标签

<mvc:annotation-driven />

这是一种简写模式,相当于在xml文件中定义了HanderMapping和其他一些Bean组件,定义了这个简写的标签,才能在Controller方法中使用 @RequestMapping注解来实现请求的处理。(自动提示有四个,选用:xmlns:mvc=”http://www.springframework.org/schema/mvc”)。

在HelloController中添加代码:

package com.hnust.springmvc;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    @RequestMapping("/hello.form")
    public String excute(){
        return "hello";
    }

}

通过开启组件扫描,Controller组件中被RequestMapping标记的方法就可以处理该请求,这样,就建立起了请求名和Controller组件的对应关系。虽然看不到HanderMapping的组件代码,因为框架已经提供了它的实现,可以通过注解直接使用就行。

标记的方法返回一个hello字符串,表明请求调用hello相关视图,如何找到视图呢,这时候需要使用到ViewResolver视图解析器组件了。

在Spring容器applicationContext.xml定义ViewResolver组件

<!--定义ViewResolver-->

 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/"/>
    <property name="suffix" value=".jsp"/>
 </bean>

ViewResolver组件接收HelloController处理的结果,也就是”hello”字符串,然后在添加定义的前缀和后缀信息,形成了”/WEB-INF/hello.jsp”完整的视图文件路径,生成响应结果,由web容器解析,在客户端显示。
hello.jsp代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Test</title>
</head>
<body>
    Hello Spring web MVC
</body>
</html>

程序已经写好,现在开始部署项目
这里写图片描述
这里写图片描述

启动部署项目的服务器,出现警告和错误信息:

11-Apr-2018 11:26:39.772 警告 [RMI TCP Connection(2)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [4.0]. Default version will be used.
11-Apr-2018 11:26:40.089 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
11-Apr-2018 11:26:40.090 严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [/swmtest] startup failed due to previous errors

解决方案:
这里写图片描述

重新运行服务器:
这里写图片描述
运行返回默认的index.jsp页面内容,表示项目部署成功。

在url中提出hello.form请求
这里写图片描述

通过这个简单的Demo熟悉了Spring web MVC的处理流程,后续再写一个登录检查,实际数据列表显示的Spring web MVC项目。

猜你喜欢

转载自blog.csdn.net/superxiaolong123/article/details/79881335