diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml
index 098afffba4..7361d16b33 100644
--- a/spring-mvc-java/pom.xml
+++ b/spring-mvc-java/pom.xml
@@ -250,7 +250,7 @@
1.7.21
1.1.5
-
+
5.2.2.Final
@@ -263,6 +263,7 @@
4.4.1
4.5
2.9.0
+ 2.23
3.5.1
2.6
@@ -274,4 +275,5 @@
1.8.7
-
\ No newline at end of file
+
+
diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/MessageController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/MessageController.java
new file mode 100644
index 0000000000..cfc73aeabe
--- /dev/null
+++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/MessageController.java
@@ -0,0 +1,24 @@
+package com.baeldung.web.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+@RequestMapping("/message")
+public class MessageController {
+
+ @RequestMapping(value = "/showForm", method = RequestMethod.GET)
+ public String showForm() {
+ return "message";
+ }
+
+ @RequestMapping(value = "/processForm", method = RequestMethod.POST)
+ public String processForm(@RequestParam("message") final String message, final Model model) {
+ model.addAttribute("message", message);
+ return "message";
+ }
+
+}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java
new file mode 100644
index 0000000000..58e5f9829b
--- /dev/null
+++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndJUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.htmlunit;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+
+public class HtmlUnitAndJUnitTest {
+
+ @Test
+ public void givenAClient_whenEnteringBaeldung_thenPageTitleIsCorrect() throws Exception {
+ try (final WebClient webClient = new WebClient()) {
+
+ webClient.getOptions().setThrowExceptionOnScriptError(false);
+
+ final HtmlPage page = webClient.getPage("http://www.baeldung.com/");
+ Assert.assertEquals("Baeldung | Java, Spring and Web Development tutorials", page.getTitleText());
+ }
+ }
+
+}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java
new file mode 100644
index 0000000000..dcc7555ae2
--- /dev/null
+++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitAndSpringTest.java
@@ -0,0 +1,79 @@
+package com.baeldung.htmlunit;
+
+import java.io.IOException;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.htmlunit.MockMvcWebClientBuilder;
+import org.springframework.web.context.WebApplicationContext;
+
+import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(classes = { TestConfig.class })
+public class HtmlUnitAndSpringTest {
+
+ @Autowired
+ private WebApplicationContext wac;
+
+ private WebClient webClient;
+
+ @Before
+ public void setup() {
+ webClient = MockMvcWebClientBuilder.webAppContextSetup(wac).build();
+ }
+
+ @Test
+ @Ignore
+ public void givenAMessage_whenSent_thenItShows() {
+ final String text = "Hello world!";
+ HtmlPage page;
+
+ try {
+
+ page = webClient.getPage("http://localhost/message/showForm");
+ System.out.println(page.asXml());
+
+ final HtmlTextInput messageText = page.getHtmlElementById("message");
+ messageText.setValueAttribute(text);
+
+ final HtmlForm form = page.getForms().get(0);
+ final HtmlSubmitInput submit = form.getOneHtmlElementByAttribute("input", "type", "submit");
+ final HtmlPage newPage = submit.click();
+
+ final String receivedText = newPage.getHtmlElementById("received").getTextContent();
+
+ Assert.assertEquals(receivedText, text);
+ System.out.println(newPage.asXml());
+
+ } catch (FailingHttpStatusCodeException | IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ @Test
+ public void givenAClient_whenEnteringBaeldung_thenPageTitleIsCorrect() throws Exception {
+ try (final WebClient client = new WebClient()) {
+
+ webClient.getOptions().setThrowExceptionOnScriptError(false);
+
+ final HtmlPage page = webClient.getPage("http://www.baeldung.com/");
+ Assert.assertEquals("Baeldung | Java, Spring and Web Development tutorials", page.getTitleText());
+ }
+ }
+
+}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java
new file mode 100644
index 0000000000..16d18717e6
--- /dev/null
+++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/HtmlUnitWebScraping.java
@@ -0,0 +1,40 @@
+package com.baeldung.htmlunit;
+
+import java.util.List;
+
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
+import com.gargoylesoftware.htmlunit.html.HtmlHeading1;
+import com.gargoylesoftware.htmlunit.html.HtmlHeading2;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+
+public class HtmlUnitWebScraping {
+
+ public static void main(final String[] args) throws Exception {
+ try (final WebClient webClient = new WebClient()) {
+
+ webClient.getOptions().setCssEnabled(false);
+ webClient.getOptions().setJavaScriptEnabled(false);
+
+ final HtmlPage page = webClient.getPage("http://www.baeldung.com/full_archive");
+ final HtmlAnchor latestPostLink = (HtmlAnchor) page.getByXPath("(//ul[@class='car-monthlisting']/li)[1]/a").get(0);
+
+ System.out.println("Entering: " + latestPostLink.getHrefAttribute());
+
+ final HtmlPage postPage = latestPostLink.click();
+
+ final HtmlHeading1 heading1 = (HtmlHeading1) postPage.getByXPath("//h1").get(0);
+ System.out.println("Title: " + heading1.getTextContent());
+
+ final List headings2 = (List) postPage.getByXPath("//h2");
+
+ final StringBuilder sb = new StringBuilder(heading1.getTextContent());
+ for (final HtmlHeading2 h2 : headings2) {
+ sb.append("\n").append(h2.getTextContent());
+ }
+
+ System.out.println(sb.toString());
+ }
+ }
+
+}
diff --git a/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java
new file mode 100644
index 0000000000..1357310b1f
--- /dev/null
+++ b/spring-mvc-java/src/test/java/com/baeldung/htmlunit/TestConfig.java
@@ -0,0 +1,42 @@
+package com.baeldung.htmlunit;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.ViewResolver;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.thymeleaf.spring4.SpringTemplateEngine;
+import org.thymeleaf.spring4.view.ThymeleafViewResolver;
+import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
+
+@Configuration
+@EnableWebMvc
+@ComponentScan(basePackages = { "com.baeldung.web.controller" })
+public class TestConfig extends WebMvcConfigurerAdapter {
+
+ @Bean
+ public ViewResolver thymeleafViewResolver() {
+ final ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
+ viewResolver.setTemplateEngine(templateEngine());
+ viewResolver.setOrder(1);
+ return viewResolver;
+ }
+
+ @Bean
+ public ServletContextTemplateResolver templateResolver() {
+ final ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
+ templateResolver.setPrefix("/WEB-INF/templates/");
+ templateResolver.setSuffix(".html");
+ templateResolver.setTemplateMode("HTML5");
+ return templateResolver;
+ }
+
+ @Bean
+ public SpringTemplateEngine templateEngine() {
+ final SpringTemplateEngine templateEngine = new SpringTemplateEngine();
+ templateEngine.setTemplateResolver(templateResolver());
+ return templateEngine;
+ }
+
+}