“好雨知时节,当春乃发生”
最近在学习SpringMVC,看到第一章,使用SpringMVC框架。
首先,需要到spring的网站上下载需要依赖的jar包:
下载地址为:Spring下载地址 如下图,有从3.2.0一直到5.1.1各种版本的spring。我在这里刚开始下载的是最新的5.1版本,发现项目跑不起来。是因为版本高了。最终选择了4.2.0的版本。所以,笔者推荐使用4.2.0版本。
点击4.2.0进去之后,选择第一个zip下载:
下载完成之后,解压,你可以看到如下目录:
进入lib文件夹,拷贝该文件夹下的所有jar包放到你的项目中:
PS:实际上,类似于上图所示的带“-javadoc”和“-sources”的jar包是不需要加进项目的。当然,导进去也没有影响。
此时,还需要下载一个common-logging的jar包,因为spring的核心容器必须依赖此包。下载地址为:common-logging下载地址 点击下图所示,即可开始下载:
同样,在下载完成之后,解压放到项目的lib文件夹下;此时,你的项目结构应该如下图:
PS:至于在IDEA中如何创建动态的web项目,请看我的上一篇文章:Idea中创建JavaWeb项目
做完准备工作之后,现在开始构建框架:
- 增加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>
- 新建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>
- 创建基于注解的控制器
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.接下来,启动项目即可访问:
PS:图中参数后面的“%27”是单引号在URL转义之后的形式。
6.再来看看控制台的输出:
在这里要着重强调的是,从控制台的打印信息可以看出:在上面HelloController类中,带有@ModelAttribute注解的useModel方法明显是先于带有@RequestMapping注解hello方法。并且,从URL传进来的参数user在useModel方法中被存进Model对象,同时,在hello中,从Model对象取出了user参数的值。
当然,在这里,你也可以使用ModelAndView对象来存取数据: