176142998

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  116 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

#

window.opener 实际上就是通过window.open打开的窗体的父窗体。

比如在父窗体parentForm里面 通过 window.open("subForm.html"),那么在subform.html中 window.opener

就代表parentForm,可以通过这种方式设置父窗体的值或者调用js方法。

如:1,window.opener.test(); ---调用父窗体中的test()方法

    2,如果window.opener存在,设置parentForm中stockBox的值。

    if (window.opener && !window.opener.closed) {

       window.opener.document.parentForm.stockBox.value = symbol;

}

1>window.opener 的用法

在一般的用法中,只是用来解决关闭窗口时不提示弹出窗口,   而对它更深层的了解一般比较少。其   实   window.opener是指调用window.open方法的窗口。
     在工作中主要是用来解决部分提交的。这种跨页操作对工作是非常有帮助的。
如果你在主窗口打开了一个页面,并且希望主窗口刷新就用这个,打开页面的window.opener就相当于
主窗口的window。
主窗口的刷新你可以用
window.opener.location.reload();
如果你用虚拟的目录:如struts的*.do会提示你重试

你可以改成这样 window.opener.yourformname.submit()
就好了

2〉

在应用中有这样一个情况,
在A窗口中打开B窗口,在B窗口中操作完以后关闭B窗口,同时自动刷新A窗口


function closeWin(){
         hasClosed = true;
         window.opener.location="javascript:reloadPage();";
         window.close();
     }
     function window.onbeforeunload(){
         if(!hasClosed){
             window.opener.location="javascript:reloadPage();";
         }
     }

</script>
上面的代码在关闭B窗口的时候会提示错误,说缺少Object,正确的代码如下:
function closeWin(){
         hasClosed = true;
         window.opener.location="javascript:reloadPage();";
         window.opener=null;
         window.close();
     }
     function window.onbeforeunload(){
         if(!hasClosed){//如果已经执行了closeWin方法,则不执行本方法
             window.opener.location="javascript:reloadPage();";
         }
     }

</script>
reloadPage方法如下:
function reloadPage() {
         history.go(0);
         document.execCommand("refresh")
         document.location = document.location;
         document.location.reload();
     }
PS:由于需要支持正常关闭和强制关闭窗口时能捕捉到事件,用了全局变量hasClosed

==============================================

补充,在父窗口是frame的时候在刷新父窗口的时候会出现问题:

The page cannot be refreshed without resending the information.
后修改如下:
window.opener.parent.document.frames.item('mainFrame').location.href = window.opener.location.href;
不需要执行自带的reload()方法,注意,不要再画蛇添足加上这一句:

window.opener.parent.document.frames.item('mainFrame').location.reload();

========================================================================================
最后,为了同时支持刷新普通父窗口和frame父窗口,代码如下:
function closeWin() {
         hasClosed = true;
     <%if(null != frame){%>
         window.opener.parent.document.frames.item('mainFrame').location.href = window.opener.location.href;
     <%}else{%>
         window.opener.location = "javascript:reloadPage();";
     <%}%>
         //window.opener.top.mainFrame.location="javascript:reloadPage();";
         //self.opener.frames.mainFrame.location.reload(true);
         window.opener = null;
         window.close();
     }
     function window.onbeforeunload(){
         if (!hasClosed) {
         <%if(null != frame){%>
             window.opener.parent.document.frames.item('mainFrame').location.href = window.opener.location.href;
         <%}else{%>
             window.opener.location = "javascript:reloadPage();";
         <%}%>
             window.opener = null;
         }
     }

关于window.opener

window.opener 的用法

    window.opener 返回的是创建当前窗口的那个窗口的引用,比如点击了a.htm上的一个链接而打开了b.htm,然后我们打算在b.htm上输入一个值然后赋予a.htm上的一个id为“name”的textbox中,就可以写为:

    window.opener.document.getElementById("name").value = "输入的数据";

    对于javascrīpt中的window.opener没有很好的理解。

    为什么框架中不能使用,弹出窗口的父窗口不能在框架里面的某个页面呢?那怎样通过弹出窗口操作框架中的父窗口呢?

    opener.parent.frames['frameName'].document.all.input1.value 试试这个:)

正确使用window.open返回对象的opener

 

众所周知JavaScript中:

var win = window.open(url,windowName,...); 的使用,

而win.opener则是指向父窗口的引用

然而,有种情况却比较特别,

假如有两个窗口window1和window2

按下列步骤执行:

var win = window.open(url,windowName,...);// (window1)

