Coder Social home page Coder Social logo

springmvcstepbystep's Introduction

Spring MVC Tutorial for Beginners

Welcome to our Course on Spring MVC. Go to Step wise details to understand all the concepts you would learn in this course. We have all the code at the end of each step in (Step01.md, Step02.md, Step37.md). Also present are some zip files with code at the end of some steps(Step07.zip to Step37.zip).

Spring MVC Tutorial for Beginners - TOC

Installing Eclipse and Java

https://github.com/in28minutes/SpringIn28Minutes/blob/master/InstallationGuide-JavaEclipseAndMaven_v2.pdf

Course Overview

You will learn about

  • DispatcherServlet
  • Basic Todo Management Application with Login/Logout
  • Model, Controllers, ViewResolver and Filters
  • Forms - DataBinding, Validation
  • Annotation based approach - @RequestParam, @PathVariable, @ModelAttribute, @SessionAttributes etc
  • Bootstrap to style the page
  • Spring Security
  • Internationalization
  • Exception Handling
  • Basic REST Services

Steps 1 to 7 - Build a normal Web Application

  • Understand Basics of HTTP
  • HttpRequest - GET/POST, Request Parameters
  • HTTP Response - Response Status - 404,200,500 etc
  • Introduction to JSP, Servlets, Scriptlets and EL
  • HTML Form - Method, Action & Form Data
  • Understand Basics of using Maven, Tomcat and Eclipse
  • Using Request Attributes for passing Model between Servlet and View

Steps 11 to XX : Use Spring MVC to Build Your First Web Application

  • Step 11 : Configure application to use Spring MVC
  • Step 12 : First Spring MVC Controller, @ResponseBody, @Controller
  • Step 13 : Redirect to Login JSP - LoginController, @ResponseBody and View Resolver
  • Step 14 : DispatcherServlet and Log4j
  • Step 15 : Show userid and password on the welcome page - ModelMap and @RequestParam
  • Step 16 : LoginService and Remove all JEE Servlets based code
  • Step 17 : Spring Auto-wiring and Dependency Management - @Autowired and @Service
  • Step 18 : Create TodoController and list-todos.jsp. Make TodoService a @Service and inject it.
  • Step 19 : Web Application Architecture
  • Step 20 : More about Spring Framework
  • Step 21 : Session vs Model vs Request - @SessionAttributes
  • Step 22 : New Todo and redirect to a Controller
  • Step 23 : JSTL
  • Step 24 : Bootstrap - using Webjars
  • Step 25 : Let's delete a Todo
  • Step 26 : Use Bootstrap to format and add HTML5 Validations
  • Step 27 : Introduce JSR 349 Validations using Hibernate Validator - First Command Bean.
  • Step 28 : Let's update a Todo
  • Step 29 : Let's add a Target Date for Todo - Use initBinder to Handle Date Fields
  • Step 30 : Navigation bar and JSP Fragments
  • Step 31 : Let's prepare for Spring Security
  • Step 32 : Initial Setup for Spring Security
  • Step 33 : Refactor and add Logout Functionality using Spring Security
  • Step 34 : Exception Handling in Spring MVC - @ControllerAdvice, @ExceptionHandler and error-page in web.xml
  • Step 35 : Let's add Internationalization - i18n
  • Step 36 : Basic Spring Rest Services - @RestController and jackson-databind
  • Step 37 : More Rest Services - @PathVariable

Expectations

  • For taking this course, you should already know Java.
  • We expect NO prior experience with web development using Java.
  • We expect NO prior experience with Spring.

Running Examples

Step wise details

  • Step01.md : Up and running with a web app in Tomcat
  • Step02.md : First JSP
  • Step03.md : Adding a GET Parameter name
  • Step04.md : Adding another Get Parameter Password
  • Step05.md : Lets add a form
  • Step06.md : New Form and doPost
  • Step07.md : Adding Password, validation of userid/password

Exercises

  • Split TodoController into different Controllers
  • Use same TodoController for both updates and new todo
  • Functionality to mark a Todo as complete

