If all you need is to print the name of a person, and you really don’t care what scope the person is in (or, you do care, but you know there’s only one person out of all four scopes), you just use:
${person.name}
Or, if you’re worried about a potential naming conflict, you can be explicit about which person you want:
${requestScope.person.name}
But is there another reason you might have to preface the attribute with the implicit scope object? Other than to control...scoping?
Think about this scenario: if you have a name that’s not in quotes in brackets [ ], that means it MUST adhere to Java naming rules, right? Here, we’re OK, because person is a perfectly legal Java variable name. But that’s because somewhere, someone said,
request.setAttribute("person", p);
But an attribute name is a String!
Strings don’t follow Java variable name rules!
That means someone could say:
request.setAttribute("foo.person", p);
And then you’d be in trouble, because THIS won’t work:
But you’ll be so thankful for scope objects, because using a scope object lets you switch to the [ ] operator, that can take String names that don’t conform to Java naming rules.