随笔-34  评论-1965  文章-0  trackbacks-0

很久没有更新BLOG了,前一段时间公司的项目比较忙,另外我还和一位出版社的朋友谈写书的事情,所以一直没有时间,完成《Struts 2与AJAX》。后来写书的事情吹了,趁今天有点空闲就把它完成。

在大家看这部分文章之前,我想对于写书的事情说两句,或者应该叫发牢骚才对。通过这次写书失败的经历,我明白为什么国内的IT书籍多数是滥于充数、粗制滥造、缺乏经典。其实说白了就是一个“钱”字作怪。为了市场,很多编辑可能会“建议”你去“抄考”一些国内相对畅销的同类书籍,例如写Struts就一定要按所谓的MVC进行目录分类,美其名曰“容易入门”。我认为“MVC”的概念虽然重要,但对初学者而言,需要对编程有一定的了解才容易明白此概念。另外,为了“实用”,不惜使用相同的技术重复编写不同的范例。可能是我不太了解读者的心理吧。

言归正传,在上两部分的《Struts 2与AJAX》中我介绍了Struts 2与DOJO结合实现AJAX的知识,本文将介绍在Struts 2中使用DWR实现AJAX表单校验。

什么是DWR

DWR(Direct Web Remoting)是在Java EE中较流行的AJAX框架,它的最大优势就是可以像使用本地的Javascript函数一样,调用服务器上的Java方法。如下图所示:

DWR工作原理
图1 DWR工作原理

