Spring学习手册(15)—— Hello Spring MV
目前为止我们通过Sprint学习手册系列,学习了Spring核心框架技术: IOC和AOP技术,同时我们学习了如何在Spring框架体系下整合mybatis数据持久框架和log4j2日志框架。通过这些学习和实践,我们已经可以使用Spring核心框架完成JAVA后台服务开发工作。本文我们学习Spring MVC框架的使用入门。
一、 创建Web项目
本文依然使用IDEA创建WEB项目,使用旗舰版(官网提供30天试用版)可以直接创建web项目,当然我们也可以使用社区版创建项目然后修改相应配置。若安装的为社区版,建议直接下载文末提供的工程示例,在此工程基础上进行编写自己的代码。
我们在HelloSpring一文中比较详细的介绍了IDEA创建Gradle工程的步骤,若有疑惑可在此查看此文。IDEA创建WEB项目需要注意的是我们需要勾选Web
选项,如下图所示:
这样完成项目创建后,IDEA会自动创建webapp目录并设置好
build.gradle
文件。
二、增加依赖jar包
我们的项目需要增加spring-mvc
和spring-webmvc
两个jar包的依赖,增加完成,build.gradle
文件内依赖关系配置如下:
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
testCompile group: 'junit', name: 'junit', version: '4.12'
compile 'org.springframework:spring-webmvc:4.3.6.RELEASE'
compile 'org.springframework:spring-web:4.3.6.RELEASE'
compile 'org.springframework:spring-core:4.3.6.RELEASE'
}
项目工程目录下运行如下命令
gradle build
或等待IDEA自动下载并加载解析相关依赖jar包。
三、Spring MVC基础知识
Spring MVC(model-view-controller)框架围绕着DispatcherServlet
进行设计,该Servlet将请求转发给相应的控制器,然后使用控制器处理后的模型进行视图渲染。像大多数MVC框架一样,它很好的将业务逻辑和视图解耦,除此之外,它还完美的支持Spring核心框架技术:IOC和AOP,在Spring MVC框架中你可以像简单的通过配置使用Spring的IOC和AOP技术。
Spring 3.0以后,提供了@Controller
、@RequestMapping
等注解的方式来完成控制器的定义等工作,这使开发更加简便。
四、Hello Spring MVC实战
配置DispatcherServlet(定义web.xml)
在webapp/WEB-INF
文件夹下(若不存在WEB-INF文件夹则创建)下创建web.xml
文件,文件配置如下:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Spring MVC Application</display-name>
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
如上所示,我们使用<servlet>
标签配置DispatcherServlet并且使用<servlet-name>
标签为该servlet命名为HelloWeb。接下来我们使用<servlet-mapping>
标签为该servlet配置映射关系,如上所示,所有路径以/
开始的都会被名为HelloWeb的servlet进行处理。
定义HelloWeb-servlet.xml文件
我们在web.xml文件里定义了名为HelloWeb的servlet,Spring MVC框架启动是会初始化该Servlet,默认情况下框架使用[servlet-name]-servlet.xml
的文件格式查找该servlet的配置信息。为简便起见,我们使用该约束方式创建HelloWeb-servlet.xml
并配置,该文件内容如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.liangwei.learning" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
如上所示,该配置文件与以前学习到的Spring配置文件相同,这里值得一提的是,Spring 3.0 增加了@Controller
等注解,使得我们可以直接使用注解的方式进行定义配置控制器,而Spring MVC也提供一种配置方式,使得Spring MVC在加载时自动扫描所有有@Controller
和@RequestMapping
注解的类,并将其注册为控制器(bean)。我们使用该配置<context:component-scan base-package="com.liangwei.learning" />
,并制定base-package
,框架会自动在该包名下扫描并注册控制器。
除上述配置外,我们需要配置为该Servlet配置ViewResolver
,这里我们使用InternalResourceViewResolver
,并且配置前缀为/WEB-INF/jsp/
,后缀为.jsp
,这样当控制器返回一个hello的String类型实例时,框架会将其解析为/WEB-INF/jsp/hello.jsp
,然后查找该视图文件并使用渲染器渲染视图。
定义控制器(HelloController)
前面我们定义了Servlet并且完成了其配置工作,接下来我们定义一个控制器:HelloController:
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping(method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Spring MVC Framework!");
return "hello";
}
}
如上所示,我们使用@Controller
注解注解HelloController,由于我们前面已经配置了<context:component-scan>
标签,框架会自动扫描并注册控制器。我们使用@RequestMapping
注解并设置"/hello"
值,这是的所有的请求路径为/hello
的请求被分发到该控制器。这里我们将@RequestMapping
路径设置在类上,当然我们也可以将该注解设置在具体方法上,我们会在后面的文章讲解它们之间的区别。我们的控制器类提供了printHello
方法,该方法签名拥有一个ModelMap
类型参数,并且返回String类型值。该方法使用@RequestMapping(method = RequestMethod.GET)
设置只接受GET方法。这样的配置使得我们的控制器会接受/hello路径的GET请求。
定义视图文件hello.jsp
我们配置好了Servlet,且定义了控制器,接下来我们需要配置视图文件hello.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
该文件存储在/WEB-INF/jsp路径下,命名为hello.jsp:这跟我们前面的HelloWeb-servlet.xml的配置有关。该文件为简单的JSP视图文件,它会从模型中获取名为message
的信息,并交给渲染器进行渲染。
以上我们就完成了Hello Spring MVC项目的开发和配置工作。接下来我们需要学习如何将它部署在Tomcat服务上并通过浏览器访问。
五、部署到Tomcat
安装配置Tomcat
本文非Tomcat学习文章,所以这里我们只简单介绍如何安装和配置Tomcat。我们可以直接访问官网查找下载相应版本。该项目我使用的是Tomcat9.0版,在该页面下下载Core下的.zip
包,当然如果你是windows环境可下载相应版本。下载完成后我将其解压到~/Library/Tomcat9/
目录下,然后将该路径设置到Path路径下:
export PATH=$HOME/Library/Tomcat9/bin:$PATH
作者使用的是zsh,因此该命令配置在~
路径下的.zshrc
文件内,如果读者使用不同的shell或使用windows平台需使用相应设置方式。
这样我们就完成了Tomcat的安装和简单配置。这个时候我们进入~/Library/Tomcat9/
目录,使用如下命令可以看到tomcat启动信息。
startup.sh
我们可以使用shutdown.sh
来关闭服务。
Tip :在Unix或Linux系统情况下,可能出现无法启动,此时需要使用如下命令修改文件权限
chmod 755 ~/Library/Tomcat9/bin/*.sh
IDEA 部署项目设置
选择Run/EditConfigurations
打开配置页面:
将弹出如下图所示结果:
配置页面
点击+号,选择Tomcat Server/Local,将弹出如下配置页面:
配置Tomcat
我们首先为该配置命名为HelloSpringMVC,然后点击Configure设置Tomcat根目录。这个时候你会发现右下角有一个红色Fix按钮,点击它,选择将要部署的war包,页面会跳转到Deployment选项卡:
Deployment
在Application context配置上/HelloSpringMVC ,点击OK,完成配置。这样我们的项目根目录将为
localhost:8080/HelloSpringMVC
启动项目
回到IDEA工程目录下,点击绿色按钮将启动项目并将项目war包部署到Tomcat,控制台会输出启动日志,稍等一会项目启动完成。
启动项目
访问项目
启动浏览器,将http://localhost:8080/HelloSpringMVC/hello
输入到地址栏,我们将看到如下界面:
恭喜你,你已经完成了helloSpringMVC项目的开发和部署工作。
直接部署到Tomcat安装目录
除了上述部署方式外,我们可以直接将war包拷贝到~/Library/Tomcat9/webapps/
目录下,然后启动Tomcat服务器,服务器会自动将war包解压。如HelloSpringMVC.war 包,会被解压~/Library/Tomcat9/webapps/HelloSpringMVC
目录下,此时我们可以使用localhost:8080/HelloSpringMVC/hello
来访问,其中HelloSpringMVC为解压后的名字。另外我们可以在工程build/libs目录下找到编译好的war包。
六、总结
本文我们学习了Spring MVC框架的实用,通过实战的方式定义Servlet、配置Servlet、定义Controller和定义视图文件完成HelloSpringMVC项目的开发,最后我们通过使用IDEA部署和直接Tomcat部署的方式完成项目的部署。这样我们就完成了一个最简单的Spring MVC项目,通过HelloSpringMVC项目我们踏入了Spring MVC框架的大门。
项目源码地址