You could use <f:setPropertyActionListener>.
<h:commandLink value="Edit" action="edit?faces-redirect=true">
<f:setPropertyActionListener target="#{bean.id}" value="#{id}" />
</h:commandLink>
Or you could abuse actionListener.
<h:commandLink value="Edit" action="edit?faces-redirect=true"
actionListener="#{bean.setId(id)}" />
Both ways, however, would require a session scoped bean to remember the chosen id, which is plain awkward. When you open such link multiple times in different browser tabs and then interact on each them afterwards, the site's behavior would be really unintuitive and confusing.
The canonical way is to just pass it as a GET parameter.
<h:link value="Edit" outcome="edit">
<f:param name="id" value="#{id}" />
</h:link>
The target page can get hold of it via <f:viewParam> and if necessary invoke business action on it via <f:viewAction>.
See also: