Bummer! You have been redirected as the page you requested could not be found.
Heads up! To view this whole video, sign in with your Courses account or enroll in your free 7-day trial. Sign In Enroll
Well done!
You have completed Spring Basics!
You have completed Spring Basics!
Preview
In this video, you are tasked with creating a controller to handle requests related to categories.
This video doesn't have any notes.
Related Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign upRelated Discussions
Have questions about this video? Start a discussion with the community and Treehouse staff.
Sign up
With our model and data repository in
place, let's move on to the controller.
0:00
We'll need a controller for categories
that can capture requests to a URI for
0:05
all the categories and
a URI for a single category.
0:09
So, here's your next task.
0:13
Create a Category Controller with one
method [SOUND] that captures requests to
0:16
/categories and returns a String.
0:20
This method should fetch the entire
list of category objects from
0:23
an auto-wired category repository and
add it to a ModelMap.
0:26
[SOUND] Then, the method should return
the string categories to associate it
0:30
with the provided Thymeleaf Template.
0:35
Are you ready for this?
0:37
Okay.
0:39
Go ahead, have at it.
0:40
But wait, remember to use the GIF
controller as an example to follow.
0:41
Ready, set, code.
0:46
>> All right, what you're looking at
here is my category controller class,
0:48
which I put in the controller
package with the other controller.
0:52
You can see that I've annotated the class
with Controller and included an Autowired
0:55
category repository that I can use
in the controller method down here.
1:00
As for this method, I've annotated
it with request mapping to capture
1:05
any requests for the category list page,
which is /categories.
1:09
Here is my modelMap parameter, and
inside is the the call to the repository's
1:14
getALLCategories method that
we wrote together earlier.
1:19
I added the list that was returned
by this method to the modelMap using
1:22
modelmap.put here.
1:27
And here I've returned the name of
the time leave template, or categories.
1:28
This is will ensure that it's
the categories.html template that will be
1:34
rendered when this page is requested.
1:37
The last piece of this controller,
we'll do together.
1:41
We'll need another method that will
capture requests to an individual
1:44
category.
1:46
To start that, I'll request
a mapping to a single category page,
1:47
category/, and
here we're going to use an integer id.
1:52
The name won't work well
as a URI placeholder
1:57
here because names could
have spaces in them.
2:00
So instead,
I'll use the integer id as a placeholder.
2:03
Then we'll start typing the method
public String category.
2:08
And the first parameter I'm going
to list is our @PathVariable.
2:14
That will capture the value
that's passed into
2:18
the id placeholder that's in
our RequestMapping annotation.
2:21
So I will call it id.
2:26
And of course, we'll include
an instance of a modelMap that'll
2:27
be passed in by the Spring framework.
2:31
>> Now, I know I'm going to return
the single categories template,
2:35
which is given in category.html, so
I'll type in that return value right now.
2:38
That's going to be return "category".
2:44
Now I know the category page
in the browser should probably
2:49
contain the category name, as well as
2:52
all GIFs related to that category,
>> So by the time we reach the return
2:54
statement we better have added to
the model map, both a category object
2:59
associated with this ID as well as a list
of GIFs associated with this category.
3:04
Let's tackle each of those now.
3:11
First, the category object.
3:13
You just wrote a findById method, so
3:15
we'll call that now and
add the result to the model map.
3:17
I'll create the category object,
3:19
And use the categoryRepository field and
call its findById method
3:27
passing it the integer id that
came into our path variable.
3:32
Then I'll add the category object that
was returned by the findById method to
3:37
the model, using modelMap.put.
3:41
The name I'll give it will be simply
category, and I'll pass category.
3:46
Whatever value was stored in there
as a result of this return value,
3:50
I will add to the ModelMap.
3:54
Now onto the next item.
3:57
For a list of the GIFs associated with
this category, we'll need to use a GIF
3:58
repository to fetch all those GIFs
within a certain category ID, like this.
4:03
I'll give myself a couple
lines to separate this code.
4:10
And the first thing I'll
do is define a list that'll
4:13
hold that list of GIFs that comes
back from the GIF repository.
4:15
Make sure to import the GIF class there,
since we haven't done that yet.
4:19
And I'll call the gifRepositories,
4:24
findByCategoryId method,
passing it the id.
4:28
And finally, adding that list to
the model map with modelMap.put.
4:33
I'll call that "gifs" in the map key,
and pass it the object gifs.
4:38
But wait,
there are two problems with this.
4:47
First, there is no GIF
repository variable defined.
4:50
And second, there is no
findByCategoryId method defined for
4:53
a GIF repository object.
4:57
The first one we can fix right here.
4:59
We'll simply add an Autowired
gift repository to the object.
5:00
So I'll add that with the @Autowired
annotation, add a GifRepository.
5:06
That fixes the first error, but
5:14
we still have this error with
the missing findByCategoryId method.
5:16
This one will take a bit more work.
5:21
But it's still pretty quick.
5:23
We'll hop over to the GifRepository class,
and add a findByCategoryId method.
5:24
So let's scroll down here and
I'll just add it to the bottom.
5:32
That'll return a list.
5:35
FindByCategoryId, and let's have
it accept a single end parameter.
5:41
So this method, given some int id,
will essentially iterate over our
5:48
list up here looking for
objects that have a given category id.
5:53
If they haven't given a category id,
5:58
I will include those in
the list that I return.
6:00
So to start, we better initialize
a brand new empty list.
6:03
I'll make it a list of GIFs and
initialize it as a new ArrayList.
6:08
Make sure to import those classes,
excellent.
6:18
Now, let's use a for each loop to
iterate over the list of ALL_GIFS.
6:22
So for every Gif,
I keep typing Fig, how about Gif?
6:28
For every Gif in ALL_GIFS Let's
6:33
check to see if the category id of the Gif
object in this iteration of the loop is
6:38
equal to the id value that
was passed in as a parameter.
6:43
So, if gif.getCategoryId ==,
6:46
I can use double equals here.
6:51
It's a primitive value.
6:54
I don't need to use dot equals.
6:55
Then what I want to do
is add that to the list.
6:59
So, by the time we get through this loop,
any Gif in the list that has the category
7:05
ID that was passed in
as a parameter value,
7:10
will be added to the list name Gifs.
7:12
And once I get through my loop,
what I'd like to do is return
7:14
whatever list has resulted
by iterating over all gifs.
7:19
Now that we've coded this method, after
we jumped back to the category controller
7:24
class, we should see that that error
right there has been resolved,
7:28
since we created that method.
7:33
At this point, we should at least be
able to see the category list page,
7:36
even if it hasn't been
infused with live data.
7:40
Let's redeploy and check it out.
7:44
So if your boot run task is still running,
go ahead and stop it.
7:46
And after a few moments,
7:50
you can rerun that bootRun task to reboot
your server and redeploy your web app.
7:52
And it looks like I have a compiler error.
7:58
I see what happened here.
8:06
So this error right here says that I can't
8:08
leave this generic between these
angle brackets here empty.
8:12
And why does it say that?
8:16
Well, it says that because in my
build file, if I go to my build file,
8:18
build.gradle, I said I wanted
my Java source code to
8:22
be compatible with Java five,
that is version 1.5, and
8:28
I have to use source 7 or
higher to enable the diamond operator.
8:33
That's the operator that allows
us to leave that generic empty.
8:39
So, what I'm going to do is, well, I could
do one of two things, I could remove
8:43
the source compatibility here, I could
increase the source compatibility here, or
8:47
I could go back to this line right here,
and actually add gif right there.
8:52
I'm simply actually going to
delete the source compatibility.
8:59
Delete that.
9:02
We'll save it and
now I'm going to rerun the bootRun task.
9:03
And there it looks like
the compilation has succeeded.
9:09
And the web server's up and running.
9:13
My application is deployed.
9:14
Let's check it out.
9:16
So I'm going to go back to my main page.
9:19
There's the home page,
we didn't touch it in this last task.
9:22
What we did touch, though,
is the Categories page.
9:24
And there it is!
9:28
It's working!
9:29
We see that the template is actually
displayed, though it has static HTML.
9:31
And from this, you can probably guess
what your final task is going to be.
9:35
You need to sign up for Treehouse in order to download course files.
Sign upYou need to sign up for Treehouse in order to set up Workspace
Sign up