Java EE 7/JSF 2.2下复用login.xhtml的差异化导航设计方案咨询
解决方案思路
这里有个清晰的设计方案,完全符合你的要求——不在Session.java里写导航逻辑,全靠JSF的导航规则来区分场景:
1. 给两个登录入口添加场景标识
首先,在触发登录页面的两个链接里,传递一个场景标识参数,用来告诉登录页面它是从哪里被打开的:
- 导航栏的“Log In”链接:跳转时带上参数,比如
source=navbar(可以用<f:param>标签嵌入链接中),这样登录页面加载时就能拿到这个参数。 - adverts.xhtml里的“Contact Advertiser”链接:打开弹窗时同样带上参数
source=advert,确保登录表单提交时这个参数会被一起发送。
2. 让登录方法返回固定结果
修改Session.java里的login()方法,只负责处理登录逻辑(验证用户、创建会话等),最后返回一个固定的结果字符串,比如"loginSuccess"——完全不涉及任何导航相关的代码,把导航的控制权交给JSF配置。
3. 在jsf-config.xml中配置带条件的导航规则
利用JSF 2.2支持的导航规则条件判断(<if>标签),根据之前传递的source参数来决定登录成功后的跳转目标:
- 当
source为navbar时(也就是登录页面嵌入login-page模板的场景),导航到home.xhtml; - 当
source为advert时(登录页面作为adverts.xhtml的弹窗加载的场景),导航回adverts.xhtml。
这种方案的好处是完全遵循了关注点分离:业务逻辑(登录)和导航逻辑完全分开,所有导航规则集中在配置文件里,后期维护也更方便。
内容的提问来源于stack exchange,提问作者Jose Manuel Gomez Alvarez
相关产品推荐
相关产品推荐

