The URI templates mentioned earlier can do exactly what you want. In the Alfresco Share application we do pretty much exactly the same:
Code:
<alfresco-config>
<config evaluator="string-compare" condition="UriTemplate">
<!-- list of URI based page Id templates used by Share -->
<!-- when pages are requested from the framework, matches are attempted
against each uri-template, and the token values returned if matched -->
<uri-templates>
<uri-template id="sitedashboardpage">/site/{site}/dashboard</uri-template>
<uri-template id="sitepage">/site/{site}/{pageid}</uri-template>
<uri-template id="userdashboardpage">/user/{userid}/dashboard</uri-template>
<uri-template id="userpage">/user/{userid}/{pageid}</uri-template>
<uri-template id="userprofilepage">/user/{userid}/profile</uri-template>
<uri-template id="userdefaultpage">/user/{pageid}</uri-template>
<uri-template id="consoletoolpage">/console/{pageid}/{toolid}</uri-template>
<uri-template id="consolepage">/console/{pageid}</uri-template>
</uri-templates>
</config>
</alfresco-config>
You can add a similar override config block to your surf.xml config.
So what does it mean? Basically it allows you to specify which part of the URL is used to represent the pageid for the lookup of the page Surf object - rather than the whole uri. It also allows you to "mark" or "template" parts of the url so they it will get automatically tokenized by surf and the values placed in the page.url.templateArgs map - which you can access from WebScript javascript. We do this a lot in Alfresco Share!
For your example I think you want something like this:
Code:
<uri-template id="catpages">/cats/{pageid}</uri-template>
<uri-template id="micepages">/mice/{pageid}</uri-template>
The "id" of the template is simply a unique id - it is only used if you want to push them down to client-side javascript i.e so you could generate well known urls on the client. The {pageid} token is a well known token name that is known to Surf to mean "this bit of the url is the page id" - any other tokens you specify will simply get the name/value pairs added to the page.url.templateArgs map I mentioned ealier.
Hope this helps!
Kev