var win = window.open(url,windowName,...);//(window2)

其中先后这两次打开的子窗口的windowName一样

此时你会发现在window2中的win.opener却不是指向window2的,却是指向window1.

如果你想在子窗口关闭父窗口的话,就不正确了,因此可以修改上面的执行方法为:

var win = window.open(url,windowName,...);? (window1)

win.opener = window;

var win = window.open(url,windowName,...);? (window2)

win.opener = window;

只有这样修改才OK

 

 

 

通过window.showModalDialog或者.showModelessDialog弹出的页面

这种情况需要两个步骤:
1 在父窗口.showModalDialog或.showModelessDialog方法的第二个参数传递window对象
比如: window.showModelessDialog('a.htm',window);
2 在a.htm中就可以通过window.dialogArguments获取该参数
比如: window.dialogArguments.fun1();
PS:子窗口可以通过设置window.returnValue设置页面返回值

比如: window.returnValue=OK;window.close();

strRtn=window.showModalDialog(......)

这时,strRtn='ok'


页面中实现:
父页面
function reloadPage() {
         document.form1.submit();
     }
弹出页面调用closeWin();
function closeWin(){
         hasClosed = true;
         window.opener.location="javascript:reloadPage();";
         window.opener=null;
         window.close();
     }
posted @ 2008-08-05 16:05 飞飞 阅读(481) | 评论 (1)编辑 收藏

名称 必填 缺省值 类型 描述
emptyOption false false Boolean 是否在题头选项后面添加一个空的(--)选项
headerKey false   Object/String 设置列表的题头主键值. 一定不能为空值! "'-1'"或"''"是正确的取值, ""是错误的取值.
headerValue false   Object/String 列表的题头选项值
multiple false   Object/String 创建一个多选列表. 如果value属性指定了一个数组(正确的元素类型), 那么将预先选中数组中指定的多个选项.
size false   Integer 该组件列表框的大小 (显示元素的个数)
list true   Object/String 创建列表的可迭代数据源. 如果该列表是一个Map(key, value), 那么Map的主键将作为选项(<option>)的"value"属性, 而该主键对应的值作为选项的文本内容.
listKey false   Object/String 列表数据源中元素对象的属性, 用于获取选项的值
listValue false   Object/String 列表数据源中元素对象的属性, 用于获取选项的文本内容
theme false   Object/String 输出元素时使用的主题(theme)(不使用缺省的)
template false   Object/String 输出元素时使用的模板(template)(不使用缺省的)
cssClass false   Object/String 输出元素时的class属性
cssStyle false   Object/String 输出元素时的css样式定义(译者注:就是html元素的style属性)
title false   Object/String 在输出元素时设置html属性title
disabled false   Object/String 在输出元素时设置html属性disabled
label false   Object/String 用于输出一个元素对应的label的表达式
labelPosition false left Object/String 不赞成使用.
labelposition false   Object/String 定义元素标签的位置(top/left)
requiredposition false   Object/String 定义required属性输出的位置(left|right)
name false   Object/String 元素的名字
required false false Boolean 如果设置为true, 在输出标签时将显示出此字段是必须输入的(译者注:如果使用默认模板,将会标示为"*")
tabindex false   Object/String 在输出元素时设置html属性tabindex
value false   Object/String 预设input元素的value属性.
onclick false   Object/String 在输出元素时设置html属性onclick
ondblclick false   Object/String 在输出元素时设置html属性ondblclick
onmousedown false   Object/String 在输出元素时设置html属性onmousedown
onmouseup false   Object/String 在输出元素时设置html属性onmouseup
onmouseover false   Object/String 在输出元素时设置html属性onmouseover
onmousemove false   Object/String 在输出元素时设置html属性onmousemove
onmouseout false   Object/String 在输出元素时设置html属性onmouseout
onfocus false   Object/String 在输出元素时设置html属性onfocus
onblur false   Object/String 在输出元素时设置html属性onblur
onkeypress false   Object/String 在输出元素时设置html属性onkeypress
onkeydown false   Object/String 在输出元素时设置html属性onkeydown
onkeyup false   Object/String 在输出元素时设置html属性onkeyup
onselect false   Object/String 在输出元素时设置html属性onselect
onchange false   Object/String 在输出元素时设置html属性onchange
tooltip false   String 设置元素的tooltip属性(译者注:tooltip为工具栏提示)
tooltipConfig false   String 设置tooltip属性的配置
id false   Object/String id是定位元素时使用的. 对于UI和表单标签它会被用作HTML的id属性
 1<ww:select label="Pets"
 2       name="petIds"
 3       list="petDao.pets"
 4       listKey="id"
 5       listValue="name"
 6       multiple="true"
 7       size="3"
 8       required="true"
 9/>
