The difference is much bigger than you expects.
outputLink is an equivalent of the < a href >. From the
JSF point of view, it is alway a non-faces request. According to the JSF Specification, it is called "non-faces request generates faces response". The JSF lifecycle create the new view (based on the page you use in URL) and jumps directly to the sixth phase - Render Response. The value from the f:param is not assigned because JSF bypass all the phases such assignment might be performed.
commandLink is one of way for JSF postback. I.e. it triggers the form post that is associated with "faces request" on the server and JSF walks thru the JSF lifecycle. In same cases ( like session cannot be restored, validation failed, conversion failed, update more failed) particular phases might be bypassed. The application might jump to the next page only if the whole JSF lifecycle is passed and the navigation to the next page in performed at the end of the fifth phase.
According to your code snippet, you are completely misunderstand what the h:commandLink is about. The action attribute is NOT an URL to the next page. The action attribute should return a literal value that is used in the navigation case declared in the faces-config.xml file.