Future Things To Do

  • Unit Tests - WTF - why are they not here in the first set?

About in28Minutes

At in28Minutes, we ask ourselves one question everyday

How do we create more amazing course experiences? We use 80-20 Rule. We discuss 20% things used 80% of time in depth.

We are creating amazing learning experiences for learning Spring Boot with AWS, Azure, GCP, Docker, Kubernetes and Full Stack. 300,000 Learners rely on our expertise. Find out more....

in28MinutesLearningRoadmap-July2019.png

springmvcstepbystep's People

Contributors

in28minutes avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

springmvcstepbystep's Issues

Edit Todo

When editing Todo (Step 28), seems like it is adding a new Todo with new desc and not deleting the old todo that is in code in TodoService.java (updateTodo function)

I don't understand how does the updateTodo function in TodoService.java removes the existing todo and add a new todo as it doesn't work when I try doing that.

java.lang.ClassNotFoundException: org.springframework.web.SpringServletContainerInitializer

This error happens because of:

https://github.com/in28minutes/SpringMvcStepByStep/blob/master/Step11.md

/pom.xml

4.2.2.RELEASE
just change it to

4.2.3.RELEASE
and it will work, no matter if you use Java 7 or Java 8

If you download project from GitHub, you can see that in Step11.zip there is version 4.2.3 while in Step07.zip there is version: 4.2.2

It would be great if this would be corrected in: https://github.com/in28minutes/SpringMvcStepByStep/blob/master/Step11.md

It took me some time to find cause of this error, might save time for some one else.

step1 The requested resource is not available.

It seems to me that I do all I should do:

  1. I changed file pom.xml
  2. I created file webapp/LoginServlet.java
  3. I created file webapp/WEB-INF/web.xml

On localhost:8080 I see:
HTTP Status 404 - /
type Status report

message /

description The requested resource is not available.

Apache Tomcat/7.0.47

What mistake I made? What should I check?

LoginServlet.java

I'm new on SpringMVN and I just stated the course. I got a few issues, the import javax.servlet.annotation.WebServlet, javax.servlet.http.HttpServlet,javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse cannot e resolved. Any clue? Thanks.

NoClassDefFoundError error

Hi

After adding following Spring security setups

  • dependency injunction in pom.xml
  • SecurityConfiguration.java
  • Added filters in web.xml
  • Other configurations in todo-servlet

I am getting the following error, please help. I have deleted and reinstalled the whole project and get same error page.

javax.servlet.ServletException: Servlet.init() for servlet dispatcher threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)

Failed to read artifact descriptor for log4j:log4j:jar:1.2.17

This:

log4j
log4j
1.2.17

Should be changed to this: 1.2.16
Otherwise there will be error:
Description Resource Path Location Type
Failed to read artifact descriptor for log4j:log4j:jar:1.2.17

org.eclipse.aether.resolution.ArtifactDescriptorException: Failed to read artifact descriptor for log4j:log4j:jar:1.2.17
at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:282)
at org.apache.maven.repository.internal.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:198)
at org.eclipse.aether.internal.impl.DefaultDependencyCollector.resolveCachedArtifactDescriptor(DefaultDependencyCollector.java:535)
at org.eclipse.aether.internal.impl.DefaultDependencyCollector.getArtifactDescriptorResult(DefaultDependencyCollector.java:519)
at org.eclipse.aether.internal.impl.DefaultDependencyCollector.processDependency(DefaultDependencyCollector.java:409)
at org.eclipse.aether.internal.impl.DefaultDependencyCollector.processDependency(DefaultDependencyCollector.java:363) ....

Check: http://stackoverflow.com/questions/19230075/log4j-maven-dependency-download-getting-timed-out

Problem in step3 Passing parameters to JSP

I have problem with step 3, Passing request parameters using get method. The attribute is not defined in JSP and blank. If I change the line to:

request.getSession().setAttribute("name", name);

then it works. I also have problems with that I have to press reload before the changed parameter shows up in the JSP page output - simply change in address bar and press return does not update the page. I'm using Edge browser.

Spring MVC Dispatcher not working

[http-nio-8084-exec-11] org.apache.catalina.core.ApplicationContext.log No Spring WebApplicationInitializer types detected on classpath
30-Oct-2016 11:56:47.151 INFO [http-nio-8084-exec-11] org.apache.catalina.core.ApplicationContext.log Initializing Spring FrameworkServlet 'dispatcher'

and page 404 is continuously appearing on HOW TO FIX IT

HTTP Status 404 - /spring-mvc/login
type Status report
message /spring-mvc/login
description The requested resource is not available.

Resource not available for CSS and JS

Bootstrap is not working for me.

The browser is trying to find the css at - not sure if this is right
http://localhost:8080/sample/person/webjars/bootstrap/3.3.6/css/bootstrap.min.css

Project Name: sample
tried a bunch of things including restarts, updating maven,...

In DispatcherServlet.xml
<mvc:resources mapping="/webjars/**" location="/webjars/" />

PersonController.java has
@RequestMapping(value = "/person/searchPerson", method=RequestMethod.GET)
public ModelAndView searchPerson() {
ModelAndView mv = new ModelAndView("/person/searchPerson","person", new Person());
return mv;
}

in JSP

in pom.xml

	<!-- bootstrap -->
	<dependency>
	    <groupId>org.webjars</groupId>
	    <artifactId>bootstrap</artifactId>
	    <version>3.3.6</version>
	</dependency>
	
	<!-- jquery -->
	<dependency>
	    <groupId>org.webjars.bower</groupId>
	    <artifactId>jquery</artifactId>
	    <version>1.9.1</version>
	</dependency> 

Having trouble at validation

Hello sir,
I am having trouble at step 27 while validating an add-a-new-todo request. When i enter more than 6 characters, the code executes normally. Although when i enter less than 6 chars, it returns;

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'todo' available as request attribute.

Rest of the code flows normally. Here is the code of add controller.

@RequestMapping(value = "/add-todos", method = RequestMethod.GET)
public String showAddTodoPage(ModelMap model) {
model.addAttribute("todo", new ToDoBean());
return "add-todo";
}
@RequestMapping(value = "/add-todos", method = RequestMethod.POST)
public String addTodo(ModelMap model, @Valid ToDoBean todoBean,
BindingResult result) {

	if (result.hasErrors()) {
		return "add-todo";
	}
	String user = (String) model.get("name");
	todoService.addTodo(user, todoBean.getDesc(), new Date(), false);
	model.clear();// to prevent request parameter "name" to be passed
	return "redirect:/list-todos";
}

I have uploaded the code here. Thank you sir.

in28Minutes-first-webapp.zip

Edit

When we edit the description using edit option, it is not reflected when you see the todo page (Step 29)

HTTP Status 500 - Servlet.init() for servlet dispatcher threw exception

Hi,

im stuck on Step 27, after a few steps I get the following stacktrace:
step 26 is working fine for me but after adding the @SiZe annotation and the hibernate validation the application crashes and i dont know why

type Exception report

message Servlet.init() for servlet dispatcher threw exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet.init() for servlet dispatcher threw exception
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
java.base/java.lang.Thread.run(Thread.java:835)
root cause

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean#0': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.internal.engine.ConfigurationImpl
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:633)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:681)
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:552)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493)
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
javax.servlet.GenericServlet.init(GenericServlet.java:160)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
java.base/java.lang.Thread.run(Thread.java:835)
root cause

java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.internal.engine.ConfigurationImpl
org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:41)
javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276)
org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:223)
org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean.afterPropertiesSet(OptionalValidatorFactoryBean.java:40)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:305)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:667)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:633)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:681)
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:552)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:493)
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
javax.servlet.GenericServlet.init(GenericServlet.java:160)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
java.base/java.lang.Thread.run(Thread.java:835)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.