O componente chamado de logic locator é responsável por ler urls e traduzí-las como requisições de lógicas de negócios.
Isso significa que dada uma URL, ele precisa decidir qual o componente e lógica devem ser utilizados para esse usuário.
O logic locator padrão utiliza o clássico componentName.logicName.logic.
Você pode sobrescrever o logic locator, definindo sua própria classe que implementa LogicLocator e configurando-a no arquivo web.xml:
<context-param>
<param-name>
org.vraptor.url.LogicLocator
</param-name>
<param-value>org.vraptor.MyLogicLocator</param-value>
</context-param>Suponha que você queira mudar a url padrão componentName.logicName.logic para componentName/logicName.logic. Você tem que implementar seu próprio LogicLocator, como:
public class MyLogicLocator implements LogicLocator {
private final ComponentManager manager;
public MyLogicLocator(ComponentManager manager) {
this.manager = manager;
}
public LogicMethod locate(HttpServletRequest req)
throws InvalidURLException, LogicNotFoundException,
ComponentNotFoundException {
String requestURI = req.getRequestURI();
//URI vai ser parecida com http://mydomain.com/myapp/componentName/logicName.logic
int lastSlash = requestURI.lastIndexOf('/');
int beforeLastSlash = requestURI.lastIndexOf('/', lastSlash - 1);
if (lastSlash == -1 || beforeLastSlash == -1) {
throw new InvalidURLException("I can't handle this url");
}
String logic = requestURI.substring(lastSlash + 1); // logic == logicName.logic
int comma = logic.lastIndexOf('.');
if (comma == -1) {
throw new InvalidURLException("I can't handle this url");
}
logic = logic.substring(0, comma - 1); //logic == logicName
String component = requestURI.substring(beforeLastSlash + 1, lastSlash);
ComponentType component = manager.getComponent(component, logic);
LogicMethod method = component.getLogic(logic);
return method;
}
}