1、新建項目
打開idea,通過File->new->project,會彈出如下的信息:
接下來點擊下一步,創建項目,點擊“下一步”:
選擇默認的Maven以及setting文件,點擊“下一步”:
輸入項目名稱以及項目存放位置,點擊“完成”:
至此,我們創建項目的步驟就完成了。這時會進入idea,可能需要一定的時間,這個是由於要下載一些包,所以大家耐心的等待。
當maven 加載完畢會有提示,我們的項目會生成相應的包,如圖:
2、配置maven
打開pom.xml, 輸入版本以及配置信息信息。
配置dependencies,引入以來的Spring和Spring MVC的包:
這里可能需要一定的時間,當下載這些包后,可以在下圖的位置看到相應的jar:
詳細配置信息附上代碼:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.houjing</groupId> <artifactId>springmvc</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>springmvc Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-web --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.0.6.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.0.6.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.6.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/taglibs/standard --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <finalName>springmvc</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
3、配置web.xml
配置攔截請求,其中包括DispatcherServlet以及CharacterEncodeingFilter,請注意servelet-name和filter-name必須一致:
附加代碼:

<?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_3_1.xsd" version="3.1"> <display-name>springmvc</display-name> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
4、配置DispatcherServlet
根據web.xml的servlet-name添加mvc-dispatcher-servlet.xml,在WEB-INF,新建mvc-dispatcher-servlet.xml文件。
他的前綴dispatcher對應上邊web.xml中配置的servlet(名稱可修改),節選web.xml如下:
<servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
輸入名字mvc-dispatcher-servlet:
修改mvc-dispatcher-servlet.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:mvc="http://www.springframework.org/schema/mvc" 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 啟動注解驅動的Spring MVC功能,注冊請求url和注解POJO類方法的映射--> <mvc:annotation-driven /> <!-- 啟動包掃描功能,以便注冊帶有@Controller、@Service、@repository、@Component等注解的類成為spring的bean --> <context:component-scan base-package="com.houjing.springmvc*" /> <!-- 靜態資源(js、image等)的訪問 --> <mvc:default-servlet-handler/> <!-- 開啟注解 --> <mvc:annotation-driven/> <!--ViewResolver 視圖解析器,在請求時模型視圖名稱添加前后綴--> <!--用於支持Servlet、JSP視圖解析--> <!--static resource--> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
5、建立源碼包java
MVC框架有model、view、controller三部分組成。model一般為一些基本的Java Bean,view用於進行相應的頁面顯示,controller用於處理網站的請求。
在項目的src目錄創建一個包用於存放controller。
輸入java:
然后新建Controller目錄,並且新建Controller:DemoController.java:
代碼如下,會自動跳轉到hello.jsp:
package com.houjing.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class DemoController { @RequestMapping(value = "/", method = RequestMethod.GET) public String printHello(ModelMap model) { System.out.println("Welcome to the DemoController!"); model.addAttribute("msg", "Spring MVC Hello World"); model.addAttribute("name", "success!"); return "hello"; } }
構建hello.jsp:
代碼如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>${msg}</title> </head> <body> <h1>${msg}</h1> <span>${name}</span> </body> </html>
到此基本目錄以及配置構建完成。
5、配置tomcat
添加tomcat服務器:
進入界面后,點擊左上角的“+”,滑動到底部的tomcat server,選擇local。
修改名字,配置tomcat的路徑,如下圖,由於我這里之前配置有tomcat8了,所以大家可以按照自己的時間情況添加。
配置好后,還需要對我們的程序壓縮包添加tomcat里面:
6、運行程序
點擊綠色的按鈕,啟動tomcat:
可以在控制台看到:
/Volumes/work/apache-tomcat-9.0.8/bin/catalina.sh run [2018-06-03 07:42:20,786] Artifact springmvc:war: Waiting for server connection to start artifact deployment... NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 03-Jun-2018 19:42:22.658 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/9.0.8 03-Jun-2018 19:42:22.666 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Apr 27 2018 19:32:00 UTC 03-Jun-2018 19:42:22.667 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 9.0.8.0 03-Jun-2018 19:42:22.667 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Mac OS X 03-Jun-2018 19:42:22.668 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 10.13.4 03-Jun-2018 19:42:22.668 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: x86_64 03-Jun-2018 19:42:22.668 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home 03-Jun-2018 19:42:22.668 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 10.0.1+10 03-Jun-2018 19:42:22.670 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: "Oracle Corporation" 03-Jun-2018 19:42:22.670 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /Users/houjing/Library/Caches/IntelliJIdea2018.1/tomcat/Unnamed_springmvc 03-Jun-2018 19:42:22.670 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /Volumes/work/apache-tomcat-9.0.8 03-Jun-2018 19:42:22.672 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED 03-Jun-2018 19:42:22.672 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED 03-Jun-2018 19:42:22.673 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED 03-Jun-2018 19:42:22.673 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/Users/houjing/Library/Caches/IntelliJIdea2018.1/tomcat/Unnamed_springmvc/conf/logging.properties 03-Jun-2018 19:42:22.673 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 03-Jun-2018 19:42:22.673 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote= 03-Jun-2018 19:42:22.673 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.port=1099 03-Jun-2018 19:42:22.673 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.ssl=false 03-Jun-2018 19:42:22.674 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcom.sun.management.jmxremote.authenticate=false 03-Jun-2018 19:42:22.674 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.rmi.server.hostname=127.0.0.1 03-Jun-2018 19:42:22.674 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048 03-Jun-2018 19:42:22.674 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 03-Jun-2018 19:42:22.675 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 03-Jun-2018 19:42:22.675 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs= 03-Jun-2018 19:42:22.675 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/Users/houjing/Library/Caches/IntelliJIdea2018.1/tomcat/Unnamed_springmvc 03-Jun-2018 19:42:22.675 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/Volumes/work/apache-tomcat-9.0.8 03-Jun-2018 19:42:22.675 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/Volumes/work/apache-tomcat-9.0.8/temp 03-Jun-2018 19:42:22.675 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/Users/houjing/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.] 03-Jun-2018 19:42:22.742 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"] 03-Jun-2018 19:42:22.758 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 03-Jun-2018 19:42:22.768 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"] 03-Jun-2018 19:42:22.769 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 03-Jun-2018 19:42:22.769 信息 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 862 ms 03-Jun-2018 19:42:22.915 信息 [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] 03-Jun-2018 19:42:22.916 信息 [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/9.0.8 03-Jun-2018 19:42:22.937 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] 03-Jun-2018 19:42:22.991 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"] 03-Jun-2018 19:42:22.994 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 224 ms Connected to server [2018-06-03 07:42:23,443] Artifact springmvc:war: Artifact is being deployed, please wait... 03-Jun-2018 19:42:24.782 信息 [RMI TCP Connection(2)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 03-Jun-2018 19:42:24.986 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.servlet.FrameworkServlet.initServletBean FrameworkServlet 'mvc-dispatcher': initialization started 03-Jun-2018 19:42:25.015 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.context.support.AbstractApplicationContext.prepareRefresh Refreshing WebApplicationContext for namespace 'mvc-dispatcher-servlet': startup date [Sun Jun 03 19:42:25 CST 2018]; root of context hierarchy 03-Jun-2018 19:42:25.067 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions Loading XML bean definitions from ServletContext resource [/WEB-INF/mvc-dispatcher-servlet.xml] 03-Jun-2018 19:42:25.380 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition Overriding bean definition for bean 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping' with a different definition: replacing [Root bean: class [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Root bean: class [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] 03-Jun-2018 19:42:25.380 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition Overriding bean definition for bean 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter' with a different definition: replacing [Root bean: class [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Root bean: class [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] 03-Jun-2018 19:42:25.380 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition Overriding bean definition for bean 'mvcUriComponentsContributor' with a different definition: replacing [Root bean: class [org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser$CompositeUriComponentsContributorFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Root bean: class [org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser$CompositeUriComponentsContributorFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] 03-Jun-2018 19:42:25.793 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.register Mapped "{[/],methods=[GET]}" onto public java.lang.String com.houjing.springmvc.controller.DemoController.printHello(org.springframework.ui.ModelMap) 03-Jun-2018 19:42:25.877 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.initControllerAdviceCache Looking for @ControllerAdvice: WebApplicationContext for namespace 'mvc-dispatcher-servlet': startup date [Sun Jun 03 19:42:25 CST 2018]; root of context hierarchy 03-Jun-2018 19:42:25.934 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.initControllerAdviceCache Looking for @ControllerAdvice: WebApplicationContext for namespace 'mvc-dispatcher-servlet': startup date [Sun Jun 03 19:42:25 CST 2018]; root of context hierarchy 03-Jun-2018 19:42:26.000 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.servlet.handler.AbstractUrlHandlerMapping.registerHandler Mapped URL path [/**] onto handler 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0' 03-Jun-2018 19:42:26.095 信息 [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.servlet.FrameworkServlet.initServletBean FrameworkServlet 'mvc-dispatcher': initialization completed in 1109 ms [2018-06-03 07:42:26,113] Artifact springmvc:war: Artifact is deployed successfully [2018-06-03 07:42:26,113] Artifact springmvc:war: Deploy took 2,670 milliseconds Welcome to the DemoController! Welcome to the DemoController!
接下來會自動跳轉到瀏覽器界面。
7、問題一:NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config
現象:
使用spring mvc進行開發,使用tomcat容器,通過url映射尋找view的時候,會報錯NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config,如果隨便去找個jstl包過來放入web-inf/lib會報錯,正確的maven引入地址為:
<!-- https://mvnrepository.com/artifact/taglibs/standard --> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/jstl --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
重啟tomcat服務器即可。