“好雨知时节,当春乃发生”

最近在学习SpringMVC,看到第一章,使用SpringMVC框架。

首先,需要到spring的网站上下载需要依赖的jar包:

下载地址为:Spring下载地址 如下图,有从3.2.0一直到5.1.1各种版本的spring。我在这里刚开始下载的是最新的5.1版本,发现项目跑不起来。是因为版本高了。最终选择了4.2.0的版本。所以,笔者推荐使用4.2.0版本。

springmvc 打war包配置 springmvc打包成jar包_Spring MVC


点击4.2.0进去之后,选择第一个zip下载:

springmvc 打war包配置 springmvc打包成jar包_Spring_02

下载完成之后,解压,你可以看到如下目录:

springmvc 打war包配置 springmvc打包成jar包_springmvc 打war包配置_03


进入lib文件夹,拷贝该文件夹下的所有jar包放到你的项目中:

springmvc 打war包配置 springmvc打包成jar包_springmvc 打war包配置_04


PS:实际上,类似于上图所示的带“-javadoc”和“-sources”的jar包是不需要加进项目的。当然,导进去也没有影响。

此时,还需要下载一个common-logging的jar包,因为spring的核心容器必须依赖此包。下载地址为:common-logging下载地址 点击下图所示,即可开始下载:

springmvc 打war包配置 springmvc打包成jar包_构建Spring框架_05


同样,在下载完成之后,解压放到项目的lib文件夹下;此时,你的项目结构应该如下图:

springmvc 打war包配置 springmvc打包成jar包_构建Spring框架_06

PS:至于在IDEA中如何创建动态的web项目,请看我的上一篇文章:Idea中创建JavaWeb项目

做完准备工作之后,现在开始构建框架:

  1. 增加Spring的支持:在web.xml文件中配置Spring MVC的前端控制器DispatcherServlet。配置如下:
<!--定义SpingMvc 的前端控制器-->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/springmvc-config.xml</param-value>
        </init-param>
        <!-- 系统启动就加载 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--让springMVC的前端控制器拦截所有请求-->
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
  1. 新建Spring MVC的配置文件,即上面参数contextConfigLocation的值:springmvc-config.xml。在WEB-INF文件夹下创建名为springmvc-config.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!--spring可以自动去扫描base-pack 下面的包或者子包下面的java文件,如果扫描到有Spring的相关注解的类,则把这些类注册为Spring的bean-->
    <context:component-scan base-package="org.fkit.controller"/>
    <!--配置annotation类型的处理映射器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
    <!--配置annotation类型的处理器适配器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
</beans>
  1. 创建基于注解的控制器
package org.fkit.controller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

/**
 * @author aRunner
 * @date 2018/10/27
 * helloController是一个基于注解的控制器,可以同时处理多个请求动作,并且无需试实现任何接口
 */
@Controller
public class HelloController {

    private static final Log logger = LogFactory.getLog(HelloController.class);

    /**
     *@author aRunner
     *@date 2018/10/27
     *@description 带有@ModelAttribute注解的方法会先于下面的hello方法执行
     */
    @ModelAttribute
    public void useModel(HttpServletRequest request,Model model) {
        String user = request.getParameter("user");
        System.out.println("输出user" + user);
        model.addAttribute("user",user);
    }

    /**
     *@author aRunner
     *@date 2018/10/27
     *@description @RequestMapping注解用来映射请求的URL和请求的方法等,hello只是一个普通方法,该方法返回一个包含视图名或视图名和模型的ModelAndView对象
     */
    @RequestMapping(value = "/hello")
    public ModelAndView hello(Model model) {
        logger.info("hello方法 被调用");
        System.out.println("输出hello方法中的user" + model.asMap().get("user"));
        //创建准备分返回的ModelAndView对象,该对象通常包含了返回视图名、模型的名称以及模型对象
        ModelAndView mv = new ModelAndView();
        //添加模型数据,可以是任意的pojo对象
        mv.addObject("message","Hello World!");
        //设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
        mv.setViewName("/WEB-INF/content/welcome.jsp");
        //返回ModelAndView对象
        return mv;
    }
}

4.创建视图页面,用来显示欢迎信息(根据spring的配置文件中我们也可以知道,该视图页面在/WEB-INF/content目录下):

<%--
  Created by IntelliJ IDEA.
  User: aRunner
  Date: 2018/10/27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>welcome</title>
</head>
<body>
<%--页面可以访问到Controller传递出来的message--%>
${requestScope.message}
</body>
</html>

5.接下来,启动项目即可访问:

springmvc 打war包配置 springmvc打包成jar包_构建Spring框架_07


PS:图中参数后面的“%27”是单引号在URL转义之后的形式。

6.再来看看控制台的输出:

springmvc 打war包配置 springmvc打包成jar包_Spring MVC_08


在这里要着重强调的是,从控制台的打印信息可以看出:在上面HelloController类中,带有@ModelAttribute注解的useModel方法明显是先于带有@RequestMapping注解hello方法。并且,从URL传进来的参数user在useModel方法中被存进Model对象,同时,在hello中,从Model对象取出了user参数的值。

当然,在这里,你也可以使用ModelAndView对象来存取数据:

springmvc 打war包配置 springmvc打包成jar包_springmvc 打war包配置_09