10
11<ww:select label="Months"
12       name="months"
13       headerKey="-1" headerValue="Select Month"
14       list="#{'01':'Jan', '02':'Feb', []}"
15       value="selectedMonth"
16       required="true"
17/>
18
posted @ 2008-08-04 20:21 飞飞 阅读(351) | 评论 (0)编辑 收藏

Struts2技术学习专题-IT168http://tech.it168.com/zt/struts2/index.html
MLDN struts2专题:http://www.mldn.cn/topic/struts2/struts2.htm
中国IT实验室 : http://java.chinaitlab.com/List_213.html
一个不错的blog: http://www.blogjava.net/max/

http://www.blogjava.net/max/category/16130.html

Java学习http://www.java3z.com/cwbwebhome/type.jsp?type=struts

 

Struts 2 相关文档下载:
struts2.0中文帮助手册.chm

posted @ 2008-08-04 15:17 飞飞 阅读(222) | 评论 (0)编辑 收藏

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
    + request.getServerName() + ":" + request.getServerPort()
    + path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
   <base href="<%=basePath%>">

   <title>Struts 2 标签之s:property的用法</title>

   <meta http-equiv="pragma" content="no-cache">
   <meta http-equiv="cache-control" content="no-cache">
   <meta http-equiv="expires" content="0">
   <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
   <meta http-equiv="description" content="This is my page">
   <!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

</head>

<body>
   <table border="1">
    <tr>
     <th>编号</th>
     <th>书名</th>
     <th>作者</th>
    </tr>
    <s:iterator value="#{'Spring 2.0':'李刚','Java':'张三','j2ee study':'李四'}" id="name" status="st">
     <tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if> >
      <td><s:property value="#st.count"/></td>
      <td><s:property value="key"/></td>
      <td><s:property value="value"/></td>
     </tr>
    </s:iterator>
   </table>
</body>
</html>
效果图:

posted @ 2008-08-04 15:15 飞飞 阅读(306) | 评论 (0)编辑 收藏

1 实现权限控制拦截器
本示例应用要求用户登陆,且必须为指定用户名才可以查看系统中某个视图资源;否则,系统直接转入登陆页面。对于上面的需求,可以在每个Action的执行实际处理逻辑之前,先执行权限检查逻辑,但这种做法不利于代码复用。因为大部分Action里的权限检查代码都大同小异,故将这些权限检查的逻辑放在拦截器中进行将会更加优雅。

检查用户是否登陆,通常都是通过跟踪用户的Session来完成的,通过ActionContext即可访问到Session中的属性,拦截器的intercepte(ActionInvocation invocation)方法的invocation参数可以很轻易地访问到请求相关的ActionContext实例。
权限检查拦截器类的代码如下:
//权限检查拦截器继承AbstractInterceptor类
public class AuthorityInterceptor extends AbstractInterceptor
{
//拦截Action处理的拦截方法
public String intercept(ActionInvocation invocation) throws Exception
{
//取得请求相关的ActionContext实例
ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
//取出名为user的Session属性
String user = (String)session.get("user");
//如果没有登陆,或者登陆所用的用户名不是scott,都返回重新登陆
if (user != null && user.equals("scott") )
{
return invocation.invoke();
}
//没有登陆,将服务器提示设置成一个HttpServletRequest属性
ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统");
//直接返回login的逻辑视图
return Action.LOGIN;
}
}
上面拦截器代码非常简单,先通过ActionInvocation参数取得用户的Session实例的引用,然后从中取出user属性,通过判断该属性值来确定用户是否登陆系统,从而判断是否需要转入登陆页面。

2 配置权限控制拦截器
一旦实现了上面的权限检查拦截器,就可以在所有需要实现权限控制的Action中复用上面的拦截器。
为了使用该拦截器,首先在struts.xml文件中定义该拦截器,定义拦截器的配置片段如下:
<!-- 用户拦截器定义在该元素下 -->
<interceptors>
<!-- 定义了一个名为authority的拦截器 -->
<interceptor name="authority" class="lee.AuthorityInterceptor"/>
</interceptors>
定义了该拦截器之后,可以在Action中应用该拦截器,应用该拦截器的配置片段如下:
<!-- 定义一个名为viewBook的Action,其实现类为ActionSupport -->
<action name="viewBook">
<!-- 返回success视图名时,转入/WEB-INF/jsp/viewBook.jsp页面 -->
<result>/WEB-INF/jsp/viewBook.jsp</result>
<!-- 拦截器一般配置在result元素之后! -->
<interceptor-ref name="defaultStack"/>
<!-- 应用自定义拦截器 -->
<interceptor-ref name="authority"/>
</action>

