日期:2014-05-16  浏览次数:20449 次

关于用struts2框架中iframe对应的jsp页面的不到action的值的问题
关于用struts2框架中iframe对应的jsp页面的不到action的值的问题

我们做web项目经常会用到frameset、frame以及iframe,这大大方便了我们页面的构建以及模块功能的划分。
但是,再使用这些技术的同时也会遇到各种各样的问题,其中一个就是子页面中得不到struts2的action的值。

之前自己在做项目的时候也遇到了这个问题。
在网上查阅了大量的资料,现将自己的总结与结论与大家一起分享。

frameset、frame经实践是没有问题的,如果因为种种原因也出现的话,那么请参考iframe。

现在具体讨论一下iframe的问题:

首先要明确一下出现这个问题的原因,那就是:action的ValueStack、Stack Context能够做到达的范围(我暂时称它为action的作用域,不一定准确,但是便于理解)
只到result跳转到的第一个jsp页面,也就是说当前action的值仅在此jsp页面可以使用,其他的页面是不可以的(其他jsp得到的值是其他action的值)。

要解决iframe的问题,上面句话必须要理解。

下面来看一下iframe的用法:
<iframe src = "***.jsp" />

可以看到,iframe的src恰恰对应的是另外的jsp页面,因此这个jsp页面是无法得到的(如果没有其他的action直接跳转的该jsp页面的话)。

那么怎么解决这个问题呢,
<iframe src = "***.action" />

不是换后缀名,而是让iframe的src指向一个action,action对应的方法完成相应的增删查改操作,最后返回一个页面,那么这个页面就在此iframe中使用了

为便于家理解,下面粘贴一个例子,供大家参考:

mainFrame.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
  </head>
  <body>
<iframe name="A" src = "Blog_list" /><!-- Blog_list:BlogAction.java 的list方法 -->
<iframe name="B" src = "Blog_menu" /><!-- Blog_menu:BlogAction.java 的menu方法 -->
  </body>
</html>


struts.xml

<package name="front" namespace="/" extends="struts-default">     
    <!-- 第一个*代表你用的哪个action,第二*个是你用的哪个方法 -->
       <action name="*_*" class="com.blog.action.{1}Action" method="{2}">
       <result name="menu">/menu.jsp</result>      
           <result name="list">/list.jsp</result>
       </action>
</package>


BlogAction.java

public String menu(){
menus = blogService.getMenu();
return "menu";
}


public String list(){
blogs = blogService.getList();
return "list";
}


menu.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
  </head>
  <body>
<s:iterator value="menus">    
<s:property value="menu">
</s:iterator>
  </body>
</html>


list.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
  </head>
  <body>
<s:iterator value="blogs">    
<s:property value="title">
</s:iterator>
  </body>
</html>

如果弄清楚了就是这样简单,但是对于习惯传统写法的这里有个问题,那就是以前都是同一查询,然后在页面里统一显示

BlogActon.java

public String list(){
menus = blogService.getMenu();
blogs = blogService.getList();
return "success";
}


blog.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTM