我们做web项目经常会用到frameset、frame以及iframe,这大大方便了我们页面的构建以及模块功能的划分。但是,再使用这些技术的同时也会遇到各种各样的问题,其中一个就是子页面中得不到struts2的action的值。之前自己在做项目的时候也遇到了这个问题。在网上查阅了大量的资料,现将自己的总结与结论与大家一起分享。
frameset、frame经实践是没有问题的,如果因为种种原因也出现的话,那么请参考iframe。
现在具体讨论一下iframe的问题:
首先要明确一下出现这个问题的原因,那就是:action的ValueStack、StackContext能够做到达的范围(我暂时称它为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.01Transitional//EN">
<html>
<iframe name="A" src = "Blog_list"/><!-- Blog_list:BlogAction.java的list方法 -->
<iframe name="B" src = "Blog_menu"/><!-- Blog_menu:BlogAction.java的menu方法 -->
</html>
struts.xml
<package name="front" namespace="/"extends="struts-default">
</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.01Transitional//EN">
<html>
<s:iterator value="menus">
<s:property value="menu">
</s:iterator>
</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.01Transitional//EN">
<html>
<s:iterator value="blogs">
<s:property value="title">
</s:iterator>
</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 HTML 4.01Transitional//EN">
<html>
<s:iterator value="menus">
<s:property value="menu">
</s:iterator>
<s:iterator value="blogs">
<s:property value="title">
</s:iterator>
</html>
但现在却是:由大化小,由繁化简,朝着一个action的方法解决一个功能方向前进,但是这也正是我们需要的。
鉴于本人技术有限只能分析到此,如有什么问题希望大家指正。
转载地址:http://blog.sina.com.cn/s/blog_4f8d3e340100v3xc.html
转载地址:http://blog.sina.com.cn/s/blog_4f8d3e340100v3xc.html