我举个例子来说明我的意思。我有一个只有2页的简单网站。主页面包含另一个页面(假设包含的页面是包含站点菜单的页面)。
我必须在该菜单中进行一些动态操作,所以我想通过使用servlet来控制该菜单。
我在servlet中做了一些“东西”之后我想告诉servlet“将自己重定向”到jsp页面并打印,在那个页面上(主页包含),我从servlet传递的内容到jsp页面。
我无法使用此代码
request.setAttribute("var", var)
request.getRequestDispatcher(destinationPage).forward(request, response)
因为,当然,我的所有网站都会被重定向到“destinationPage”页面,而不仅仅是包含页面!
相反,在servlet中使用此代码是否正确?
request.setAttribute("var", var)
request.getRequestDispatcher(destinationPage).include(request, response);
我可以用上面的代码处理很多包含吗?
在jsp“主”页面中处理许多内容的正确方法是什么?
谢谢
答案 0 :(得分:0)
我假设:
您当然可以在菜单jsp中包含一个servlet,但该servlet代码不应该重定向。它只是设置请求属性并返回,让调用jsp执行该部分。
但恕我直言,你不应该使用servlet。如果它只需要初始请求和响应,则应使用可以访问请求和响应的过滤器(并且可以设置将在所有servlet和jsp中使用的请求属性)。在任何其他情况下,您可以访问实用程序类的静态方法,或使用ServletContextListener
将实用程序对象放在servlet上下文属性中,并在任何jsp页面中使用它:
<% UtilityClass.putMenuElementsIntoRequest(...); %>
或
<% application.getAttribute("utilityObject").putMenuElementsIntoRequest(...); %>
甚至(说Foo
是String
,List<String>
之一,...)
<% Foo foo = application.getAttribute("utilityObject").getFoo(...);
pageContext.setAttribute("foo", foo) %>
您可以在jsp文件中使用${foo}
。
这样,您不仅可以使用service
方法,还可以传递任意对象。
但是如果你真的要做真正的事情......使用像Apache Tiles这样的框架来管理你的控制器的布局,Struts或Spring MVC,并在WEB-INF下隐藏你的jsp视图......
答案 1 :(得分:0)
我必须做一个项目,我被要求做同样的事情!这就是我提出的:
您可以在“iframe”中的主jsp中加载另一个jsp。现在,只要您单击菜单中的某些内容(某些超链接,如<a href="">/<a>
),就会将该超链接的目标设置为该iframe。
例如,您在菜单中有一个选项作为“编辑配置文件”,并且您想首先调用一个servlet“EditProfileServlet”,它将向您发送请求EditProfile.jsp,它将显示必要的内容。
为此你可以使用它:
<a href="EditProfileServlet" target="right_iframe">Edit Profile</a>
此处,“right_iframe”是将加载视图的框架。 在Servlet中,您可以使用RequestDispatcher或sendRedirect将请求转发到所需的JSP。