{"id":58020,"date":"2018-07-04T15:00:30","date_gmt":"2018-07-04T12:00:30","guid":{"rendered":"http:\/\/examples.javacodegeeks.com\/?p=58020"},"modified":"2022-07-13T12:50:10","modified_gmt":"2022-07-13T09:50:10","slug":"spring-maven-tutorial","status":"publish","type":"post","link":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/","title":{"rendered":"Spring with Maven Tutorial"},"content":{"rendered":"<p>In this post, we feature a comprehensive Tutorial on Spring with Maven. Spring Framework is a Java application framework that provides many useful services for building applications. Apache Maven is a software project management and comprehension tool. In this article, I will demonstrate how to build a web application utilizing Spring MVC framework as a Maven project.<\/p>\n<\/p>\n<div class=\"toc\">\n<h3>Table of Contents<\/h3>\n<dl>\n<dt><a href=\"#heading_1\">1. Introduction<\/a><\/dt>\n<dt><a href=\"#heading_2\">2. Technologies Used<\/a><\/dt>\n<dt><a href=\"#heading_3\">3. Spring Boot Web Application<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading_31\">3.1 Web Application Overview<\/a><\/dt>\n<dt><a href=\"#heading_32\">3.2 Dependency<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading_4\">4. Web Views<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading_41\">4.1 Home View<\/a><\/dt>\n<dt><a href=\"#heading_42\">4.2 User View<\/a><\/dt>\n<dt><a href=\"#heading_43\">4.3 Invalid User View<\/a><\/dt>\n<dt><a href=\"#heading_44\">4.4 Error View<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading_5\">5. Spring MVC Framework<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading_51\">5.1 Configuration<\/a><\/dt>\n<dt><a href=\"#heading_52\">5.2 Controller<\/a><\/dt>\n<dt><a href=\"#heading_53\">5.3 Model<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading_6\">6. Spring Beans<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading_61\">6.1 AccountRepository<\/a><\/dt>\n<dt><a href=\"#heading_62\">6.2 AccountService<\/a><\/dt>\n<dt><a href=\"#heading_63\">6.3 AccountServiceImpl<\/a><\/dt>\n<dt><a href=\"#heading_64\">6.4 Java Configuration<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading_7\">7. Junit Tests<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading_71\">7.1 AccountTest<\/a><\/dt>\n<dt><a href=\"#heading_72\">7.2 AccountServiceImplTest<\/a><\/dt>\n<dt><a href=\"#heading_73\">7.3 WelcomeControllerTest<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading_8\">8. Demo<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#heading_81\">8.1 Start Web Application<\/a><\/dt>\n<dt><a href=\"#heading_82\">8.2 Home View<\/a><\/dt>\n<dt><a href=\"#heading_83\">8.3 Invalid User view<\/a><\/dt>\n<dt><a href=\"#heading_84\">8.4 User View<\/a><\/dt>\n<dt><a href=\"#heading_85\">8.5 Error View<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#heading_9\">9. Summary<\/a><\/dt>\n<dt><a href=\"#heading_10\">10. References<\/a><\/dt>\n<dt><a href=\"#heading_11\">11. Download the Source Code<\/a><\/dt>\n<\/dl>\n<\/div>\n<h2><a name=\"heading_1\"><\/a>1. Introduction<\/h2>\n<p><a href=\"https:\/\/maven.apache.org\/\" target=\"_blank\" rel=\"noopener\">Apache Maven<\/a> is a software project management and comprehension tool. Maven can manage a project&#8217;s build, reporting and documentation from a central piece of information based on the concept of a <a href=\"https:\/\/maven.apache.org\/guides\/introduction\/introduction-to-the-pom.html\" target=\"_blank\" rel=\"noopener\">project object model<\/a> (POM).\u00a0<a href=\"https:\/\/projects.spring.io\/spring-framework\/\" target=\"_blank\" rel=\"noopener\">Spring<\/a> is a Java application framework that provides many useful services for building applications.\u00a0It\u00a0contains many\u00a0modules\u00a0such as <a href=\"https:\/\/docs.spring.io\/spring\/docs\/current\/spring-framework-reference\/overview.html\" target=\"_blank\" rel=\"noopener\">core<\/a>, <a href=\"https:\/\/docs.spring.io\/spring-javaconfig\/docs\/1.0.0.M4\/reference\/html\/ch02s02.html\" target=\"_blank\" rel=\"noopener\">beans<\/a>, <a href=\"https:\/\/spring.io\/understanding\/application-context\" target=\"_blank\" rel=\"noopener\">context<\/a>, <a href=\"https:\/\/docs.spring.io\/spring\/docs\/3.0.x\/reference\/expressions.html\" target=\"_blank\" rel=\"noopener\">expression language<\/a>, AOP, JDBC, JMS, Web, etc.<\/p>\n<p>In this example, I will build a web application as a Maven project to demonstrate these Spring modules:<\/p>\n<ul>\n<li><a href=\"https:\/\/docs.spring.io\/spring-framework\/docs\/current\/javadoc-api\/org\/springframework\/stereotype\/package-summary.html\" target=\"_blank\" rel=\"noopener\">Spring stereotype\u00a0annotations<\/a><\/li>\n<li><a href=\"https:\/\/docs.spring.io\/spring\/docs\/3.0.x\/spring-framework-reference\/html\/mvc.html\" target=\"_blank\" rel=\"noopener\">Spring Model-View-Controller (MVC) framework<\/a><\/li>\n<li><a href=\"https:\/\/projects.spring.io\/spring-data-jpa\/\" target=\"_blank\" rel=\"noopener\">Spring Data JPA<\/a><\/li>\n<li><a href=\"https:\/\/spring.io\/projects\/spring-boot\" target=\"_blank\" rel=\"noopener\">Spring boot<\/a><\/li>\n<li><a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/boot-features-external-config.html\" target=\"_blank\" rel=\"noopener\">Spring property<\/a> sources<\/li>\n<li><a href=\"https:\/\/docs.spring.io\/spring\/docs\/current\/spring-framework-reference\/testing.html\" target=\"_blank\" rel=\"noopener\">Spring test<\/a><\/li>\n<\/ul>\n<h2><a name=\"heading_2\"><\/a>2. Technologies Used<\/h2>\n<p>The example code in this article was built and run using:<\/p>\n<ul>\n<li>Java 1.8.101 (1.8.x will do fine)<\/li>\n<li>Maven 3.3.9 (3.3.x will do fine)<\/li>\n<li>Spring boot 1.5.14\u00a0(Higher version will do fine)<\/li>\n<li>Spring 4.x (Higher version will do fine)<\/li>\n<li>Eclipse Oxygen (Any Java IDE would work)<\/li>\n<li>H2 Database<\/li>\n<\/ul>\n<h2><a name=\"heading_3\"><\/a>3. Spring Boot Web Application<\/h2>\n<p>There are many ways to create a Spring boot web application. The\u00a0easiest way for me is via the Spring starter tool with the steps below:<\/p>\n<ol>\n<li>Go to\u00a0<code>https:\/\/start.spring.io\/<\/code>.<\/li>\n<li>Select\u00a0<code>Maven Project<\/code>\u00a0with\u00a0<code>Java<\/code>\u00a0and Spring Boot version 1.5.14 and type in\u00a0<code>web<\/code>,\u00a0<code>JPA<\/code>,\u00a0and <code>H2<\/code> in the \u201csearch for dependencies\u201d\u00a0bar.<\/li>\n<li>Enter the group name as\u00a0<code>jcg.zheng.demo<\/code>\u00a0and artifact as\u00a0<code>spring-boot-web-jsp-demo<\/code>.<\/li>\n<li>Click the\u00a0<code>Generate Project<\/code>\u00a0button.<\/li>\n<\/ol>\n<p>A maven project will be generated and downloaded to your workstation. Import it into your Eclipse workspace.<\/p>\n<h3><a name=\"heading_31\"><\/a>3.1 Web Application Overview<\/h3>\n<p>In this example, I will build a web application with these features:<\/p>\n<ol>\n<li>Valid account users can login to view their account&#8217;s reward point and the transaction history.<\/li>\n<li>Invalid account users will be rejected by the application.<\/li>\n<li>A URL to load account transaction history.<\/li>\n<\/ol>\n<h3><a name=\"heading_32\"><\/a>3.2 Dependency<\/h3>\n<p>Maven <code>pom.xml<\/code> manages the project libraries. Here is the generated <code>pom.xml<\/code> from <a href=\"#heading_3\">step 3<\/a>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>pom.xml<\/em><\/span><\/p>\n<pre class=\"brush:xml;wrap-lines:false\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n\txmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n\txsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd\"&gt;\n\t&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n\n\t&lt;artifactId&gt;spring-boot-web-jsp-demo&lt;\/artifactId&gt;\n\t&lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\n\n\t&lt;name&gt;spring-boot-web-jsp-demo&lt;\/name&gt;\n\t&lt;description&gt;Demo project for Spring Boot&lt;\/description&gt;\n\n\t&lt;parent&gt;\n\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t&lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;\n\t\t&lt;version&gt;1.5.14.RELEASE&lt;\/version&gt;\n\t\t&lt;relativePath \/&gt; &lt;!-- lookup parent from repository --&gt;\n\t&lt;\/parent&gt;\n\n\t&lt;properties&gt;\n\t\t&lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n\t\t&lt;project.reporting.outputEncoding&gt;UTF-8&lt;\/project.reporting.outputEncoding&gt;\n\t\t&lt;java.version&gt;1.8&lt;\/java.version&gt;\n\t&lt;\/properties&gt;\n\n\t&lt;dependencies&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-boot-starter-data-jpa&lt;\/artifactId&gt;\n\t\t&lt;\/dependency&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n\t\t&lt;\/dependency&gt;\n\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;com.h2database&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;h2&lt;\/artifactId&gt;\n\t\t\t&lt;scope&gt;runtime&lt;\/scope&gt;\n\t\t&lt;\/dependency&gt;\n\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n\t\t\t&lt;scope&gt;test&lt;\/scope&gt;\n\t\t&lt;\/dependency&gt;\n\n\t\t&lt;!-- JSTL --&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;javax.servlet&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;jstl&lt;\/artifactId&gt;\n\t\t&lt;\/dependency&gt;\n\n\t\t&lt;!-- Need this to compile JSP for Embedded Tomcat --&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.apache.tomcat.embed&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;tomcat-embed-jasper&lt;\/artifactId&gt;\t\t\n\t\t&lt;\/dependency&gt;\n\t\n\t\t&lt;!-- Spring MVC --&gt;\n\t\t&lt;dependency&gt;\n\t\t\t&lt;groupId&gt;org.springframework&lt;\/groupId&gt;\n\t\t\t&lt;artifactId&gt;spring-webmvc&lt;\/artifactId&gt;\n\t\t&lt;\/dependency&gt;\n\n\t&lt;\/dependencies&gt;\n\t&lt;build&gt;\n\t\t&lt;plugins&gt;\n\t\t\t&lt;plugin&gt;\n\t\t\t\t&lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n\t\t\t\t&lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n\t\t\t&lt;\/plugin&gt;\n\t\t&lt;\/plugins&gt;\n\t&lt;\/build&gt;\n&lt;\/project&gt;\n<\/pre>\n<h2><a name=\"heading_4\"><\/a>4. Web Views<\/h2>\n<p>I found it&#8217;s useful to define the web views first when working on a web application. There are four views based on the requirements:<\/p>\n<ul>\n<li>Home view &#8211; the web application&#8217;s landing page.<\/li>\n<li>Valid user&#8217;s view &#8211; a valid user can view the account reward point and the transaction history.<\/li>\n<li>Invalid user&#8217;s view &#8211; display an error message to an invalid user.<\/li>\n<li>Error view &#8211; the exception handling view.<\/li>\n<\/ul>\n<p>All of these views are placed at <code>webapp\/WEB-INF\/jsp<\/code> directory. We will configure them in the <code>application.properties<\/code> at <a href=\"#heading_51\">step 5.1<\/a>.<\/p>\n<h3><a name=\"heading_41\"><\/a>4.1 Home View<\/h3>\n<p>In this step, I will create a <code>home.jsp<\/code> page, which displays the server&#8217;s local time, the welcome message from the Spring managed property, and a login form.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>home.jsp<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;!DOCTYPE html&gt;\n\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n\n&lt;\/head&gt;\n&lt;body&gt;\n\n\t&lt;h1&gt;Spring Boot Web JSP Example&lt;\/h1&gt;\n\t&lt;h2&gt;Message From Property: ${message}&lt;\/h2&gt;\n\t&lt;h3&gt;The time on the server is ${serverTime}.&lt;\/h3&gt;\n\n\t&lt;form action=\"user\" method=\"post\"&gt;\n\t\t&lt;input type=\"text\" name=\"userName\"&gt;&lt;br&gt; &lt;input\n\t\t\ttype=\"submit\" value=\"Login\"&gt;\n\t&lt;\/form&gt;\n\n&lt;\/body&gt;\n\n&lt;\/html&gt;\n<\/pre>\n<h3><a name=\"heading_42\"><\/a>4.2 User View<\/h3>\n<p>In this step, I will create a\u00a0<code>user.jsp<\/code> page to display a valid user&#8217;s reward point and the transaction history.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>user.jsp<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;%@ page language=\"java\" contentType=\"text\/html; charset=UTF-8\"\n\tpageEncoding=\"UTF-8\"%&gt;\n&lt;%@taglib prefix=\"c\" uri=\"http:\/\/java.sun.com\/jsp\/jstl\/core\"%&gt;\n&lt;%@ taglib prefix=\"spring\" uri=\"http:\/\/www.springframework.org\/tags\"%&gt;\n&lt;!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.01 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/html4\/loose.dtd\"&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;spring:url value=\"\/css\/main.css\" var=\"demoCSS\" \/&gt;\n\n&lt;link href=\"${demoCSS}\" rel=\"stylesheet\"&gt;\n&lt;meta http-equiv=\"Content-Type\" content=\"text\/html; charset=UTF-8\"&gt;\n&lt;title&gt;User Home Page&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\t&lt;h3&gt;Hi ${account.firstname} ${account.lastname}!&lt;\/h3&gt;\n\n\t&lt;p&gt;Account Id: ${account.id}     Reward Point:${account.rewardPoint}&lt;\/p&gt;\n\n\t&lt;h3&gt;Transaction Detail&lt;\/h3&gt;\n\n\t&lt;table&gt;\n\t\t&lt;tr&gt;\n\t\t\t&lt;th&gt;Date&lt;\/th&gt;\n\t\t\t&lt;th&gt;Payee&lt;\/th&gt;\n\t\t\t&lt;th&gt;Description&lt;\/th&gt;\n\t\t\t&lt;th&gt;Amount&lt;\/th&gt;\n\t\t&lt;\/tr&gt;\n\t\t&lt;c:forEach var=\"listValue\" items=\"${account.transactions}\"&gt;\n\t\t\t&lt;tr&gt;\n\t\t\t\t&lt;td&gt;${listValue.createdDate}&lt;\/td&gt;\n\t\t\t\t&lt;td&gt;${listValue.payeeName}&lt;\/td&gt;\n\t\t\t\t&lt;td&gt;${listValue.description}&lt;\/td&gt;\n\t\t\t\t&lt;td&gt;${listValue.amount}&lt;\/td&gt;\n\t\t\t&lt;\/tr&gt;\n\t\t&lt;\/c:forEach&gt;\n\t&lt;\/table&gt;\n\n&lt;\/body&gt;\n&lt;\/html&gt;<\/pre>\n<h3><a name=\"heading_43\"><\/a>4.3 Invalid User View<\/h3>\n<p>In this step, I will create an <code>invalidUser.jsp<\/code> page to display an invalid user message.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>invalidUser.jsp<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;%@page contentType=\"text\/html\" pageEncoding=\"UTF-8\"%&gt;\n&lt;%@ page session=\"false\"%&gt;\n\n&lt;html&gt;\n&lt;head&gt;\n&lt;meta http-equiv=\"Content-Type\" content=\"text\/html; charset=UTF-8\"&gt;\n&lt;title&gt;Error&lt;\/title&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n\t&lt;h2&gt;Invalid User!&lt;\/h2&gt;\n\t&lt;p&gt;${userName} is not found in the system!&lt;\/p&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n<\/pre>\n<h3><a name=\"heading_44\"><\/a>4.4 Error View<\/h3>\n<p>In this step, I will create an <code>error.jsp<\/code>\u00a0page to handle any unexpected exceptions.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>error.jsp<\/em><\/span><\/p>\n<pre class=\"brush:xml\">&lt;!DOCTYPE html&gt;\n\n&lt;html lang=\"en\"&gt;\n&lt;head&gt;\n\n&lt;\/head&gt;\n&lt;body&gt;\n\n\t&lt;h1&gt;Caught Unexpected Exception&lt;\/h1&gt;\n\n\t&lt;h2&gt;from: ${content}.&lt;\/h2&gt;\n\t&lt;p&gt;due to: ${error}.&lt;\/p&gt;\n\n&lt;\/body&gt;\n\n&lt;\/html&gt;\n<\/pre>\n<h2><a name=\"heading_5\"><\/a>5. Spring MVC Framework<\/h2>\n<h3><a name=\"heading_51\"><\/a>5.1 Configuration<\/h3>\n<p>Spring MVC framework configures the views based on the naming convention.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>application.properties<\/em><\/span><\/p>\n<pre class=\"brush:bash\"># Spring MVC view prefix.\nspring.mvc.view.prefix: \/WEB-INF\/jsp\/\n\n# Spring MVC view suffix.\nspring.mvc.view.suffix: .jsp\n\n# Locations of static resources.\nspring.resources.staticLocations:\/resources\/static\/\n\n#disable the white label when using an embedded servlet container.\nserver.error.whitelabel.enabled = false\n\nspring.mvc.throw-exception-if-no-handler-found=true\n\nwelcome.message: Hello from Spring boot Web JSP Demo!<\/pre>\n<h3><a name=\"heading_52\"><\/a>5.2 Controller<\/h3>\n<p><a href=\"https:\/\/docs.spring.io\/spring-framework\/docs\/current\/javadoc-api\/org\/springframework\/stereotype\/Controller.html\" target=\"_blank\" rel=\"noopener\">@Controller<\/a> is a stereotype annotation. It is\u00a0a specialization of the\u00a0<code>@Component<\/code>\u00a0class and allows implementation classes to be auto-detected. It is a part of the Spring MVC framework and typically used on request handling methods along with a\u00a0<code>@RequestMapping<\/code>\u00a0annotation. It returns a\u00a0<code>ModelAndView<\/code>\u00a0object.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>In this step, I will create a <code>WelcomeController<\/code> class which provides four methods:<\/p>\n<ul>\n<li><code>welcome<\/code>\u00a0&#8211; maps to the web application root context (<code>\"\/\"<\/code>) and returns the <code>home<\/code> view.<\/li>\n<li><code>user<\/code>\u00a0&#8211; maps to the web application user context (<code>\"\/user\"<\/code>) and returns the <code>user<\/code> view for a valid user and<code>invalidUser<\/code> view for an invalid user.<\/li>\n<li><code>setup<\/code>\u00a0&#8211; maps to the web application context (<code>\"\/loadTestData\"<\/code>).<\/li>\n<li><code>exceptionHandler<\/code>\u00a0&#8211; annotates with <code>@ExceptionHandler<\/code> for any unexpected exceptions.<\/li>\n<\/ul>\n<p><span style=\"text-decoration: underline;\"><em>WelcomeController.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring;\n\nimport java.math.BigDecimal;\nimport java.text.DateFormat;\nimport java.util.Date;\nimport java.util.Locale;\nimport java.util.Map;\n\nimport javax.servlet.http.HttpServletRequest;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.stereotype.Controller;\nimport org.springframework.ui.Model;\nimport org.springframework.validation.annotation.Validated;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\n\nimport jcg.zheng.demo.spring.entity.Account;\nimport jcg.zheng.demo.spring.model.User;\nimport jcg.zheng.demo.spring.repository.AccountRepository;\nimport jcg.zheng.demo.spring.service.AccountService;\nimport jcg.zheng.demo.spring.util.TestData;\n\n@Controller\npublic class WelcomeController {\n\t@Autowired\n\tprivate AccountService accountService;\n\n\t@Autowired\n\tprivate AccountRepository acctRep;\n\n\t\/\/ inject via application.properties\n\t@Value(\"${welcome.message:test}\")\n\tprivate String message = \"Hello World\";\n\n\t@RequestMapping(\"\/\")\n\tpublic String welcome(Locale locale, Map model) {\n\t\tmodel.put(\"message\", this.message);\n\t\tSystem.out.println(\"Home Page Requested, locale = \" + locale);\n\t\tDate date = new Date();\n\t\tDateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);\n\n\t\tString formattedDate = dateFormat.format(date);\n\n\t\tmodel.put(\"serverTime\", formattedDate);\n\t\treturn \"home\";\n\t}\n\n\t@RequestMapping(\"\/loadTestData\")\n\tpublic String setup() {\n\t\tAccount maryZheng = TestData.createDummy(\"maryZheng\", \"Mary\", \"Zheng\");\n\t\tmaryZheng.addTransactions(TestData.createTransaction(\"KOHL\", \"Birthday gifts\", new BigDecimal(300)));\n\t\tmaryZheng.addTransactions(TestData.createTransaction(\"Macy\", \"Allen clothes\", new BigDecimal(100)));\n\t\tmaryZheng.addTransactions(TestData.createTransaction(\"Home Depot\", \"house items\", new BigDecimal(1000)));\n\t\tmaryZheng.addTransactions(TestData.createTransaction(\"Wal-mart\", \"small items\", new BigDecimal(60)));\n\t\tacctRep.save(maryZheng);\n\n\t\tAccount demo = TestData.createDummy(\"demo\", \"Demo\", \"JCG\");\n\t\tdemo.addTransactions(TestData.createTransaction(\"Shop&amp;Save\", \"food items\", new BigDecimal(60)));\n\t\tdemo.addTransactions(TestData.createTransaction(\"Webster\", \"school supplies\", new BigDecimal(260)));\n\t\tacctRep.save(demo);\n\n\t\treturn \"home\";\n\t}\n\n\t@RequestMapping(value = \"\/user\", method = RequestMethod.POST)\n\tpublic String user(@Validated User user, Model model) {\n\t\tSystem.out.println(\"User Page Requested\");\n\t\tmodel.addAttribute(\"userName\", user.getUserName());\n\n\t\tAccount foundUser = accountService.findByUsername(user.getUserName());\n\t\tif (foundUser != null) {\n\t\t\tmodel.addAttribute(\"account\", foundUser);\n\t\t\treturn \"user\";\n\t\t} else {\n\t\t\treturn \"invalidUser\";\n\t\t}\n\t}\n\n\t@ExceptionHandler(Exception.class)\n\tpublic String exceptionHandler(HttpServletRequest request, Exception ex, Model model) {\n\t\tmodel.addAttribute(\"content\", request.getRequestURL());\n\t\tmodel.addAttribute(\"error\", ex.getMessage());\n\t\treturn \"error\";\n\t}\n\n}<\/pre>\n<p><strong>Note<\/strong>: All methods return <code>String<\/code> instead of <code>ModelAndView<\/code>\u00a0for easier test. Spring\u00a0will wrap it as a <code>ModelAndView<\/code> object with the matching view name.<\/p>\n<h3><a name=\"heading_53\"><\/a>5.3 Model<\/h3>\n<p>Spring MVC framework provides the <code>Model<\/code> object to allow the controller class and UI view to pass the data between them. In this example, the <code>User<\/code> class contains the\u00a0<code>Account<\/code> object which includes a list of <code>RewardTransaction<\/code> objects.<\/p>\n<h4>5.3.1 User<\/h4>\n<p><code>User<\/code> class contains a user name and an account object.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>User.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring.model;\n\nimport jcg.zheng.demo.spring.entity.Account;\n\npublic class User {\n\n\tprivate String userName;\n\n\tprivate Account account;\n\n\tpublic Account getAccount() {\n\t\treturn account;\n\t}\n\n\tpublic void setAccount(Account account) {\n\t\tthis.account = account;\n\t}\n\n\tpublic String getUserName() {\n\t\treturn userName;\n\t}\n\n\tpublic void setUserName(String userName) {\n\t\tthis.userName = userName;\n\t}\n\n}\n<\/pre>\n<h4>5.3.2 Account<\/h4>\n<p><code>Account<\/code> class includes the first name, last name, and list of <code>RewardTransaction<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Account.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring.entity;\n\nimport java.math.BigDecimal;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport javax.persistence.CascadeType;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.FetchType;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.OneToMany;\nimport javax.persistence.Table;\n\n@Entity\n@Table(name = \"ACCOUNT\")\npublic class Account {\n\n\t@Id\n\t@GeneratedValue\n\t@Column(name = \"ID\")\n\tprivate Integer id;\n\t\n\t@Column(name = \"First_Name\")\n\tprivate String firstname;\n\t\n\t@Column(name = \"Last_Name\")\n\tprivate String lastname;\n\t\n\tprivate String username;\n\n\t@OneToMany(mappedBy=\"account\", cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = RewardTransaction.class)\n\tprivate List transactions = new ArrayList();\n\n\tpublic Integer getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Integer id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getFirstname() {\n\t\treturn firstname;\n\t}\n\n\tpublic void setFirstname(String firstname) {\n\t\tthis.firstname = firstname;\n\t}\n\n\tpublic String getLastname() {\n\t\treturn lastname;\n\t}\n\n\tpublic void setLastname(String lastname) {\n\t\tthis.lastname = lastname;\n\t}\n\n\tpublic BigDecimal getRewardPoint() {\n\t\treturn transactions.stream().map(RewardTransaction::getAmount)\n        .reduce(BigDecimal.ZERO, BigDecimal::add);  \n\t\t \n\t}\n\n\tpublic List getTransactions() {\n\t\treturn transactions;\n\t}\n\n\tpublic void addTransactions(RewardTransaction transaction) {\n\t\ttransaction.setAccount(this);\n\t\tthis.transactions.add(transaction);\n\t}\n\n\tpublic String getUsername() {\n\t\treturn username;\n\t}\n\n\tpublic void setUsername(String username) {\n\t\tthis.username = username;\n\t}\n\n}\n<\/pre>\n<h4>5.3.3 RewardTransaction<\/h4>\n<p><code>RewardTransaction<\/code> includes the transaction date, amount, description, and payee name.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>RewardTransaction.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring.entity;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.Id;\nimport javax.persistence.JoinColumn;\nimport javax.persistence.ManyToOne;\n\n@Entity\npublic class RewardTransaction {\n\n\t@Id\n\t@GeneratedValue\n\tprivate Long id;\n\tprivate Date createdDate;\n\tprivate BigDecimal amount;\n\tprivate String description;\n\tprivate String payeeName;\n\n\t@ManyToOne\n\t@JoinColumn(name = \"ACCOUNT_ID\")\n\tprivate Account account;\n\n\tpublic String getDescription() {\n\t\treturn description;\n\t}\n\n\tpublic void setDescription(String description) {\n\t\tthis.description = description;\n\t}\n\n\tpublic String getPayeeName() {\n\t\treturn payeeName;\n\t}\n\n\tpublic void setPayeeName(String payeeName) {\n\t\tthis.payeeName = payeeName;\n\t}\n\n\tpublic Date getCreatedDate() {\n\t\treturn createdDate;\n\t}\n\n\tpublic void setCreatedDate(Date createdDate) {\n\t\tthis.createdDate = createdDate;\n\t}\n\n\tpublic BigDecimal getAmount() {\n\t\treturn amount;\n\t}\n\n\tpublic void setAmount(BigDecimal amount) {\n\t\tthis.amount = amount;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic Account getAccount() {\n\t\treturn account;\n\t}\n\n\tpublic void setAccount(Account account) {\n\t\tthis.account = account;\n\t}\n\n}\n<\/pre>\n<h2><a name=\"heading_6\"><\/a>6. Spring Beans<\/h2>\n<p>In this step, I will create several Spring beans to manage the user&#8217;s reward account.<\/p>\n<h3><a name=\"heading_61\"><\/a>6.1 AccountRepository<\/h3>\n<p>In this step, I will create an <code>AccountRepository<\/code> interface\u00a0with the\u00a0<code>findByUserName<\/code> method and annotate it with Spring <code>@Repository<\/code> stereotype annotation.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>AccountRepository.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring.repository;\n\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.data.jpa.repository.Query;\nimport org.springframework.data.repository.query.Param;\nimport org.springframework.stereotype.Repository;\n\nimport jcg.zheng.demo.spring.entity.Account;\n\n@Repository\npublic interface AccountRepository extends JpaRepository&lt;Account, Integer&gt; {\n\t@Query(\"SELECT acct from Account acct WHERE acct.username = :username\")\n\tAccount findByUserName(@Param(\"username\") String userName);\n}\n<\/pre>\n<h3><a name=\"heading_62\"><\/a>6.2 AccountService<\/h3>\n<p><code>AccountService<\/code> interface defines the\u00a0<code>findByUserName<\/code> method.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>AccountService.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring.service;\n\nimport jcg.zheng.demo.spring.entity.Account;\n\npublic interface AccountService {\n\tAccount findByUsername(String username);\n\n}\n<\/pre>\n<h3><a name=\"heading_63\"><\/a>6.3\u00a0AccountServiceImpl<\/h3>\n<p><code>AccountServiceImpl<\/code> implements <code>AccountService<\/code>\u00a0interface and annotates it with <code>@Service<\/code> annotation. It depends the Spring <code>AccountRepository<\/code> bean and invokes its\u00a0<code>findByUserName<\/code>method.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>AccountServiceImpl.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring.service.impl;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport jcg.zheng.demo.spring.entity.Account;\nimport jcg.zheng.demo.spring.repository.AccountRepository;\nimport jcg.zheng.demo.spring.service.AccountService;\n\n@Service\npublic class AccountServiceImpl implements AccountService {\n\n\t@Autowired\n\tprivate AccountRepository acctDao;\n\n\t@Override\n\tpublic Account findByUsername(String username) {\n\t\treturn acctDao.findByUserName(username);\n\t}\n}\n<\/pre>\n<h3><a name=\"heading_64\"><\/a>6.4 Java Configuration<\/h3>\n<p>The generated\u00a0<code>SpringBootWebApplication <\/code>\u00a0is annotated with\u00a0<code>@SpringBootApplication<\/code>.\u00a0It is equivalent to use\u00a0\u00a0<code>@Configuration<\/code>,\u00a0<code>@EnableAutoConfiguration<\/code>,\u00a0and\u00a0<code>@ComponentScan<\/code>\u00a0with their default attributes.<\/p>\n<p>We will annotate it with\u00a0<code>@EnableJpaRepositories<\/code>. It enables Spring to scan the base package and all its sub-packages for any interfaces extending\u00a0<code>Repository<\/code>\u00a0or one of its sub-interfaces. For each interface found, Spring creates the appropriate bean to handle invocation of the query methods.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>SpringBootWebApplication.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.boot.web.support.SpringBootServletInitializer;\nimport org.springframework.data.jpa.repository.config.EnableJpaRepositories;\n\n@SpringBootApplication\n@EnableJpaRepositories(basePackages = \"jcg.zheng.demo.spring\")\npublic class SpringBootWebApplication extends SpringBootServletInitializer {\n\n\t@Override\n\tprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {\n\t\treturn application.sources(SpringBootWebApplication.class);\n\t}\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tSpringApplication.run(SpringBootWebApplication.class, args);\n\t}\n\n}<\/pre>\n<h2><a name=\"heading_7\"><\/a>7. Junit Tests<\/h2>\n<h3><a name=\"heading_71\"><\/a>7.1 AccountTest<\/h3>\n<p>we will test the <code>Account<\/code> class&#8217; <code>getRewardPoint<\/code> method which is used in the <code>user<\/code> view.[ulp id=&#8217;7POIYxRf1FUtPpmL&#8217;]<\/p>\n<p><span style=\"text-decoration: underline;\"><em>AccountTest.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring.entity;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.math.BigDecimal;\n\nimport org.junit.Test;\n\nimport jcg.zheng.demo.spring.util.TestData;\n\npublic class AccountTest {\n\n\t@Test\n\tpublic void test_Account_getRewardPoint() {\n\t\tAccount acct = TestData.createDummy(\"test\", \"firstNm\", \"lastNm\");\n\t\tacct.addTransactions(TestData.createTransaction(\"payee\", \"desp\", new BigDecimal(10)));\n\t\tacct.addTransactions(TestData.createTransaction(\"payee2\", \"desp2\", new BigDecimal(15)));\n\t\t\n\t\tassertEquals(25, acct.getRewardPoint().intValue());\n\t}\n\n}\n<\/pre>\n<h3><a name=\"heading_72\"><\/a>7.2 AccountServiceImplTest<\/h3>\n<p>We will test <code>AccountServiceImp<\/code> to make sure <code>findByUserName<\/code> works as expected.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>AccountServiceImplTest.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring.service.impl;\n\nimport static org.junit.Assert.assertEquals;\nimport static org.junit.Assert.assertNotNull;\nimport static org.junit.Assert.assertNull;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n\nimport jcg.zheng.demo.spring.TestConfig;\nimport jcg.zheng.demo.spring.entity.Account;\nimport jcg.zheng.demo.spring.repository.AccountRepository;\nimport jcg.zheng.demo.spring.service.AccountService;\nimport jcg.zheng.demo.spring.util.TestData;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(classes = { TestConfig.class })\npublic class AccountServiceImplTest {\n\n\t@Autowired\n\tprivate AccountService classToTest;\n\t\n\t@Autowired\n\tprivate AccountRepository acctRepo;\n\n\t@Test\n\tpublic void findByUsername_not_found() {\n\t\tAccount foundAcct = classToTest.findByUsername(\"testUser\");\n\t\tassertNull(foundAcct);\n\t}\n\n\t@Test\n\tpublic void findByUsername_found() {\n\t\t\n\t\tacctRepo.save(TestData.createDummy(\"MaryZheng\", \"Mary\", \"Zheng\"));\n\t\tAccount foundAcct = classToTest.findByUsername(\"MaryZheng\");\n\t\tassertNotNull(foundAcct);\n\t\tassertEquals(1, foundAcct.getId().intValue());\n\t}\n}\n<\/pre>\n<h3><a name=\"heading_73\"><\/a>7.3 WelcomeControllerTest<\/h3>\n<p>We will test the <code>WelcomeController<\/code>.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>WelcomeControllerTest.java<\/em><\/span><\/p>\n<pre class=\"brush:java;wrap-lines:false\">package jcg.zheng.demo.spring;\n\nimport static org.junit.Assert.assertEquals;\n\nimport java.util.HashMap;\nimport java.util.Locale;\nimport java.util.Map;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.test.context.ContextConfiguration;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport org.springframework.ui.Model;\nimport org.springframework.validation.support.BindingAwareModelMap;\n\nimport jcg.zheng.demo.spring.model.User;\nimport jcg.zheng.demo.spring.service.AccountService;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@ContextConfiguration(classes = { TestConfig.class })\npublic class WelcomeControllerTest {\n\t\n\t@Autowired\n\tprivate WelcomeController welController;\n\t\n\t@Autowired\n\tprivate AccountService accountService;\n\n\t@Test\n\tpublic void welcome_view() {\t\t\n\t\tMap model= new HashMap();\n\t\tLocale locale = new Locale.Builder().setLanguage(\"en\").setRegion(\"MO\").build();\n\t\tString viewName = welController.welcome(locale, model);\n\t\tassertEquals(\"home\", viewName);\n\t}\n\t\n\t@Test\n\tpublic void invalidUser_view() {\t\t\t\t\n\t\t\n\t\tUser user = new User();\n\t\tuser.setUserName(\"not exist\");\n\t\tModel model = new BindingAwareModelMap();\n\t\tString viewName = welController.user(user , model );\n\t\tassertEquals(\"invalidUser\", viewName);\n\t}\n\t\n}\n<\/pre>\n<h2><a name=\"heading_8\"><\/a>8. Demo<\/h2>\n<p>Now, we completed the web application. Here is the project structure.<\/p>\n<p><figure id=\"attachment_58112\" aria-describedby=\"caption-attachment-58112\" style=\"width: 453px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-project.jpg\"><img decoding=\"async\" class=\"wp-image-58112 size-full\" src=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-project.jpg\" alt=\"Spring with Maven - Project Structure\" width=\"453\" height=\"645\" srcset=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-project.jpg 453w, https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-project-211x300.jpg 211w\" sizes=\"(max-width: 453px) 100vw, 453px\" \/><\/a><figcaption id=\"caption-attachment-58112\" class=\"wp-caption-text\">Figure 0 Project Structure<\/figcaption><\/figure><\/p>\n<p>We will demonstrate the web application to show it meets the business requirements.<\/p>\n<h3><a name=\"heading_81\"><\/a>8.1 Start the Web Application<\/h3>\n<p>First, start the web application with command <code>java -jar target\\spring-boot-web-jsp-demo-0.0.1-SNAPSHOT.jar<\/code>.<\/p>\n<p>Confirmed the web application is up and running by viewing the server output.<\/p>\n<p><span style=\"text-decoration: underline;\"><em>Server output<\/em><\/span><\/p>\n<pre class=\"brush:bash;wrap-lines:false\">C:\\gitworkspace\\spring-boot-web-jsp-demo&gt;java -jar target\\spring-boot-web-jsp-demo-0.0.1-SNAPSHOT.jar\n\n  .   ____          _            __ _ _\n \/\\\\ \/ ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\\n( ( )\\___ | '_ | '_| | '_ \\\/ _` | \\ \\ \\ \\\n \\\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )\n  '  |____| .__|_| |_|_| |_\\__, | \/ \/ \/ \/\n =========|_|==============|___\/=\/_\/_\/_\/\n :: Spring Boot ::       (v1.5.14.RELEASE)\n\n2018-06-29 15:22:43.448  INFO 19076 --- [           main] j.z.d.spring.SpringBootWebApplication    : Starting SpringBootWebApplication v0.0.1-SNAPSHOT on SL2LS431841 with PID 19076 (C:\\gitworkspace\\spring-boot-web-jsp-demo\\target\\spring-boot-web-jsp-demo-0.0.1-SNAPSHOT.jar started by shu.shan in C:\\gitworkspace\\spring-boot-web-jsp-demo)\n2018-06-29 15:22:43.448  INFO 19076 --- [           main] j.z.d.spring.SpringBootWebApplication    : No active profile set, falling back to default profiles: default\n2018-06-29 15:22:43.698  INFO 19076 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1698c449: startup date [Fri Jun 29 15:22:43 CDT 2018]; root of context hierarchy\n2018-06-29 15:22:46.142  INFO 19076 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$EnhancerBySpringCGLIB$5edb6f43] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)\n2018-06-29 15:22:47.282  INFO 19076 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)\n2018-06-29 15:22:47.345  INFO 19076 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]\n2018-06-29 15:22:47.345  INFO 19076 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat\/8.5.31\n2018-06-29 15:22:48.585  INFO 19076 --- [ost-startStop-1] org.apache.jasper.servlet.TldScanner     : 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.\n2018-06-29 15:22:48.960  INFO 19076 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[\/]       : Initializing Spring embedded WebApplicationContext\n2018-06-29 15:22:48.960  INFO 19076 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 5262 ms\n2018-06-29 15:22:49.256  INFO 19076 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [\/]\n2018-06-29 15:22:49.272  INFO 19076 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [\/*]\n2018-06-29 15:22:49.272  INFO 19076 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [\/*]\n2018-06-29 15:22:49.272  INFO 19076 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [\/*]\n2018-06-29 15:22:49.272  INFO 19076 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [\/*]\n2018-06-29 15:22:49.397  INFO 19076 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        : Starting embedded database: url='jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'\n2018-06-29 15:22:50.054  INFO 19076 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'\n2018-06-29 15:22:50.085  INFO 19076 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [        name: default        ...]\n2018-06-29 15:22:50.319  INFO 19076 --- [           main] org.hibernate.Version                   : HHH000412: Hibernate Core {5.0.12.Final}\n2018-06-29 15:22:50.319  INFO 19076 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found\n2018-06-29 15:22:50.335  INFO 19076 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist\n2018-06-29 15:22:50.475  INFO 19076 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}\n2018-06-29 15:22:51.159  INFO 19076 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect\n2018-06-29 15:22:52.874  INFO 19076 --- [           main] org.hibernate.tool.hbm2ddl.SchemaUpdate  : HHH000228: Running hbm2ddl schema update\n2018-06-29 15:22:52.921  INFO 19076 --- [           main] rmationExtractorJdbcDatabaseMetaDataImpl : HHH000262: Table not found: ACCOUNT\n2018-06-29 15:22:52.937  INFO 19076 --- [           main] rmationExtractorJdbcDatabaseMetaDataImpl : HHH000262: Table not found: ACCOUNT\n2018-06-29 15:22:52.952  INFO 19076 --- [           main] rmationExtractorJdbcDatabaseMetaDataImpl : HHH000262: Table not found: RewardTransaction\n2018-06-29 15:22:52.952  INFO 19076 --- [           main] rmationExtractorJdbcDatabaseMetaDataImpl : HHH000262: Table not found: RewardTransaction\n2018-06-29 15:22:53.140  INFO 19076 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'\n2018-06-29 15:22:53.693  INFO 19076 --- [           main] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory\n2018-06-29 15:22:54.609  INFO 19076 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@1698c449: startup date [Fri Jun 29 15:22:43 CDT 2018]; root of context hierarchy\n2018-06-29 15:22:54.875  INFO 19076 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped \"{[\/loadTestData]}\" onto public java.lang.String jcg.zheng.demo.spring.WelcomeController.setup()\n2018-06-29 15:22:54.875  INFO 19076 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped \"{[\/user],methods=[POST]}\" onto public java.lang.String jcg.zheng.demo.spring.WelcomeController.user(jcg.zheng.demo.spring.model.User,org.springframework.ui.Model)\n2018-06-29 15:22:54.875  INFO 19076 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped \"{[\/]}\" onto public java.lang.String jcg.zheng.demo.spring.WelcomeController.welcome(java.util.Locale,java.util.Map)\n2018-06-29 15:22:54.875  INFO 19076 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped \"{[\/error]}\" onto public org.springframework.http.ResponseEntity&lt;java.util.Map&gt; org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)\n2018-06-29 15:22:54.875  INFO 19076 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped \"{[\/error],produces=}\" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)\n2018-06-29 15:22:55.015  INFO 19076 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [\/**\/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]\n2018-06-29 15:22:55.389  INFO 19076 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup\n2018-06-29 15:22:55.514  INFO 19076 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)\n2018-06-29 15:22:55.514  INFO 19076 --- [           main] j.z.d.spring.SpringBootWebApplication    : Started SpringBootWebApplication in 12.926 seconds (JVM running for 13.906)\n\n<\/pre>\n<h3><a name=\"heading_82\"><\/a>8.2 Home View<\/h3>\n<p>Go to <code>http:\/\/localhost:8080\/<\/code>, which displays the landing page.<\/p>\n<p><figure id=\"attachment_58108\" aria-describedby=\"caption-attachment-58108\" style=\"width: 694px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-login.jpg\"><img decoding=\"async\" class=\"wp-image-58108 size-full\" src=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-login.jpg\" alt=\"Spring with Maven - Welcome Page\" width=\"694\" height=\"306\" srcset=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-login.jpg 694w, https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-login-300x132.jpg 300w\" sizes=\"(max-width: 694px) 100vw, 694px\" \/><\/a><figcaption id=\"caption-attachment-58108\" class=\"wp-caption-text\">Figure 1 Welcome Page<\/figcaption><\/figure><\/p>\n<h3><a name=\"heading_83\"><\/a>8.3 Invalid User View<\/h3>\n<p>Enter <code>maryZheng<\/code> and click the <code>login<\/code> button.<\/p>\n<p>It displays the invalid user page.<\/p>\n<p><figure id=\"attachment_58109\" aria-describedby=\"caption-attachment-58109\" style=\"width: 454px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-invalid.jpg\"><img decoding=\"async\" class=\"wp-image-58109 size-full\" src=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-invalid.jpg\" alt=\"Spring with Maven - Invalid User\" width=\"454\" height=\"192\" srcset=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-invalid.jpg 454w, https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-invalid-300x127.jpg 300w\" sizes=\"(max-width: 454px) 100vw, 454px\" \/><\/a><figcaption id=\"caption-attachment-58109\" class=\"wp-caption-text\">Figure 2 Invalid User<\/figcaption><\/figure><\/p>\n<h3><a name=\"heading_84\"><\/a>8.4 User View<\/h3>\n<p>Go to <code>http:\/\/localhost:8080\/loadTestData<\/code>.<\/p>\n<p>Go to <code>http:\/\/localhost:8080\/<\/code> and enter <code>maryZheng<\/code> and click the <code>login<\/code> button.<\/p>\n<p>It displays the Mary Zheng&#8217;s account.<\/p>\n<p><figure id=\"attachment_58110\" aria-describedby=\"caption-attachment-58110\" style=\"width: 464px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-user.jpg\"><img decoding=\"async\" class=\"wp-image-58110 size-full\" src=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-user.jpg\" alt=\"Spring with Maven - User Page\" width=\"464\" height=\"357\" srcset=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-user.jpg 464w, https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-user-300x231.jpg 300w\" sizes=\"(max-width: 464px) 100vw, 464px\" \/><\/a><figcaption id=\"caption-attachment-58110\" class=\"wp-caption-text\">Figure 3 User Page<\/figcaption><\/figure><\/p>\n<h3><a name=\"heading_85\"><\/a>8.5 Error View<\/h3>\n<p>Go to <code>http:\/\/localhost:8080\/loadTestData<\/code>, it will load the same data again.<\/p>\n<p>Go to <code>http:\/\/localhost:8080\/<\/code> and enter <code>maryZheng<\/code> and click the <code>login<\/code> button.<\/p>\n<p>It displays the exception page.<\/p>\n<p><figure id=\"attachment_58111\" aria-describedby=\"caption-attachment-58111\" style=\"width: 568px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-error.jpg\"><img decoding=\"async\" class=\"wp-image-58111 size-full\" src=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-error.jpg\" alt=\"Spring with Maven - Error Page\" width=\"568\" height=\"253\" srcset=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-error.jpg 568w, https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-error-300x134.jpg 300w\" sizes=\"(max-width: 568px) 100vw, 568px\" \/><\/a><figcaption id=\"caption-attachment-58111\" class=\"wp-caption-text\">Figure 4 Error Page<\/figcaption><\/figure><\/p>\n<h2><a name=\"heading_9\"><\/a>9. Summary<\/h2>\n<p>In this example, we created a Spring MVC web application utilizing the Spring boot, Spring JPA, and Spring MVC framework in a few short steps.<\/p>\n<ol>\n<li>Generate the Spring boot MVC project via the starter tool<\/li>\n<li>Add <code>Account<\/code> and <code>User<\/code> model classes<\/li>\n<li>Add the JSP view pages<\/li>\n<li>Create a\u00a0<code>Controller<\/code> for the views<\/li>\n<li>Create Spring <code>AccountService<\/code> and <code>AccountRepository<\/code> beans to manage the account<\/li>\n<\/ol>\n<h2><a name=\"heading_10\"><\/a>10. References<\/h2>\n<ul>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/7175509\/which-is-better-return-modelandview-or-string-on-spring3-controller\" target=\"_blank\" rel=\"noopener\">https:\/\/stackoverflow.com\/questions\/7175509\/which-is-better-return-modelandview-or-string-on-spring3-controller<\/a><\/li>\n<li><a href=\"http:\/\/www.mkyong.com\/spring-boot\/spring-boot-hello-world-example-jsp\/\" target=\"_blank\" rel=\"noopener\">http:\/\/www.mkyong.com\/spring-boot\/spring-boot-hello-world-example-jsp\/<\/a><\/li>\n<li><a href=\"https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/common-application-properties.html\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/common-application-properties.html<\/a><\/li>\n<li><a href=\"https:\/\/www.logicbig.com\/tutorials\/spring-framework\/spring-boot\/boot-serve-static.html\" target=\"_blank\" rel=\"noopener\">https:\/\/www.logicbig.com\/tutorials\/spring-framework\/spring-boot\/boot-serve-static.html<\/a><\/li>\n<li><a href=\"http:\/\/www.springboottutorial.com\/spring-boot-and-h2-in-memory-database\" target=\"_blank\" rel=\"noopener\">http:\/\/www.springboottutorial.com\/spring-boot-and-h2-in-memory-database<\/a><\/li>\n<li><a href=\"https:\/\/www.journaldev.com\/14476\/spring-mvc-example\" target=\"_blank\" rel=\"noopener\">https:\/\/www.journaldev.com\/14476\/spring-mvc-example<\/a><\/li>\n<\/ul>\n<h2><a name=\"heading_11\"><\/a>11. Download the Source Code<\/h2>\n<p>This example consists of a Spring MVC Web application as a Maven project.<\/p>\n<div class=\"download\"><strong>Download<\/strong><br \/>\nYou can download the full source code of the Spring with Maven Tutorial: <a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2018\/07\/spring-boot-web-jsp-demo.zip\"><strong>Spring with Maven Tutorial<\/strong><\/a><\/div>\n<div><\/div>\n<div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this post, we feature a comprehensive Tutorial on Spring with Maven. Spring Framework is a Java application framework that provides many useful services for building applications. Apache Maven is a software project management and comprehension tool. In this article, I will demonstrate how to build a web application utilizing Spring MVC framework as a &hellip;<\/p>\n","protected":false},"author":140,"featured_media":1248,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[52],"tags":[477],"class_list":["post-58020","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-spring","tag-apache-maven"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spring with Maven Tutorial - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn more about Spring? Then check out our detailed tutorial on Spring with Maven! You can also download our FREE Spring Framework Cookbook!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring with Maven Tutorial - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn more about Spring? Then check out our detailed tutorial on Spring with Maven! You can also download our FREE Spring Framework Cookbook!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/\" \/>\n<meta property=\"og:site_name\" content=\"Examples Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-04T12:00:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-07-13T09:50:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/spring-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Mary Zheng\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mary Zheng\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/\"},\"author\":{\"name\":\"Mary Zheng\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae\"},\"headline\":\"Spring with Maven Tutorial\",\"datePublished\":\"2018-07-04T12:00:30+00:00\",\"dateModified\":\"2022-07-13T09:50:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/\"},\"wordCount\":1275,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/spring-logo.jpg\",\"keywords\":[\"Apache Maven\"],\"articleSection\":[\"spring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/\",\"name\":\"Spring with Maven Tutorial - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/spring-logo.jpg\",\"datePublished\":\"2018-07-04T12:00:30+00:00\",\"dateModified\":\"2022-07-13T09:50:10+00:00\",\"description\":\"Interested to learn more about Spring? Then check out our detailed tutorial on Spring with Maven! You can also download our FREE Spring Framework Cookbook!\",\"breadcrumb\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#primaryimage\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/spring-logo.jpg\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/spring-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/examples.javacodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java Development\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/java-development\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/java-development\/enterprise-java\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"spring\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/java-development\/enterprise-java\/spring\/\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"Spring with Maven Tutorial\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#website\",\"url\":\"https:\/\/examples.javacodegeeks.com\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Examples and Code Snippets\",\"publisher\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/examples.javacodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/examples.javacodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/javacodegeeks\",\"https:\/\/x.com\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae\",\"name\":\"Mary Zheng\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg\",\"caption\":\"Mary Zheng\"},\"description\":\"Mary has graduated from Mechanical Engineering department at ShangHai JiaoTong University. She also holds a Master degree in Computer Science from Webster University. During her studies she has been involved with a large number of projects ranging from programming and software engineering. She works as a senior Software Engineer in the telecommunications sector where she acts as a leader and works with others to design, implement, and monitor the software solution.\",\"url\":\"https:\/\/examples.javacodegeeks.com\/author\/mary-zheng\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Spring with Maven Tutorial - Java Code Geeks","description":"Interested to learn more about Spring? Then check out our detailed tutorial on Spring with Maven! You can also download our FREE Spring Framework Cookbook!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/","og_locale":"en_US","og_type":"article","og_title":"Spring with Maven Tutorial - Java Code Geeks","og_description":"Interested to learn more about Spring? Then check out our detailed tutorial on Spring with Maven! You can also download our FREE Spring Framework Cookbook!","og_url":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/","og_site_name":"Examples Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2018-07-04T12:00:30+00:00","article_modified_time":"2022-07-13T09:50:10+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/spring-logo.jpg","type":"image\/jpeg"}],"author":"Mary Zheng","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Mary Zheng","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#article","isPartOf":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/"},"author":{"name":"Mary Zheng","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae"},"headline":"Spring with Maven Tutorial","datePublished":"2018-07-04T12:00:30+00:00","dateModified":"2022-07-13T09:50:10+00:00","mainEntityOfPage":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/"},"wordCount":1275,"commentCount":0,"publisher":{"@id":"https:\/\/examples.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/spring-logo.jpg","keywords":["Apache Maven"],"articleSection":["spring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/","url":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/","name":"Spring with Maven Tutorial - Java Code Geeks","isPartOf":{"@id":"https:\/\/examples.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#primaryimage"},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/spring-logo.jpg","datePublished":"2018-07-04T12:00:30+00:00","dateModified":"2022-07-13T09:50:10+00:00","description":"Interested to learn more about Spring? Then check out our detailed tutorial on Spring with Maven! You can also download our FREE Spring Framework Cookbook!","breadcrumb":{"@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#primaryimage","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/spring-logo.jpg","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2012\/12\/spring-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/examples.javacodegeeks.com\/java-development\/enterprise-java\/spring\/spring-maven-tutorial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/examples.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java Development","item":"https:\/\/examples.javacodegeeks.com\/category\/java-development\/"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/examples.javacodegeeks.com\/category\/java-development\/enterprise-java\/"},{"@type":"ListItem","position":4,"name":"spring","item":"https:\/\/examples.javacodegeeks.com\/category\/java-development\/enterprise-java\/spring\/"},{"@type":"ListItem","position":5,"name":"Spring with Maven Tutorial"}]},{"@type":"WebSite","@id":"https:\/\/examples.javacodegeeks.com\/#website","url":"https:\/\/examples.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Examples and Code Snippets","publisher":{"@id":"https:\/\/examples.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/examples.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/examples.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/examples.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/8a2034fbabcb20a9396e9819261855ae","name":"Mary Zheng","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2017\/11\/Mary-Zheng_avatar_1510732235-96x96.jpg","caption":"Mary Zheng"},"description":"Mary has graduated from Mechanical Engineering department at ShangHai JiaoTong University. She also holds a Master degree in Computer Science from Webster University. During her studies she has been involved with a large number of projects ranging from programming and software engineering. She works as a senior Software Engineer in the telecommunications sector where she acts as a leader and works with others to design, implement, and monitor the software solution.","url":"https:\/\/examples.javacodegeeks.com\/author\/mary-zheng\/"}]}},"_links":{"self":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/58020","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/users\/140"}],"replies":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=58020"}],"version-history":[{"count":0,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/58020\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/media\/1248"}],"wp:attachment":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=58020"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=58020"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=58020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}