上面名为viewBook的Action,没有指定class属性,默认使用ActionSupport类,配置该Action时,只是指定了一个Result,指定返回success字符串时,系统将转入/WEB-INF/jsp/viewBook.jsp页面。但并为未配置login视图对应的JSP页面。
考虑到这个拦截器的重复使用,可能在多个Action都需要跳转到login逻辑试图,故将login Result定义成一个全局Result。下面是配置login Result的配置片段:
<!-- 定义全局Result -->
<global-results>
<!-- 当返回login视图名时,转入/login.jsp页面 -->
<result name="login">/login.jsp</result>
</global-results>

经过上面的配置,如果浏览者在浏览器中直接发送viewBook请求,将会转入如图所示的页面。
这种通过拦截器进行权限控制的方式,显然具有更好的代码复用。
如果为了简化struts.xml文件的配置,避免在每个Action中重复配置该拦截器,可以将该拦截器配置成一个默认拦截器栈(这个默认拦截器栈应该包括default-stack拦截器栈和权限检查拦截器)。
定义自己的默认拦截器栈的配置片段如下:
<interceptors>
<!-- 定义权限检查拦截器 -->
<interceptor name="authority" class="lee.AuthorityInterceptor"/>
<!-- 定义一个包含权限检查的拦截器栈 -->
<interceptor-stack name="mydefault">
<!-- 定义拦截器栈包含default-stack拦截器栈 -->
<interceptor-ref name="default-stack"/>
<!-- 定义拦截器栈包含authority拦截器 -->
<interceptor-ref name=" authority"/>
</interceptor- stack >
</interceptors>

一旦定义了上面的mydefault拦截器栈,这个拦截器栈包含了权限检查拦截器和系统默认的拦截器栈。如果将这个拦截器栈定义成默认拦截器,则可以避免在每个Action需要重复定义权限检查拦截器。
下面是定义默认拦截器的配置片段:
<default-interceptor-ref name="mydefault"/>
一旦在某个包下定义了上面的默认拦截器栈,在该包下的所有Action都会自动增加权限检查功能。对于那些不需要使用权限控制的Action,将它们定义在另外的包中——这个包中依然使用系统原来的默认拦截器栈,将不会有权限控制功能。
posted @ 2008-08-04 15:06 飞飞 阅读(1339) | 评论 (1)编辑 收藏

 在struts2中,提供了日期控件,以方便地选择日期和时间,这是通过 标签来实现的。该日期控件是通过DOJO来实现的,会在客户端生成一段JS代码,所以,要让该日期控件生效,需要加入以下代码:   
代码
  1. <s:head theme="ajax" />

    这样,就可以在页面中使用 标签了。如:

代码
<s:datetimepicker name="todayDate" value="2007-8-9" label="Format (yyyy-MM-dd)" displayFormat="yyyy-MM-dd"/>

    在页面中,就会显示出日期控件,其中displayFormat是要显示的日期格式。效果如下所示:

 

posted @ 2008-08-04 14:52 飞飞 阅读(580) | 评论 (0)编辑 收藏

代码:

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
   <title>s:tree的使用</title>
   <s:head theme="ajax"/>
</head>

<body>
<H3>s:tree的使用</H3>
   <s:tree label="计算机图书" theme="ajax" id="book" showGrid="true"
    showRootGrid="true" treeSelectedTopic="tree selected">
    <s:treenode theme="ajax" label="李刚" id="ligang">
     <s:treenode theme="ajax" label="Jsp study" id="jsp"></s:treenode>
     <s:treenode theme="ajax" label="java study" id="java"></s:treenode>
     <s:treenode theme="ajax" label="php study" id="php"></s:treenode>
    </s:treenode>
    <s:treenode theme="ajax" label="张三" id="zhangsan">
     <s:treenode theme="ajax" label="test study" id="test1"></s:treenode>
     <s:treenode theme="ajax" label="test study" id="test2"></s:treenode>
     <s:treenode theme="ajax" label="test study" id="test3"></s:treenode>
    </s:treenode>
    <s:treenode theme="ajax" label="李四" id="lisi">
     <s:treenode theme="ajax" label="Jsp study" id="test4"></s:treenode>
     <s:treenode theme="ajax" label="java study" id="test5"></s:treenode>
     <s:treenode theme="ajax" label="php study" id="test6"></s:treenode>
    </s:treenode>
   </s:tree>

</body>
</html>

posted @ 2008-08-04 14:47 飞飞 阅读(310) | 评论 (0)编辑 收藏

     摘要: 一: 首先是在自动生成的DAO里面加上如下代码  public List findAll()...{                  String sql="FROM Au...  阅读全文
posted @ 2008-08-04 14:22 飞飞 阅读(1269) | 评论 (0)编辑 收藏

     摘要: Struts2提供了大量丰富的标签供使用,它不再像Struts1中一样,将种类标签进行分门列别,但可以根据其使用的用途用以区别。本文通过对Struts2中数据标签的学习,来对Struts2中标签的学习起到一个抛砖引玉的作用。文中将介绍Action标签、Bean标签、Data标签、Include标签、Param标签、Set标签、Text标签、Property标签等标签。 一、<s:actio...  阅读全文
posted @ 2008-08-04 10:58 飞飞 阅读(364) | 评论 (1)编辑 收藏

1、sturts2的标签很丰富。用起来也很方便,但是它的样式不太好,最好能够自定义一套样式!若不想用sturts2
   缺省的样式,就使用theme="simple"。
   sturts2中的有些标签,是用js框架写的,需要加载这些框架(如:dojo)。在jsp页面中使用<s:head/>加载这些框架和css!
  
 2、sturts2中的国际化,又其拦截器完成。拦截器会根据用户浏览器设置的不同来,自动适配!只需要定义多个资源文件
   就可以!
   资源文件可以是全局的(在classes中),也可以是局部的(在各个特定的包中)!
   对资源文件的要求:
     要注意资源文件的命名规范!例如:package_en_US.properties和package_zh_CN.properties
     
   I、两种实现国际化的方法,key和lable方式!
     例如:
      a、<s:textfield label="%{getText('username')}" name="username"/>
      b、<s:textfield key="username" name="username"/>
    
    II、单个的资源信息提取的两种方式:
     例如:
      a、<s:property value="getText('main.message')"/>
      b、<s:text name="main.message"/>
     
   III、在s:datetimepicker标签中可以使用,key和label两种方式来进行国际化
          key="date"
          label="%{getText('date')}"
          这个日期标签,在中文环境和英文环境下的显示形式是不一样的
          中文:2007-11-12
          英文:11/14/2007
          所以在进行日期处理的时候要小心
     
 3、对于分步表单提交和“后退”网页过期的问题有待继续研究!
   对于表单重复提交的问题可以使用<s:token/>来解决!
   在使用token时,需要配置拦截器,而且在Action中需要定一个常量!
   例如:
     页面:<s:token/>
     xml: <interceptor-ref name="defaultStack" />
              <interceptor-ref name="token" />
     Action:private static final long serialVersionUID = 6820659617470261780L;
  
 4、个人感觉struts2的Validation(验证框架)不是很好,效率也不高,而且需要定义比较复杂的XXXAction-validation.xml文件.
     所以对于页面上的限制还是使用js或js框架(如:jquery,dojo,portaltype)!
     
 5、<s:submit key="back" name="redirect-action:crud!list" />这种实现方式比较好!
   <s:submit key="back" onclick="#:history.back();" />
   这种实现方式不好,因为它会自动刷新页面;当有添加,删除,更新操作时,就重复的刷新页面!不推荐使用!
  
 6、<s:select label="%{getText('user.from')}"  
     name="user.from"
     headerKey=""
     headerValue="Select From"
     list="fromArray"
     listKey="id"
     listValue="name"
     value="user.from"
     required="true" />
     <%--
        name="user.from"是用于通过struts2内在的机制给Action自动赋值
        list="fromArray"是一个封装了bean的list,其中的bean 有id和name属性
        listKey="id"
        listValue="name"
        那么,当用户提交表单的时候,sturts2的内在机制,会自动为我们装载的!
        需要我们在Action里定义一个user bean,其中user中有一个from属性
        要是嵌套定义,如:user bean 中又定义了一个bean(DateBean)。那么在页面就要使用user.date.year这种形式,来向Action传值!
        其中,date是user bean 中的一个属性,struts2会自动为你装载!
     --%>
posted @ 2008-08-04 09:38 飞飞 阅读(653) | 评论 (0)编辑 收藏

仅列出标题
共12页: First 上一页 2 3 4 5 6 7 8 9 10 下一页 Last