其实DWR原理也不复杂,它先在web.xml中配置一个Servlet,映射到特定的路径(通常是%CONTEXT_PATH%/dwr/*)。这个Servlet的作用就是初始化要暴露给Javascript调用的Java类(通过dwr.xml进行配置),并生成相应的代理的Javascript类代码。在XHR请求到来的时候,Servlet负责将请求的参数变成对应的Java对象,并以其为参数调用目标Java方法,并将返回值转化为Javascript代码。详情请参考:http://getahead.ltd.uk/dwr/

Struts 2与DWR

在Struts 2.0.x中使用DWR实现AJAX表单校验。在大家掌握了DWR的原理后,下面我想详细介绍一下实现的步骤。

首先,到以下站点https://dwr.dev.java.net/files/documents/2427/47455/dwr.jar下载DWR的1.1.4版本的JAR包。需要注意的是,DWR虽然已经发布2.0版本,但它与1.1.4有很大的区别,所以请大家不要使用2.0版本,否则会出现异常的;

接着,新建WEB工程,将下图所示的JAR包加入到工程的“Build Path”中;

依赖的JAR包
图2 依赖的JAR包

接下来,配置web.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
    xmlns
="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

   
<display-name>Struts 2 AJAX Part 3</display-name>

   
<filter>
       
<filter-name>struts-cleanup</filter-name>
       
<filter-class>
            org.apache.struts2.dispatcher.ActionContextCleanUp
       
</filter-class>
   
</filter>

   
<filter-mapping>
       
<filter-name>struts-cleanup</filter-name>
       
<url-pattern>/*</url-pattern>
   
</filter-mapping>

   
<filter>
       
<filter-name>struts2</filter-name>
       
<filter-class>
            org.apache.struts2.dispatcher.FilterDispatcher
       
</filter-class>
   
</filter>

   
<filter-mapping>
       
<filter-name>struts2</filter-name>
       
<url-pattern>/*</url-pattern>
   
</filter-mapping>
   
<!-- 开始DWR配置 -->
   
<servlet>
       
<servlet-name>dwr</servlet-name>
       
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
       
<init-param>
           
<param-name>debug</param-name>
           
<param-value>true</param-value>
       
</init-param>
   
</servlet>

   
<servlet-mapping>
       
<servlet-name>dwr</servlet-name>
       
<url-pattern>/dwr/*</url-pattern>
   
</servlet-mapping>
   
<!-- 结束DWR配置 -->
   
<welcome-file-list>
       
<welcome-file>index.html</welcome-file>
   
</welcome-file-list>

</web-app>
清单1 WebContent/WEB-INF/web.xml

然后是DWR的配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<!-- START SNIPPET: dwr -->
<!DOCTYPE dwr PUBLIC 
    "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" 
    "http://www.getahead.ltd.uk/dwr/dwr10.dtd"
>

<dwr>
   
<allow>
       
<create creator="new" javascript="validator">
           
<param name="class" value="org.apache.struts2.validators.DWRValidator"/>
       
</create>
       
<convert converter="bean" match="com.opensymphony.xwork2.ValidationAwareSupport"/>
   
</allow>

   
<signatures>
       
<![CDATA[
        import java.util.Map;
        import org.apache.struts2.validators.DWRValidator;

        DWRValidator.doPost(String, String, Map<String, String>);
       
]]>
   
</signatures>
</dwr>
<!-- END SNIPPET: dwr -->
清单2 WebContent/WEB-INF/dwr.xml

通过以上配置,我们可以将DWRValidator中的方法暴露为Javascript可以调用的远程接口。

在正确完成以上步骤之后,我们发布运行一下应用程序,在浏览器地址栏中输入http://localhost:8080/Struts2_Ajax3/dwr/,应该会出现如下页面:

DWR Servlet默认输出页面
图3 DWR Servlet默认输出页面

 接下来,我们要开始编写Action类了,代码如下:

package tutorial;

import com.opensymphony.xwork2.ActionSupport;

public class AjaxValidation extends ActionSupport {
   
private static final long serialVersionUID = -7901311649275887920L;

   
private String name;
   
private String password;
   
private int age;
   
   
public int getAge() {
       
return age;
   }

   
   
public void setAge(int age) {
       
this.age = age;
   }

   
   
public String getName() {
       
return name;
   }

   
   
public void setName(String name) {
       
this.name = name;
   }

   
   
public String getPassword() {
       
return password;
   }

   
   
public void setPassword(String password) {
       
this.password = password;
   }

   
   @Override
   
public String execute() {        
       
return SUCCESS;
   }

}
清单3 src/tutorial/AjaxValidation.java

上述代码一目了然,相信大家已经很熟悉了。下面,我们再来看看表单校验的配置代码:

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
   
<validator type="regex">
       
<param name="fieldName">password</param>
       
<param name="expression">
           
<![CDATA[(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$]]>
       
</param>
       
<message>Password must be between 8 and 10 characters, contain at least one digit and one alphabetic character, and must not contain special characters</message>
   
</validator>    
   
<field name="name">
       
<field-validator type="requiredstring">
           
<message>You must enter a name</message>
       
</field-validator>
   
</field>
   
<field name="age">
       
<field-validator type="int">
           
<param name="min">18</param>
           
<param name="max">127</param>
           
<message>Age must be between 18 and 127</message>
       
</field-validator>
   
</field>
</validators>
清单4 src/tutorial/AjaxValidation-validation.xml

对于AjaxValidation类的name、password和age三个字段,我分别用了非空、正规表达式和范围验证。正规表达式(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$的作用是保证密码由至少包括一个数字和一个字母,且不能含有符号的长度为8到10的字符串组成。它也是所谓强密码(Strong Password)的普通实现。

接下来的是JSP的代码,内容如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding
="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   
<head>
       
<title>Struts 2 AJAX - Validation</title>
       
<s:head theme="ajax" />
   
</head>
   
<body>
       
<h2>
            AJAX Validation Using DWR
       
</h2>
       
<s:form method="post" validate="true" theme="ajax">
           
<s:textfield label="Name" name="name" />
           
<s:password label="Password" name="password" />
           
<s:textfield label="Age" name="age" />
           
<s:submit />
       
</s:form>
   
</body>
</html>
清单5 WebContent/AjaxValidation.jsp

以上代码也不复杂,不过需要的是注意的是除了要加入<s:head theme="ajax" />外,<s:form />也必须加入validate="true" theme="ajax"的属性。

最后是Struts 2的配置文件,内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>

<struts>
   
<package name="Struts2_AJAX_DEMO" extends="struts-default">
       
<action name="AjaxValidation" class="tutorial.AjaxValidation">
           
<result name="input">AjaxValidation.jsp</result>
           
<result>AjaxValidation.jsp</result>
       
</action>
   
</package>
</struts>
清单6 src/struts.xml

最后发布运应用程序,在浏览器地址栏中输入http://localhost:8080/Struts2_Ajax3/AjaxValidation!input.action出现如下图所示页面:

AjaxValidation页面输出
图4 AjaxValidation页面输出

在文本框中输入错误的值使页面出现错误提示信息,如下图所示:

AjaxValidation页面错误提示
图5 AjaxValidation页面错误提示

可能有朋友会问怎么知道这是通过AJAX进行校验的呢?在这里我向大家推荐一个AJAX开发必备的工具——Firebug。Firebug是Firefox的一个功能强大的插件,它可以准确地输出和定位Javascript的错误、通过直观的方式查看HTML文档的DOM及其样式、所见即所得的编辑方式,更值得一赞的是它可以方便地对Javascript进行跟踪和调试,如果你希望这进一步了解这个工具,请安装Firefox 2.0以上版本,并使用它浏览以下网址http://www.getfirebug.com

在安装完成Firebug之后,在Firefox中打开http://localhost:8080/Struts2_Ajax3/AjaxValidation!input.action,按“F12”键找开Firebug窗口,如果你第一次使用Firebug,请点击其窗口中的链接“Enable Firebug”激活插件。之后,点击“Net”,并在出现的菜单中点击选中“XHR”。然后将光标移入文本框,再将光标移出使文本框失去焦点,你可以看到Firebug窗口会多出一项记录,如下图所示:

Firebug中查看XHR请求
图6 Firebug中查看XHR请求

这就证明你在文本框失去焦出时,Struts 2会发送XHR请求到服务器以对该文本框值进行校验。有兴趣的朋友可以通过Firebug,研究XHR的请求与响应,这样可以加深对DWR工作原理的理解。

何时使用AJAX表单校验

虽然在Struts 2实现AJAX表单校验是一件非常简单的事,但我建议大家不要在所有的场合都使用这个功能,原因可以分为以下几个方面:

  1. AJAX校验在服务器上进行数据校验,可能会比较耗时;
  2. AJAX校验可能会过于频繁,加重服务器的负载;
  3. 一些普通的校验,只需要使用纯Javascript便可以实现。

读到这里,有的朋友可能会问:“那么什么时候才应该使用AJAX表单校验呢?”答案其实很简单,当我们的校验在页面加载时还不能够确定的情况下,就应该使用这个功能。例如,注册用户时,校验用户名是否已经存在;或者校验涉及过多的页务逻辑等。

现在让我们来改造一下上述例子,对于name我们可以使用AJAX校验,但对于其它的字段应该使用纯Javascript的校验。

在tutorial.AjaxValidation类加入如下方法:

   @Override
   
public void validate() {
       Set
<String> users = new HashSet<String>();
       users.add(
"max");
       users.add(
"scott");
       
if(users.contains(name)) {
           addFieldError(
"name", "The user name has been used!");
       }

   }
清单7 src/tutorial/AjaxValidation.java代码片段

用于模拟用户注册的场境,当然在真实情况应该在数据库中检查用户是否存在。

接下来再修改JSP文件,将<s:form />里面的内容改为如下所示代码:

        <s:form method="post" validate="true" theme="ajax_xhtml">
           
<s:textfield label="Name" name="name" theme="ajax" />
           
<s:password label="Password" name="password" theme="xhtml" />
           
<s:textfield label="Age" name="age" theme="xhtml" />
           
<s:submit theme="xhtml" />
       
</s:form>
清单8 WebContent/AjaxValidation.jsp代码片段

对比早前的JSP代码,大家可以看出我将<s:form />的theme改成了“ajax_xhtml”,这个theme不是Struts 2自带,需要自定义。另外,除了Name使用了ajax的theme之外,其它的表单标签的theme都为xhtml,如此一来便可以实现只有当Name文本框失去焦点时才发生AJAX表单校验。

接下来,应该是我们的自定义ajax_xhtml的theme了。在源代码文件夹下新建包“template.ajax_xhtml”,然后在其中加入form.ftl和form-close.ftl文件,内容分别如下:

<#if parameters.validate?exists>
<script type="text/javascript" src="${base}/struts/validationClient.js"></script>
<script type="text/javascript" src="${base}/dwr/interface/validator.js"></script>
<script type="text/javascript" src="${base}/dwr/engine.js"></script>
<script type="text/javascript" src="${base}/struts/ajax/validation.js"></script>
</#if>
<#include "/${parameters.templateDir}/xhtml/form-validate.ftl" />
<#include "/${parameters.templateDir}/simple/form.ftl" />
<#include "/${parameters.templateDir}/xhtml/control.ftl" />
清单9 src/template/ajax_xhtml/form.ftl

上述的文件与xhtml theme中的form.ftl文件相似,我只是加入了AJAX表单校验所用的Javascript库,以便theme为ajax的表单标签使用。

<#include "/${parameters.templateDir}/xhtml/control-close.ftl" />
<#include "/${parameters.templateDir}/simple/form-close.ftl" />
<#include "/${parameters.templateDir}/xhtml/form-close-validate.ftl" />
清单10 src/template/ajax_xhtml/form-close.ftl

这个文件与xhtml theme中的form-close.ftl文件相同。

最后发布运行应用程序,大家可以发现在Password与Age的校验,只有在表单提交时才发生,而且是纯Javascript的校验。不过,以上代码还不是很完善,在行为上有些BUG。

总结

Struts 2相比一些其它的框架,在实现AJAX方面的确简单很多。更激动人心的是Struts 2的标签库支持基于模板的输出,使得开发者可以跟据自身的需要方便地改变标签的行为。

在将要发布的Struts 2.1版本中,AJAX表单校验将不再使用DWR,统一使用DOJO实现,详情请参考:http://struts.apache.org/2.0.9/docs/ajax-validation.html

posted on 2007-08-16 18:33 Max 阅读(34046) 评论(76)  编辑  收藏 所属分类: Struts 2.0系列

评论:
# re: Struts 2与AJAX(第三部分) 2007-08-16 19:46 | wsc
Good!, Thanks for your share  回复  更多评论
  
# re: Struts 2与AJAX(第三部分)[未登录] 2007-08-16 20:07 | 狒狒
很好啊,看着你的文章做了一个小项目 呵呵 谢了  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-17 09:17 | fengyuan
等得花儿都谢了!~  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-17 15:24 | liy
好像DWR组件不是很稳定吧,有时会出现错误,不知道MAX大哥怎么看待这个问题  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-17 19:52 | SSong
谢谢你这个系列的教程了  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-18 00:59 | plantegg
楼主越来越专业,期待你的新文章好久了:)  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-18 01:01 | plantegg
狗日的出书赚不了多少钱的(如果你花了很多精力去写的话),印刷量又不大,Max看开了是好事啊,随随便便高点外快容易多了  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-21 22:24 | cuiy
好,觉得你不错!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-22 13:51 | cleaner
楼主,你真的很棒。
就是最近一次有些慢了,害我每天都来看一看。  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-22 22:52 | Max
@liy
DWR的确给我们的AJAX开发带来了很大的方便,不过如果需要开发一些比较大型的AJAX应用,最好也其它Javascript框架一起使用,如Prototype.js等。

@plantegg
写书的话,可以更详尽一点。不过,尽管不是写书,我也最我的努力写这个BLOG的。

@cleaner
对不起,最近比较忙;所以更新慢了下来。  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-23 16:57 | 牧码人
楼主,我强烈支持你的义举,当然我也是受益者,顶!!!!!!!!!!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-27 14:31 | pxcong
当验证成功后,怎样实现跳转的呢? 能帮我讲讲吗?  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-08-31 15:19 | mark
Max 公布一个银行帐号吧!咱们不但在精神支持你,而且也要在经济上支持你!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-01 20:46 | welmen
Thank you ,I'm just running for a project.you have done me a great favour!!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-04 10:19 | Jarwang
请问?????????max


<s:iterator />
如何排序????
例:
<s:iterator value="Orders"/>
<s:propety value="orderName"/>
<s:property value="orderPrices" />
</s:iterator>

在java类中用preparedStatement查询数据库
例:select orderName,orderPrices from Orders order by orderName
然后,写入order类中.

最后,给页面调用.

可问题是:::::::::::记录没有排序.....尽管用了 order by orderName?????

tks!!!!!!!!!!!!!!!!!!!!!!!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-05 00:06 | Max
@mark
谢谢您的支持。不过,我写这个BLOG的目的不是为了钱。而且我觉得真正值得经济支持的是Struts 2的项目的开发者,他们才是真正的英雄!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-05 00:38 | Max
# re: Struts 2与AJAX(第三部分) 2007-09-05 10:46 | jiew
@wsc
很感谢你这一系列教程 ,我刚看完,收获很多 。谢了
我会继续关注你的BLOG的。  回复  更多评论
  
# 问一个Struts2配置的问题 2007-09-06 21:26 | CG
一 我的JSP的form.action,strute2Test 是工程的名称
form1.action="/strute2Test/login!sendMes.do"

二 web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>com.test</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

三 我的Action
package com.test;
public class LoginAction extends ActionSupport {
public String sendMes()
{
return "";
}
}

我提交的时候,总是映射不到sendMes这个方法.错误:
The requested resource (/strute2Test/com.test/login!sendMes.do) is not available.

请问是怎么回事啊?  回复  更多评论
  
# json plugin[未登录] 2007-09-12 17:35 | Daniel
Struts 2 JSON Plugin
JSON Plugin
这两个插件有什么区别呀?有没有JSON Plugin 的参考文档或api呀在哪里呢?
谢谢max大哥哥这么多好的文  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-13 00:17 | Max
@Daniel
应该是一样的东西,
至于文档,请参考:http://cwiki.apache.org/S2PLUGINS/json-plugin.html  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-17 11:43 | javaEgg
更激动人心的是Struts 2的标签库支持基于模板的输出,使得开发者可以跟据自身的需要方便地改变标签的行为。

希望楼主下一期,就这个主题写篇blog。
期待中。。。  回复  更多评论
  
# re: Struts 2与AJAX(第三部分)[未登录] 2007-09-18 13:19 | yingjie
max兄,看了你的文章十分收益,有个问题想请教一下,就是把struts1.2的项目改成struts2.0,请问要注意哪些方面啊?还有就是action要怎么写合适,没有了ActionForm那么数据存放到action中要怎么存啊?总之就是有很多的问题要请教你,希望你能教我,我的邮箱是yingjie853@163.com,MSN:yingjie_853@hotmail.com
QQ:278537061  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-19 21:03 | tan
我想用ajax theme,但想用自己的CSS布局,可不可以???  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-20 15:53 | moonboat
先粗略的看了一下,接下来慢慢学习!多谢楼主无私奉献!
普及struts2的人和开发struts2的人一样伟大!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-22 10:11 | sofee
连接mysql出错 无数据库操作时正常 max帮帮忙 谢谢了

严重: Servlet.service() for servlet default threw exception
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at   回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-22 10:11 | sofee
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:167)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-22 10:11 | sofee
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:121)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:504)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.ExceptionInInitializerError
at com.stt.dao.Connections.getConn(Connections.java:10)
at com.stt.dao.Products.<init>(Products.java:21)
at com.stt.action.Login.execute(Login.java:33)
... 114 more
Caused by: java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:365)
at java.util.Properties.load(Properties.java:293)
at com.stt.dao.DBConn.<clinit>(DBConn.java:13)
... 117 more  回复  更多评论
  
# re: Struts 2与AJAX(第三部分)[未登录] 2007-09-25 14:07 | 冰点
Hi max,你的文章写的很好,我的struts2的学习很大以部分拜你所赐,但是最近怎么不见你写关于struts2的文章了。我觉得你可以写一点关于struts2的anntation配置吧,呵呵。但是个人觉得struts2自己带的anntation配置用起来确实非常牵强,还需要你们这些牛人自己实现一个anntation啊  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-09-28 17:20 | xianglg
同意冰点的,写一篇关于struts2零配置的文章吧  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-10-01 18:12 | wuyundong
我的邮箱wuyundong3000@163.com
你写的太好了啊  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-10-09 16:11 | workman
一口气看完了您写的内容,非常感谢!(*^_^*)  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-10-24 09:50 | 信鸽
真好。  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-10-30 14:22 | claymore
谢谢你这么无私的贡献!!!!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分)[未登录] 2007-11-12 09:51 | wind
@冰点
你想过annotation的好处吗?
如果你想过了,那就当我什么都没说.如果你没想过,而是在盲目的追求,那么我建议你冷静下来好好的思考一下.annotation带来了什么好处,我们为什么要使用annotation.  回复  更多评论
  
# re: Struts 2与AJAX(第三部分)[未登录] 2007-11-12 09:56 | wind
所谓零配置,根本就是个很SB的事情.

为什么按上"零配置" 这么个很煽的名字?

而事实上零配置就是说没有配置,没有配置就是硬编码.就是没有灵活性,扩展性.

就像写annotation一样.当初把一些信息拿出来放到xml里,是一种可配置的做法,是一种进步.现在某些人盲目的提出一些倒退的观点,居然也有很多盲目的人去追随.我只是觉得很可悲.

sun推出annotation特性,初衷是什么我说不好,但我就知道不是这么用的.annotation算什么?算配置还是算硬编码?要改annotation就需要有java源文件,需要重新编译,对么?

xml有什么不好?xml地狱当然不好,xml过于冗长当然不好,但是解决的方法是不用xml了,回到从前,继续硬编码就好了吗?
这次炒菜有点咸了,那么以后就再也不用食盐了,对吗?  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-11-17 17:07 | 超级歼
获益匪浅,支持!  回复  更多评论
  
# re: Struts 2有没有类似struts1的MappingDispatcherAction的东东 2007-12-20 13:06 | Michael-Hu
请问Max:在Struts 2中有没有类似struts1的MappingDispatcherAction的东东  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-12-24 11:04 | study
会出现异常的----我确实出现了nullpointerexecption
不知道楼主知道具体原因么?谢谢  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2007-12-24 11:05 | study
忘了说,是使用dwr2.0出现验证表单时出现nullpointer的  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-01-02 11:38 | javer
好,慢慢研究.  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-01-04 21:49 | 55
55  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-01-17 15:06 | 无名小卒
请问楼主:struts2的日期控件怎么使用?我想在页面上判断输入是否正确,还有就是通过js给它赋值怎么办啊?我始终得不到这个日期控制这个对象?  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-01-23 13:23 | llddy
看完兄弟的帖子,我的心情竟是久久不能平复,正如老子所云:大音希声,大象希形。我现在终于明白我缺乏的是什么了,正是兄弟那种对真理的执着追求和兄弟那种对理想的艰苦实践所产生的厚重感。面对兄弟的帖子,我震惊得几乎不能动弹了,兄弟那种裂纸欲出的大手笔,竟使我忍不住一次次的翻开兄弟的帖子,每看一次,赞赏之情就激长数分,我总在想,是否有神灵活在它灵秀的外表下,以至能使人三月不知肉味,使人有余音穿梁,三日不绝的感受。楼主,你写得实在是太好了。我唯一能做的,就只有把这个帖子顶上去这件事了。兄弟的帖子实在是写得太好了。文笔流畅,修辞得体,深得魏晋诸朝遗风,更将唐风宋骨发扬得入木三分,能在有生之年看见兄弟的这个帖子。实在是我三生之幸啊。看完兄弟的这个帖子之后,我竟感发生出一种无以名之的悲痛感――啊,这么好的帖子,如果将来我再也看不到了,那我该怎么办?那我该怎么办?直到我毫不犹豫的把兄弟的这个帖子收藏了。我内心的那种激动才逐渐平复下来。可是我立刻想到,这么好的帖子,倘若别人看不到,那么不是浪费兄弟的心血吗?经过痛苦的思想斗争,我终于下定决心,我要把这个帖子一直往上顶,往上顶!顶到所有人都看到为止遇到你之前,我对人世间是否有真正的圣人是怀疑的;而现在,我终于相信了!我曾经忘情于汉廷的歌赋,我曾经惊讶于李杜的诗才,我曾经流连于宋元的词曲;但现在,我才知道我有多么浅薄!兄弟你的高尚情操太让人感动了。在现在这样一个物欲横流的金钱社会里,竟然还能见到兄弟这样的性情中人,无疑是我这辈子最大的幸运。让我深深感受到了人性的伟大。兄弟的帖子,就好比黑暗中刺裂夜空的闪电,又好比撕开乌云的阳光,一瞬间就让我如饮甘露,让我明白了永恒的真理在这个世界上是真实存在着的。只有兄弟这样具备广阔胸怀和完整知识体系的人,才能作为这真理的唯一引言者。看了兄弟的帖子,让我陷入了严肃的思考中,我认为,如果不把兄弟的帖子顶上去,就是对真理的一种背叛,就是对谬论的极大妥协。因此,我决定义无返顾的顶了说的好啊!我在这个论坛打滚这么多年,所谓阅人无数,就算没有见过猪走路,也总明白猪肉是啥味道的。一看到兄弟的气势,我就觉得兄弟同在论坛里灌水的那帮小混蛋有着本质的差别,那忧郁的语调,那熟悉的签名,还有字里行间高屋建瓴的辞藻。没用的,兄弟,就算你怎么换马甲都是没有用的,你的亿万拥戴者早已经把你认出来了,你一定就是传说中的最强ID。自从论坛改版之后,我就已经心灰意冷,对论坛也没抱什么希望了,传说已经幻灭,神话已经终结,留在论坛还有什么意思。没想到,没想到,今天可以再睹兄弟的风范,我激动得忍不住就在屏幕前流下了眼泪。是啊,只要在兄弟的带领下,论坛就有希望了。我的内心再一次沸腾了,我胸腔里的血再一次燃烧了。兄弟的几句话虽然简单,却概括扼要,一语道出了我们苦想多年的而不可得答案的几个重大问题的根本。兄弟就好比论坛的明灯,兄弟就好比论坛的方向,兄弟就好比论坛的栋梁。有兄弟在,论坛的明天必将更好!大师的话真如“大音希声扫阴翳”,犹如”拨开云雾见青天”,使我等网民看到了希望,看到了未来!晴天霹雳,醍醐灌顶或许不足以形容大师文章的万一;巫山行云,长江流水更难以比拟大师的文才!黄钟大吕,振聋发聩!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾,龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔,写天下文章的智慧神态;仿佛看见了你按剑四顾,江山无数的英武气概将这帖逐句地看完这个帖子以后,我的心久久不能平静,震撼啊!为什么会有如此好的帖子!我纵横网络bbs多年,自以为再也不会有任何帖子能打动我,没想到今天看到了如此精妙绝伦的这样一篇帖子。兄弟,是你让我深深地理解了‘人外有人,天外有天’这句话。谢谢侬!在看完这帖子以后,我没有立即回复,因为我生怕我庸俗不堪的回复会玷污了这网上少有的帖子。但是我还是回复了,因为觉得如果不能在如此精彩的帖子后面留下自己的网名,那我死也不会瞑目的!能够在如此精彩的帖子后面留下自己的网名是多么骄傲的一件事啊!兄弟,请原谅我的自私!我知道无论用多么华丽的辞藻来形容兄弟您帖子的精彩程度都是不够的,都是虚伪的,所以我只想说一句:您的帖子太好看了!我愿意一辈子的看下去!这篇帖子构思新颖,题材独具匠心,段落清晰,情节诡异,跌宕起伏,主线分明,引人入胜,平淡中显示出不凡的文学功底,可谓是字字珠玑,句句经典,是我辈应当学习之典范。就小说艺术的角度而言,这篇帖子不算太成功,但它的实验意义却远远大于成功本身。正所谓:“一马奔腾,射雕引弓,天地都在我心中!”兄弟真不愧为无厘界新一代的开山怪!本来我已经对这个论坛失望了,觉得这个论坛没有前途了,心里充满了悲哀。但是看了你的这个帖子,又让我对论坛产生了希望。是你让我的心里重新燃起希望之火,是你让我的心死灰复燃,是你拯救了我一颗拨凉拨凉的心!本来我决定不会在论坛回任何帖子了,但是看了你的帖子,我告诉自己这个帖子是一定要回的!这是百年难得一见的好贴啊!苍天有眼啊,让我在优生之年得以观得如此精彩绝伦的帖子!兄弟,你要继续努力啊!你是论坛的希望啊......  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-02-18 14:15 |
当我使用ajax客户端验证时,验证能正常运行,可是当输入的数据都合法后,点击“提交”时,页面一点反应都没有,但查看数据库发现数据已经保存了。仅仅是页面不跳转。
请问该怎么解决呢  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-03-07 11:06 | zhazha
希望你还是能够出书,能看出你写BLOG的用心,
所以你如果出书的话,也一定会用心的,写的书应该很有价值,
不会像市面上一些垃圾书,都是抄来抄去,一点价值也没有~
你出书我第一个支持~~·  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-03-07 21:46 | wow gold
<a href=http://www.wowgolds.co.uk>wow gold</a> 非常实用啊  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-03-18 16:46 | lion
@宋
<result name="input">AjaxValidation.jsp</result>
<result>AjaxValidation.jsp</result>

你可以试试把struts.xml中的<result>AjaxValidation.jsp</result>
这句去掉  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-04-11 16:25 | lyz
写的是非常好!先用了!呵呵,谢谢  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-04-11 23:52 | ipinko@126.com
谢谢作者
我照着做了1个,但是页面打开的时候报错了,然后可以象AJAX那样验证,但是action没有反应.
报错:
2008-4-11 23:49:50 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Logging using commons-logging.
2008-4-11 23:49:50 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: retrieved system configuration file: java.io.ByteArrayInputStream@12b644e
2008-4-11 23:49:51 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Creator 'pageflow' not loaded due to ClassNotFoundException. This is only an problem if you wanted to use it. Cause: Beehive/Weblogic Creator not available.
2008-4-11 23:49:51 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Creator 'spring' not loaded due to NoClassDefFoundError. This is only an problem if you wanted to use it. Cause: org/springframework/beans/factory/BeanFactory
2008-4-11 23:49:51 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Creator 'script' not loaded due to NoClassDefFoundError. This is only an problem if you wanted to use it. Cause: org/apache/bsf/BSFException
2008-4-11 23:49:51 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Converter 'jdom' not loaded due to NoClassDefFoundError. This is only an problem if you wanted to use it. Cause: org/jdom/Document
2008-4-11 23:49:51 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Converter 'hibernate' not loaded due to ClassNotFoundException. This is only an problem if you wanted to use it. Cause: Failed to find either org.hibernate.Hibernate or net.sf.hibernate.Hibernate.
2008-4-11 23:49:51 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Type 'org.jdom.Document' is not convertable due to missing converter 'jdom'. This is only an problem if you wanted to use it.
2008-4-11 23:49:51 uk.ltd.getahead.dwr.util.CommonsLoggingOutput info
信息: Type 'org.jdom.Element' is not convertable due to missing converter 'jdom'. This is only an problem if you wanted to use it.

希望能得到指点  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-04-11 23:56 | ipinko@126.com
@lion
@宋
<result name="input">AjaxValidation.jsp</result>
<result>AjaxValidation.jsp</result>

你可以试试把struts.xml中的<result>AjaxValidation.jsp</result>
这句去掉

我试过这句去掉也不行T___T  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-04-21 10:41 | 欢仔
@ipinko@126.com
我也想知道怎么跳转。
麻烦max大哥分析一下  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-05-16 00:36 | star
受益匪浅.一看居然看了5个小时..博主的文章实在太引人了..是我入门学习与提高的好资料.看完你这再去看官方文档效果好些吧` - -!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-05-23 11:45 | fgrfg
ga  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-05-27 16:58 | 小骗子
在进行struts2 和ajax 验证的时候,验证信息出现的位置不是在标签的后面,如何解决?给一个具体的步骤   回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-05-31 00:25 | alwaysqd@163.com
十分感谢笔者的教程 解释十分详细具体 而且都有实现例子 太难得了 多谢  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-06-11 10:13 | !if
max 大哥 您好!
我是看您的教程学完 struts2 的,但是至于 struts2 与 dwr 结合的部分,不是很明白,
1. struts2 与 dwr 结合时,dwr 怎么对数据进行效验
2. dwr 直接访问业务逻辑层,什么时候需要使用 struts2
3. dwr 如何实现 请求跳转 ?

如果您看到我的留言,愿意帮助我的话,请把答案发到我的油箱 :123141605@163.com 再就是您那有 dwr 的例子请给我一些
谢谢  回复  更多评论
  
# 兼容 2.1.x版本的改动 2008-06-20 19:17 | Leroy Zhu
jsp 页面内的 theme="ajax" 改为 theme="xhtml”

2.1.x以后的版本不再支持ajax theme。  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-06-27 13:50 | DSDS
HFD  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-07-03 11:52 | 大田斗
感谢啊,觉得非常好!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-07-12 21:03 | Struts 2爱好者
强烈支持楼主!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-07-23 13:36 | 楚人
@CG
请参考《如何更改Struts2的默认扩展名》 http://blog.csdn.net/lazymono/archive/2008/07/23/2695754.aspx  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-07-24 15:09 | 庞永庆
你好 我不清楚你和哪个出版社联系的写书。我也是出版社的编辑,如果你真的想出版该书的话,可以和我联系。
我的邮箱:books_522008@yahoo.com.cn
或者加我的MSN:pyq_19852008@hotmail.com  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-08-06 10:45 | LonQi
这个例子不错。但是我想问一下,在后面的部分说使用AJAX 来验证name 和password。我怎么觉得跟 直接调用validate方法没有什么区别啊。  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-08-06 17:24 | 最爱JavaEE
我也刚接触struts2, 以前用的是struts1.2
来这里学了不少东西, 谢谢了
期待LZ的更多文章  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-10-16 11:27 | sage.yun
max大哥的无私奉献精神值得我们大家学习啊。
不能光max哥一个人分享经验。大家都行动起来,发扬这种无私精神。
max,好样的!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-11-26 16:20 | gqs
max on java 文如其名

谢谢!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-11-27 11:20 | chaowei126
支持 !!!!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分)[未登录] 2008-11-30 22:44 | 王刚
很高兴认识你搂住  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-12-09 15:55 | liang
很好  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2008-12-14 00:28 | natty_boy
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name="example" namespace="/example" extends="struts-default">

<action name="HelloWorld" class="example.HelloWorld">
<result>/example/HelloWorld.jsp</result>
</action>

<action name="Login_*" method="{1}" class="example.Login">
<result name="input">/example/Login.jsp</result>
<result type="redirect-action">Menu</result>
</action>

<action name="*" class="example.ExampleSupport">
<result>/example/{1}.jsp</result>
</action>

<!-- Add actions here -->
</package>
</struts>
这个是struts2包中的一个app 的 struts.xml配置
我想知道配置中的 * 以及 {1} 表示什么
<action name="Login_*" method="{1}" class="example.Login">
<action name="*" class="example.ExampleSupport">
<result>/example/{1}.jsp</result>
</action>
如何在 jsp 或者 action 中体现及运用  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2009-03-12 12:33 | Rique
很好,正在学着用Dwr做一个小的项目,配合struts2的知识,又进了一步
  回复  更多评论
  
# re: Struts 2与AJAX(第三部分)[未登录] 2009-03-24 22:56 | h
谢谢  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2009-04-02 17:47 | 舞命小丢
struts提供这样的模板是好的,但用起来不是很爽啊!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分)[未登录] 2009-09-26 20:32 | tom
十分赞同你对国内it图书的看法...
为什么一定要照搬某种形式了?其实,按照作者自己的体会写出来的书才有价值!现在市面上有太多滥竽充数的书了!中国人太浮躁了...
不过,随着现在人们的水平越来越高,哪些靠东搬西筹来的书,最终会被唾弃的!!!  回复  更多评论
  
# re: Struts 2与AJAX(第三部分) 2011-01-24 16:55 | dpf
不错哦~  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: