如何在不重复代码的情况下在Java Web应用程序中包含jsp页面?

时间:2009-04-21 18:48:44

标签: java jsp include

首先我要说的是我对Java网络应用程序全新,所以如果这是一个非常基本的问题,我很抱歉。

我正在编写一个能够让用户登录帐户的应用。每个页面的顶部都包含一个信息栏(有点像GMail中的顶栏),类似于:

Logged in as <userid> | Settings | Help

由于该部分将出现在每个页面上,因此将该功能拆分出来是合理的,因此我不会复制我的代码。

我做了一些搜索,发现我可以使用它:

<jsp:include page="userInfoBar.jsp" flush="true" />

在另一个JSP的中间。我的userSettings.jsp页面遇到了问题,这也从数据库中获取了一些User详细信息。我不仅在两个JSP之间复制了一些代码,而且我感觉我在网页渲染过程中做了两倍的工作。

例如(伪代码):

userInfoBar.jsp:
user = getCurrentUser
if ( user ) {
  print Logged in as user.userid | Settings | Help
}

userSettings.jsp:
<jsp:include page="userInfoBar.jsp" flush="true" />
user = getCurrentUser
Change settings for user.userid

所以在这个小例子中,getCurrentUser会被调用两次(我想,除非Java以某种方式对其进行优化)。

如何避免这种重复工作,但仍然将userInfoBar与每个JSP分开?

提前致谢!

布赖恩

4 个答案:

答案 0 :(得分:3)

问题是你的JSP中有java代码。当你这样做时,大多数邪恶的事情发生。你应该在谷歌上查找MVC模式。

无论如何,执行此操作的好方法是使用MVC模式,并在控制器中完成繁重的工作,完成繁重的工作后,您可以传递字符串/列表以显示视图,从而显示它们并没有更多。

另外,如果你开始使用带有JSTL的MVC,那么会有更多的人能够帮助你,因为每个人都知道如何做这些事情,并且希望没有多少人仍然在他们的JSP中使用内联java

答案 1 :(得分:2)

尝试使用JSF。这样可以轻松实现MVC。

您可以将两个前端指向同一个会话范围的bean以获取用户信息。

答案 2 :(得分:2)

您还可以使用jspf(JSP片段文件)来存储JSP的块。

jsp:include是包含JSP的一种方式。

另一种方法是使用来自JSTL库的c:include。

这里涉及的区别如下: * http://sharat.wordpress.com/2006/09/08/40-what-is-the-difference-between-jspinclude-and-cimport/

希望有所帮助。我确信有特定于框架的方法,但这些是我所知道的两种JSP方法。

答案 3 :(得分:0)

嗯,对于一个有几页的小项目,我认为做普通的jsp是可以的,并且抓住它并不是一个坏主意。

我可以向你保证,任何框架都会添加更多“不必要的”代码,这些代码会一遍又一遍地调用,但你不会注意到它隐藏在抽象背后。

(我不能真正推荐一个适合java的html框架,但也许GWT是最有希望的,或者至少是最不痛苦的。至少我可以在一个体面的编辑器中编写真正的可调试代码......)< / p>