diff --git a/rxjava/src/test/java/com/baeldung/rxjava/filters/RxJavaFilterOperatorsTest.java b/rxjava/src/test/java/com/baeldung/rxjava/filters/RxJavaFilterOperatorsTest.java new file mode 100644 index 0000000000..be0f390b67 --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/filters/RxJavaFilterOperatorsTest.java @@ -0,0 +1,202 @@ +package com.baeldung.rxjava.filters; + +import org.junit.Test; + +import rx.Observable; +import rx.observers.TestSubscriber; + +public class RxJavaFilterOperatorsTest { + + @Test + public void givenRangeObservable_whenFilteringItems_thenOddItemsAreFiltered() { + + Observable sourceObservable = Observable.range(1, 10); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.filter(i -> i % 2 != 0); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(5); + subscriber.assertValues(1, 3, 5, 7, 9); + } + + @Test + public void givenRangeObservable_whenFilteringWithTake_thenOnlyFirstThreeItemsAreEmitted() { + + Observable sourceObservable = Observable.range(1, 10); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.take(3); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(3); + subscriber.assertValues(1, 2, 3); + } + + @Test + public void givenObservable_whenFilteringWithTakeWhile_thenItemsEmittedUntilConditionIsVerified() { + + Observable sourceObservable = Observable.just(1, 2, 3, 4, 3, 2, 1); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.takeWhile(i -> i < 4); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(3); + subscriber.assertValues(1, 2, 3); + } + + @Test + public void givenRangeObservable_whenFilteringWithTakeFirst_thenOnlyFirstItemIsEmitted() { + + Observable sourceObservable = Observable.just(1, 2, 3, 4, 5, 7, 6); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.takeFirst(x -> x > 5); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValue(7); + } + + @Test + public void givenRangeObservable_whenFilteringWithFirst_thenOnlyFirstThreeItemsAreEmitted() { + + Observable sourceObservable = Observable.range(1, 10); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.first(); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValue(1); + } + + @Test + public void givenEmptyObservable_whenFilteringWithFirstOrDefault_thenDefaultValue() { + + Observable sourceObservable = Observable.empty(); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.firstOrDefault(-1); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValue(-1); + } + + @Test + public void givenRangeObservable_whenFilteringWithTakeLast_thenLastThreeItemAreEmitted() { + + Observable sourceObservable = Observable.range(1, 10); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.takeLast(3); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(3); + subscriber.assertValues(8, 9, 10); + } + + @Test + public void givenRangeObservable_whenFilteringWithLast_thenOnlyLastItemIsEmitted() { + + Observable sourceObservable = Observable.range(1, 10); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.last(i -> i % 2 != 0); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValue(9); + } + + @Test + public void givenRangeObservable_whenFilteringWithLastAndDefault_thenOnlyDefaultIsEmitted() { + + Observable sourceObservable = Observable.range(1, 10); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.lastOrDefault(-1, i -> i > 10); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValue(-1); + } + + @Test + public void givenObservable_whenTakingElementAt_thenItemAtSpecifiedIndexIsEmitted() { + + Observable sourceObservable = Observable.just(1, 2, 3, 5, 7, 11); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.elementAt(4); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValue(7); + } + + @Test + public void givenObservable_whenTakingElementAtOrDefault_thenDefaultIsReturned() { + + Observable sourceObservable = Observable.just(1, 2, 3, 5, 7, 11); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.elementAtOrDefault(7, -1); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(1); + subscriber.assertValue(-1); + } + + @Test + public void givenMixedTypeObservable_whenFilteringByType_thenOnlyNumbersAreEmitted() { + + Observable sourceObservable = Observable.just(1, "two", 3, "five", 7, 11); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.ofType(String.class); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(2); + subscriber.assertValues("two", "five"); + + } +} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/filters/RxJavaSkipOperatorsTest.java b/rxjava/src/test/java/com/baeldung/rxjava/filters/RxJavaSkipOperatorsTest.java new file mode 100644 index 0000000000..eca39b17bf --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/filters/RxJavaSkipOperatorsTest.java @@ -0,0 +1,105 @@ +package com.baeldung.rxjava.filters; + +import org.junit.Test; + +import rx.Observable; +import rx.observers.TestSubscriber; + +public class RxJavaSkipOperatorsTest { + + @Test + public void givenRangeObservable_whenSkipping_thenFirstFourItemsAreSkipped() { + + Observable sourceObservable = Observable.range(1, 10); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.skip(4); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(6); + subscriber.assertValues(5, 6, 7, 8, 9, 10); + } + + @Test + public void givenObservable_whenSkippingWhile_thenFirstItemsAreSkipped() { + + Observable sourceObservable = Observable.just(1, 2, 3, 4, 5, 4, 3, 2, 1); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.skipWhile(i -> i < 4); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(6); + subscriber.assertValues(4, 5, 4, 3, 2, 1); + } + + @Test + public void givenRangeObservable_whenSkippingLast_thenLastFiveItemsAreSkipped() { + + Observable sourceObservable = Observable.range(1, 10); + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = sourceObservable.skipLast(5); + + filteredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(5); + subscriber.assertValues(1, 2, 3, 4, 5); + } + + @Test + public void givenObservable_whenFilteringDistinct_thenOnlyDistinctValuesAreEmitted() { + + Observable sourceObservable = Observable.just(1, 1, 2, 2, 1, 3, 3, 1); + TestSubscriber subscriber = new TestSubscriber(); + + Observable distinctObservable = sourceObservable.distinct(); + + distinctObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(3); + subscriber.assertValues(1, 2, 3); + } + + @Test + public void givenObservable_whenFilteringDistinctUntilChanged_thenOnlyDistinctConsecutiveItemsAreEmitted() { + + Observable sourceObservable = Observable.just(1, 1, 2, 2, 1, 3, 3, 1); + TestSubscriber subscriber = new TestSubscriber(); + + Observable distinctObservable = sourceObservable.distinctUntilChanged(); + + distinctObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(5); + subscriber.assertValues(1, 2, 1, 3, 1); + } + + @Test + public void givenRangeObservable_whenIgnoringElements_thenOnlyDistinctConsecutiveItemsAreEmitted() { + + Observable sourceObservable = Observable.range(1, 10); + TestSubscriber subscriber = new TestSubscriber(); + + Observable ignoredObservable = sourceObservable.ignoreElements(); + + ignoredObservable.subscribe(subscriber); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValueCount(0); + subscriber.assertNoValues(); + } +} diff --git a/rxjava/src/test/java/com/baeldung/rxjava/filters/RxJavaTimeFilteringOperatorsTest.java b/rxjava/src/test/java/com/baeldung/rxjava/filters/RxJavaTimeFilteringOperatorsTest.java new file mode 100644 index 0000000000..63076cbc4a --- /dev/null +++ b/rxjava/src/test/java/com/baeldung/rxjava/filters/RxJavaTimeFilteringOperatorsTest.java @@ -0,0 +1,221 @@ +package com.baeldung.rxjava.filters; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.junit.Test; + +import rx.Observable; +import rx.observers.TestSubscriber; +import rx.schedulers.TestScheduler; + +public class RxJavaTimeFilteringOperatorsTest { + + @Test + public void givenTimedObservable_whenSampling_thenOnlySampleItemsAreEmitted() { + + TestScheduler testScheduler = new TestScheduler(); + + Observable timedObservable = + Observable.just(1, 2, 3, 4, 5, 6) + .zipWith( + Observable.interval(0, 1, TimeUnit.SECONDS, testScheduler), + (item, time) -> item + ); + + TestSubscriber subscriber = new TestSubscriber(); + + Observable sampledObservable = + timedObservable.sample(2500L, TimeUnit.MILLISECONDS, testScheduler); + + sampledObservable.subscribe(subscriber); + + testScheduler.advanceTimeBy(7, TimeUnit.SECONDS); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValues(3, 5, 6); + } + + @Test + public void givenTimedObservable_whenThrottlingLast_thenThrottleLastItemsAreEmitted() { + + TestScheduler testScheduler = new TestScheduler(); + + Observable timedObservable = + Observable.just(1, 2, 3, 4, 5, 6) + .zipWith( + Observable.interval(0, 1, TimeUnit.SECONDS, testScheduler), + (item, time) -> item + ); + + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = timedObservable.throttleLast(3100L, TimeUnit.MILLISECONDS, testScheduler); + + filteredObservable.subscribe(subscriber); + + testScheduler.advanceTimeBy(7, TimeUnit.SECONDS); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValues(4, 6); + } + + @Test + public void givenRangeObservable_whenThrottlingFirst_thenThrottledFirstItemsAreEmitted() { + + TestScheduler testScheduler = new TestScheduler(); + + Observable timedObservable = + Observable.just(1, 2, 3, 4, 5, 6) + .zipWith( + Observable.interval(0, 1, TimeUnit.SECONDS, testScheduler), + (item, time) -> item + ); + + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = + timedObservable.throttleFirst(4100L, TimeUnit.MILLISECONDS, testScheduler); + + filteredObservable.subscribe(subscriber); + + testScheduler.advanceTimeBy(7, TimeUnit.SECONDS); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValues(1, 6); + } + + @Test + public void givenTimedObservable_whenThrottlingWithTimeout_thenLastItemIsEmitted() { + + TestScheduler testScheduler = new TestScheduler(); + + Observable timedObservable = + Observable.just(1, 2, 3, 4, 5, 6) + .zipWith( + Observable.interval(0, 1, TimeUnit.SECONDS, testScheduler), + (item, time) -> item + ); + + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = timedObservable.throttleWithTimeout(2000L, TimeUnit.MILLISECONDS, testScheduler); + + filteredObservable.subscribe(subscriber); + + testScheduler.advanceTimeBy(7, TimeUnit.SECONDS); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValue(6); + } + + @Test + public void givenTimedObservable_whenDebounceOperatorIsApplied_thenLastItemIsEmitted() { + + TestScheduler testScheduler = new TestScheduler(); + + Observable timedObservable = + Observable.just(1, 2, 3, 4, 5, 6) + .zipWith( + Observable.interval(0, 1, TimeUnit.SECONDS, testScheduler), + (item, time) -> item + ); + + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = timedObservable.debounce(2000L, TimeUnit.MILLISECONDS, testScheduler); + + filteredObservable.subscribe(subscriber); + + testScheduler.advanceTimeBy(7, TimeUnit.SECONDS); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValue(6); + } + + @Test + public void givenTimedObservable_whenUsingTimeout_thenTimeOutException() { + + TestScheduler testScheduler = new TestScheduler(); + + Observable timedObservable = + Observable.just(1, 2, 3, 4, 5, 6) + .zipWith( + Observable.interval(0, 1, TimeUnit.SECONDS, testScheduler), + (item, time) -> item + ); + + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = timedObservable.timeout(500L, TimeUnit.MILLISECONDS, testScheduler); + + filteredObservable.subscribe(subscriber); + + testScheduler.advanceTimeBy(7, TimeUnit.SECONDS); + + subscriber.assertError(TimeoutException.class); + subscriber.assertValues(1); + } + + @Test + public void givenObservable_whenSkippingUntil_thenItemsAreSkippedUntilSecondObservableEmitsItems() { + + TestScheduler testScheduler = new TestScheduler(); + + Observable timedObservable = + Observable.just(1, 2, 3, 4, 5, 6) + .zipWith( + Observable.interval(0, 1, TimeUnit.SECONDS, testScheduler), + (item, time) -> item + ); + + + Observable delayedObservable = Observable.just(1) + .delay(3000, TimeUnit.MILLISECONDS, testScheduler); + + TestSubscriber subscriber = new TestSubscriber(); + + Observable filteredObservable = timedObservable.skipUntil(delayedObservable); + + filteredObservable.subscribe(subscriber); + + testScheduler.advanceTimeBy(7, TimeUnit.SECONDS); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValues(4, 5, 6); + } + + @Test + public void givenObservable_whenSkippingWhile_thenItemsAreEmittedUntilSecondObservableEmitsItems() { + + TestScheduler testScheduler = new TestScheduler(); + + Observable timedObservable = + Observable.just(1, 2, 3, 4, 5, 6) + .zipWith( + Observable.interval(0, 1, TimeUnit.SECONDS, testScheduler), + (item, time) -> item + ); + + TestSubscriber subscriber = new TestSubscriber(); + + Observable delayedObservable = Observable.just(1) + .delay(3000, TimeUnit.MILLISECONDS, testScheduler); + + Observable filteredObservable = timedObservable.takeUntil(delayedObservable); + + filteredObservable.subscribe(subscriber); + + testScheduler.advanceTimeBy(7, TimeUnit.SECONDS); + + subscriber.assertCompleted(); + subscriber.assertNoErrors(); + subscriber.assertValues(1, 2, 3); + } +} diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md index 7a5e8c75e9..b84614dd71 100644 --- a/spring-mvc-xml/README.md +++ b/spring-mvc-xml/README.md @@ -15,3 +15,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Geolocation by IP in Java](http://www.baeldung.com/geolocation-by-ip-with-maxmind) - [Guide to JavaServer Pages (JSP)](http://www.baeldung.com/jsp) - [Exploring SpringMVC’s Form Tag Library](http://www.baeldung.com/spring-mvc-form-tags) +- [Guide to JSTL](http://www.baeldung.com/guide-to-jstl) diff --git a/spring-mvc-xml/pom.xml b/spring-mvc-xml/pom.xml index 049a3fec82..47ecdc438d 100644 --- a/spring-mvc-xml/pom.xml +++ b/spring-mvc-xml/pom.xml @@ -37,6 +37,13 @@ + + com.fasterxml.jackson.core + jackson-databind + 2.9.2 + + + javax.servlet javax.servlet-api @@ -57,6 +64,13 @@ ${hibernate-validator.version} + + mysql + mysql-connector-java + 6.0.6 + + + com.fasterxml.jackson.core @@ -108,6 +122,14 @@ + + + 1 + jstl + https://mvnrepository.com/artifact/javax.servlet/jstl + + + 5.0.2.RELEASE diff --git a/spring-mvc-xml/src/main/java/com/baeldung/jstl/bundles/CustomMessage_en.java b/spring-mvc-xml/src/main/java/com/baeldung/jstl/bundles/CustomMessage_en.java new file mode 100644 index 0000000000..ac27c0cfa2 --- /dev/null +++ b/spring-mvc-xml/src/main/java/com/baeldung/jstl/bundles/CustomMessage_en.java @@ -0,0 +1,17 @@ +package com.baeldung.jstl.bundles; + +import java.util.ListResourceBundle; + +public class CustomMessage_en extends ListResourceBundle { + @Override + protected Object[][] getContents() { + return contents; + } + + static final Object[][] contents = { + {"verb.go", "go"}, + {"verb.come", "come"}, + {"verb.sit", "sit"}, + {"verb.stand", "stand"} + }; +} diff --git a/spring-mvc-xml/src/main/java/com/baeldung/jstl/bundles/CustomMessage_fr_FR.java b/spring-mvc-xml/src/main/java/com/baeldung/jstl/bundles/CustomMessage_fr_FR.java new file mode 100644 index 0000000000..44f1c6a02f --- /dev/null +++ b/spring-mvc-xml/src/main/java/com/baeldung/jstl/bundles/CustomMessage_fr_FR.java @@ -0,0 +1,17 @@ +package com.baeldung.jstl.bundles; + +import java.util.ListResourceBundle; + +public class CustomMessage_fr_FR extends ListResourceBundle { + @Override + protected Object[][] getContents() { + return contents; + } + + static final Object[][] contents = { + {"verb.go", "aller"}, + {"verb.come", "venir"}, + {"verb.sit", "siéger"}, + {"verb.stand", "se lever"} + }; +} diff --git a/spring-mvc-xml/src/main/java/com/baeldung/jstl/controllers/JSTLController.java b/spring-mvc-xml/src/main/java/com/baeldung/jstl/controllers/JSTLController.java new file mode 100644 index 0000000000..c69e8a1b2a --- /dev/null +++ b/spring-mvc-xml/src/main/java/com/baeldung/jstl/controllers/JSTLController.java @@ -0,0 +1,125 @@ +package com.baeldung.jstl.controllers; + +import com.baeldung.jstl.dbaccess.SQLConnection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.FileSystemResource; +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.ResponseBody; +import org.springframework.web.servlet.ModelAndView; + +import javax.annotation.PostConstruct; +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.sql.*; +import java.util.Calendar; + +@Controller +public class JSTLController { + private static final Logger LOGGER = LoggerFactory.getLogger(JSTLController.class.getName()); + + @Autowired + ServletContext servletContext; + + @PostConstruct + public void init() { + PreparedStatement preparedStatement = null; + Connection connection = null; + try { + connection = SQLConnection.getConnection(); + preparedStatement = connection.prepareStatement("create table IF NOT EXISTS USERS " + + "( id int not null primary key AUTO_INCREMENT," + + " email VARCHAR(255) not null, first_name varchar (255), last_name varchar (255), registered DATE)"); + int status = preparedStatement.executeUpdate(); + preparedStatement = connection.prepareStatement("SELECT COUNT(*) AS total FROM USERS;"); + ResultSet result = preparedStatement.executeQuery(); + if(result!=null) { + result.next(); + if (result.getInt("total") == 0) { + generateDummy(connection); + } + } else { + generateDummy(connection); + } + } catch (Exception e) { + LOGGER.error(e.getMessage()); + } finally { + try { + if (preparedStatement != null) { + preparedStatement.close(); + } + if (connection != null) { + connection.close(); + } + } catch (SQLException e) { + LOGGER.error(e.getMessage()); + } + + } + } + + @RequestMapping(value = "/core_tags", method = RequestMethod.GET) + public ModelAndView coreTags(final Model model) { + ModelAndView mv = new ModelAndView("core_tags"); + return mv; + } + + @RequestMapping(value = "/core_tags_redirect", method = RequestMethod.GET) + public ModelAndView coreTagsRedirect(final Model model) { + ModelAndView mv = new ModelAndView("core_tags_redirect"); + return mv; + } + + + @RequestMapping(value = "/formatting_tags", method = RequestMethod.GET) + public ModelAndView formattingTags(final Model model) { + ModelAndView mv = new ModelAndView("formatting_tags"); + return mv; + } + + @RequestMapping(value = "/sql_tags", method = RequestMethod.GET) + public ModelAndView sqlTags(final Model model) { + ModelAndView mv = new ModelAndView("sql_tags"); + return mv; + } + + @RequestMapping(value = "/xml_tags", method = RequestMethod.GET) + public ModelAndView xmlTags(final Model model) { + ModelAndView mv = new ModelAndView("xml_tags"); + return mv; + } + + @RequestMapping(value = "/items_xml", method = RequestMethod.GET) + @ResponseBody public FileSystemResource getFile(HttpServletRequest request, HttpServletResponse response) { + response.setContentType("application/xml"); + return new FileSystemResource(new File(servletContext.getRealPath("/WEB-INF/items.xsl"))); + } + + @RequestMapping(value = "/function_tags", method = RequestMethod.GET) + public ModelAndView functionTags(final Model model) { + ModelAndView mv = new ModelAndView("function_tags"); + return mv; + } + + + private void generateDummy(Connection connection) throws SQLException { + PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO USERS " + + "(email, first_name, last_name, registered) VALUES (?, ?, ?, ?);"); + preparedStatement.setString(1, "patrick@baeldung.com"); + preparedStatement.setString(2, "Patrick"); + preparedStatement.setString(3, "Frank"); + preparedStatement.setDate(4, new Date(Calendar.getInstance().getTimeInMillis())); + preparedStatement.addBatch(); + preparedStatement.setString(1, "bfrank@baeldung.com"); + preparedStatement.setString(2, "Benjamin"); + preparedStatement.setString(3, "Franklin"); + preparedStatement.setDate(4, new Date(Calendar.getInstance().getTimeInMillis())); + preparedStatement.executeBatch(); + } +} diff --git a/spring-mvc-xml/src/main/java/com/baeldung/jstl/dbaccess/SQLConnection.java b/spring-mvc-xml/src/main/java/com/baeldung/jstl/dbaccess/SQLConnection.java new file mode 100644 index 0000000000..441009ed77 --- /dev/null +++ b/spring-mvc-xml/src/main/java/com/baeldung/jstl/dbaccess/SQLConnection.java @@ -0,0 +1,30 @@ +package com.baeldung.jstl.dbaccess; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.Properties; + +public class SQLConnection { + private static String userName = "root"; + private static String password = ""; + private static final Logger LOGGER = LoggerFactory.getLogger(SQLConnection.class.getName()); + + public static Connection getConnection() throws Exception { + LOGGER.error("connecting..."); + Class.forName("com.mysql.cj.jdbc.Driver"); + LOGGER.error("class checked..."); + Connection conn = null; + Properties connectionProps = new Properties(); + connectionProps.put("user", userName); + connectionProps.put("password", password); + conn = DriverManager.getConnection( + "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false", + connectionProps); + LOGGER.info("Connected to database"); + return conn; + } +} diff --git a/spring-mvc-xml/src/main/resources/webMvcConfig.xml b/spring-mvc-xml/src/main/resources/webMvcConfig.xml index 37aebe1d1d..ebb0a14113 100644 --- a/spring-mvc-xml/src/main/resources/webMvcConfig.xml +++ b/spring-mvc-xml/src/main/resources/webMvcConfig.xml @@ -23,7 +23,7 @@ - + diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/items.xsl b/spring-mvc-xml/src/main/webapp/WEB-INF/items.xsl new file mode 100644 index 0000000000..42cb719bb5 --- /dev/null +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/items.xsl @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
\ No newline at end of file diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml b/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml index 032457da43..f664472652 100644 --- a/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/mvc-servlet.xml @@ -7,7 +7,7 @@ http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> - + @@ -40,12 +40,6 @@ - - - - - diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/core_tags.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/core_tags.jsp new file mode 100644 index 0000000000..f5defd101e --- /dev/null +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/core_tags.jsp @@ -0,0 +1,92 @@ +<%@ page import="java.util.Random" %> +<%@ page import="java.util.Date" %> +<%@ page import="java.util.Calendar" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + <c:out value="${pageTitle}"/> + + + +

+ +

+ +

+
+

+ +

+ + <% int x = Integer.valueOf("a");%> + + + +

The exception is : ${exceptionThrown}
+ There is an exception: ${exceptionThrown.message}

+
+
+
+ +

+ + +

+

+ + + + + + + + + + + +

+
+
+

+ +

+ + + +
+
+ +

+ +

+ + + Item

+ +

+
+ +

+ +

+ + +

+ +

+
+ +

+ +

+ + + + + +
+ + \ No newline at end of file diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/core_tags_redirect.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/core_tags_redirect.jsp new file mode 100644 index 0000000000..e8ab0a60c6 --- /dev/null +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/core_tags_redirect.jsp @@ -0,0 +1,16 @@ +<%@ page import="java.util.Random" %> +<%@ page import="java.util.Date" %> +<%@ page import="java.util.Calendar" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + <c:out value="${pageTitle}"/> + + + + + + \ No newline at end of file diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/formatting_tags.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/formatting_tags.jsp new file mode 100644 index 0000000000..1b5cb93cf2 --- /dev/null +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/formatting_tags.jsp @@ -0,0 +1,213 @@ +<%@ page import="java.util.Calendar" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + + + + + <c:out value="${pageTitle}"/> + + + +

+ +

+
+

+ +

+ + +

Formatted Number - Currency:

+ +

Formatted Number - Maximum Integer Digits:

+ +

Formatted Number - Maximum Fraction Digits:

+ +

Formatted Number - Grouping:

+ +

Formatted Number - Percent with Maximum Integer Digits:

+ +

Formatted Number - Percent with Minimum Fraction Digits:

+ +

Formatted Number Percent with Minimum Integer Digits:

+ +

Formatted Number - with Pattern:

+ +

Formatted Number - Currency with Internationalization : + + +

+
+
+ +

+ +

+ +

Parsed Number :

+ +

Parsed Number - with Integer Only set to True:

+
+
+

+ + +

+ +

Formatted Date - with type set to time:

+ +

Formatted Date - with type set to date:

+ +

Formatted Date - with type set to both:

+ +

Formatted Date - with short style for both date and time:

+ +

Formatted Date - with medium style for both date and time:

+ +

Formatted Date - with long style for both date and time:

+ +

Formatted Date - with pattern:

+
+
+ +

+ +

+ + + +

Parsed Date:

+
+
+ +

+ +

+ +

+ +
+
+
+
+
+

+
+
+ +

+ +

+ +

+ + +
+
+
+
+
+

+
+
+ +

+ +

+ +

+ + +
+
+
+
+

+
+
+ +

+ +

+ + + + + + + + + + + +
+

+ + Time being formatted: + + + +

+
+ + + + + +
+
+ +
+ +

+ +

+ +

Current Date with Default Time Zone:

+

Change Time Zone to GMT+9

+ +

Date in Changed Zone:

+
+
+ +

+ +

+ + + +
+
+
+
+
+ + diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/function_tags.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/function_tags.jsp new file mode 100644 index 0000000000..d45bfd1d51 --- /dev/null +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/function_tags.jsp @@ -0,0 +1,151 @@ +<%@ page import="java.util.Random" %> +<%@ page import="java.util.Date" %> +<%@ page import="java.util.Calendar" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix = "fn" + uri = "http://java.sun.com/jsp/jstl/functions" %> + + + + + <c:out value="${pageTitle}"/> + + + +

+ +

+ + + +
+

+ +

+ +

Found 'first' in string

+ +

+
+

+ +

+ +

Found 'first' string

+ + + +

Found 'FIRST' string

+ +

+
+

+ +

+ +

String ends with 'string'

+ +

+
+

+ +

+

With escapeXml() Function:

+

string (1) : ${fn:escapeXml(string1)}

+

string (2) : ${fn:escapeXml(string2)}

+ +

Without escapeXml() Function:

+

string (1) : ${string1}

+

string (2) : ${string2}

+
+
+

+ +

+

Index (1) : ${fn:indexOf(string1, "first")}

+

Index (2) : ${fn:indexOf(string2, "second")}

+
+
+

+ +

+ + +

Final String : ${string4}

+
+
+

+ +

+

Length of String (1) : ${fn:length(string1)}

+

Length of String (2) : ${fn:length(string2)}

+
+
+

+ +

+ +

Final String : ${string3}

+
+
+

+ +

+ +

String starts with 'This'

+
+
+
+

+ +

+ + +

Final sub string : ${string3}

+
+
+

+ +

+ + +

Final sub string : ${string3}

+
+
+

+ +

+ + +

Final sub string : ${string3}

+
+
+

+ +

+ + +

Final string : ${string3}

+
+
+

+ +

+ + +

Final string : ${string3}

+
+
+

+ +

+ +

String (1) Length : ${fn:length(string1)}

+ + +

String (2) Length : ${fn:length(string2)}

+

Final string : "${string2}"

+
+ + \ No newline at end of file diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/sql_tags.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/sql_tags.jsp new file mode 100644 index 0000000000..df10e41c04 --- /dev/null +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/sql_tags.jsp @@ -0,0 +1,198 @@ +<%@ page import="java.util.Random" %> +<%@ page import="java.util.Date" %> +<%@ page import="java.util.Calendar" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> + + + + + <c:out value="${pageTitle}"/> + + + +

+ +

+ + + +
+ +

+ +

+ + SELECT * from USERS; + + + + + + + + + + + + + + + + + + + +
User IDFirst NameLast NameEmailRegistered
+
+
+

+ +

+ + + INSERT INTO USERS(first_name, last_name, email) VALUES ('Grace', 'Adams', 'gracea@domain.com'); + + + SELECT * from USERS; + + + + + + + + + + + + + + + + + + + +
User IDFirst NameLast NameEmailRegistered
+
+
+ +

+ +

+ + + DELETE FROM USERS WHERE email = ? + + + + SELECT * from USERS; + + + + + + + + + + + + + + + + + + + +
User IDFirst NameLast NameEmailRegistered
+ +
+
+ +

+ +

+ <% + Date registered = new Date("2018/03/31"); + String email = "patrick@baeldung.com"; + %> + + + UPDATE Users SET registered = ? WHERE email = ? + + + + + SELECT * from USERS; + + + + + + + + + + + + + + + + + + + +
User IDFirst NameLast NameEmailRegistered
+
+
+ +

+ +

+ + + UPDATE Users SET first_name = 'Patrick-Ellis' WHERE email='patrick@baeldung.com' + + + + UPDATE Users SET last_name = 'Nelson' WHERE email = 'patrick@baeldung.com' + + + + INSERT INTO Users(first_name, last_name, email) VALUES ('Grace', 'Adams', 'gracea@domain.com'); + + + + SELECT * from USERS; + + + + + + + + + + + + + + + + + + + +
User IDFirst NameLast NameEmailRegistered
+
+ + \ No newline at end of file diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/xml_tags.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/xml_tags.jsp new file mode 100644 index 0000000000..9d93c3c190 --- /dev/null +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/xml_tags.jsp @@ -0,0 +1,99 @@ +<%@ page import="java.util.Random" %> +<%@ page import="java.util.Date" %> +<%@ page import="java.util.Calendar" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> + + + + + <c:out value="${pageTitle}"/> + + + +

+ +

+ +

+
+

+ +

+

Store Items:

+ + + + Steve Madden + Sneakers + 34 + + + + Pearl Izumi + Sneakers + 80 + + + + Katy Perry + Heels + 72 + + + + + + The name of the first item listed in the store is: + with price $ +
+ + + The second item is : + + + + Document has at least one + element. + +
+ + + + + +
+
+ +

+ +

+
    + +
  • Item Name:
  • +
    +
+
+
+

+ +

+ + + + Item category is Sneakers + + + + Item category is Heels + + + + Unknown category. + + +
+ + + \ No newline at end of file