If you submit a JSF form by clicking something like a <h:commandButton>
, JSF will always perform a postback, which means that the request will go back to the original page. That's why your method is executed a second time. If you don't want this, you can configure PrettyFaces to skip page action method invocation for postback:
@URLAction(mappingId="abc", onPostback=false)
private String hello(){
return null;
}