2010-09-22 40 views
1

这是我遇到的一类问题的例子。生成网页时使用多态吗?

当用户有两种可能涉及到我的应用程序的主页,他/她是:登录

  • 没有登录

    1. 如果用户登录我想在右上角显示用户名和一个说“注销”的链接。如果用户没有登录,我想显示“登录或注册”链接。

      此前我会从JSP中调用一些代码,它会返回一段适当的HTML代码,我会将其粘贴到页面中。但这可能不是最好的做法,虽然它很简单。

      现在我相信我应该将首页的初始请求发送给一个servlet(而不是jsp),它将实例化一些类型为“HomePage”的对象,它具有子类“LoggedInHomePage”和“NotLoggedInHomePage”,具体取决于用户id在会话变量中可用。我将不得不用if或case语句来确定正确的构造函数。

      到目前为止看起来整洁。但是在这一点上它又变得混乱了,因为我现在需要知道我的“Request对象”中是否提供了userId,我需要使用一些if语句,或者我使用了不同的jsp模板,这意味着有两个几乎相同的jsps坐在服务器上为每一页。

      既不显得优雅。最受赞赏的帮助。如果你对这个问题有一个很好的解决方案,请忽略我的描述,并且说出来,我不介意把我在这里提出的任何想法扔掉。

    回答

    1

    一种可能的解决方案:

    添加方法原型HomePage。叫它getNavigationArea()getNavigationLinks()(说)。该方法将返回一组可用合适的HTML呈现的一组Link对象。

    LoggedInHomePageNotLoggedInHomePage都会覆盖此方法。前者的实现将提供一个Link实例,该实例表示“注销”,而后者将提供一个表示“注册/注册”的实例。

    JSP将呈现导航区域而不知道其内容是什么。这样,您将只有一个JSP页面,而不考虑用户状态。你也可以添加其他类型的用户,比如说RegularUser,AdminUser等,不同的导航选项无需添加新的JSP页面。

    +0

    感谢我将做的一个改变是我将返回一个链接对象列表,因为问题是在一种情况下我有一个单一的链接(注册),在另一种情况下,我有两个链接(用户名,注销)。谢谢。 – Ankur 2010-09-22 10:05:54

    3

    我会简单地创建一个主页,一个登录组件,其职责是显示当前状态,并在登录时进行必要的身份验证。

    这是一个“有”关系,而不是'是'

    +0

    是的,我同意它是“有”不是“是”..会使事物属性而不是子类。 – Ankur 2010-09-22 10:08:14

    +0

    这是类似于有一个页眉/页脚/左/右区域本身是一个jsp,然后使其处理登录逻辑。所有的页面都是由这个登录JSP组成的? – 2010-09-23 10:24:13

    +0

    这是我所提供的最佳选择。简单而优雅。 – EricBoersma 2010-09-23 19:31:51