I'd use two separate (non-scrollable) cursors, one for the forward button and one for the backward button.
Both should have a "fetch first 50 rows only".
It's indeed a good idea to use multi-row fetch for this purpose, although that will complicate the programming logic compared to a "normal" iteration until SQLCODE NOT= 0. (Especially when less than 50 rows are returned, some additional GET DIAGNOSTICS DB2 (and COBOL) logic will be needed...)
Don't forget to use a "WHERE key > :last-seen" and "ORDER BY key" in the forward cursor (and something similar in the backward one). The host variable "last-seen" should be passed in (through an http POST?) from the previous screen.
For the "count(*)" I would indeed write a separate query.
Note that the implementation mentioned above uses the classical "pseudo-conversational" approach. Which is normally what you should be after.
There are completely different implementations for your problem. One particularly interesting one *could* be a static scrollable cursor, since it will materialise the full result set when entering the first screen of 50 entries. Next screens will then run through this result set (stored inside DB2) without having to access the base data anymore, which guarantees inter-consistency of the data shown. But if the data changes in the mean time, those changes will not be visible.
Most important drawback of the scrollable cursor approach is the fact that it is not pseudo-conversational. It will require the cursor to remain open across screens, which could be technically difficult or even impossible.
See also
ABIS Training & Consulting - DB2 for z/OS advanced programming