`
dhongwu
  • 浏览: 8068 次
社区版块
存档分类
最新评论

使用Jquery与后台Seasar框架进行ajax交互

阅读更多
公司采用的Teeda + Seasar的前后端Web开发框架。在对于Ajax这一块的支持上,一直感觉Teeda提供的Kumu框架比较难使,去网上查了一下关于如何直接使用jquery和Seasar进行ajax交互,也读了关于这一块的源码,记点心得。

先举个简单的例子。利用Dolteng插件(eclipse下该插件下载地址http://eclipse.seasar.org/updates/3.3/)建立一个Seasar web项目,并在view下新建sample.html:

<?xml version="1.0" encoding="UTF-8"?>
<!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"
	xmlns:te="http://www.seasar.org/teeda/extension"
	xmlns:h="http://java.sun.com/jsf/html" xml:lang="ja" lang="ja">
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" />
<script>
$(function(){

	$("#checkNickname").click( function() {
		var fields = new Object();
		fields["component"] = "helloLogic";
		fields["action"] = "ajaxNicknameCheck";
		fields["AjaxParam1"] = "local";
		fields["nickName"] = $("#nickName").val();

		$.ajax({
			type : "POST",
			url : "./my.ajax",
			data : fields,
			success : function(msg){
				alert(msg);
			}
	        });
	});

});
</script>
</head>

<body>

	<form id="form">
                <input type="text" id="nickName" />
		<input type="button" id="checkNickname" value="check" />
	</form>
</body>
</html>

这里我们写了一个ajax的例子,在点击check按钮时会去跟客户端交互检验nickName(当然现在我们后台代码还没有写)。但是按照例子所示,是可以直接用jquery提供的ajax函数(如果不了解jquery的$.ajax请自行查阅资料)和seasar后台交互。接下来我们结合源码来看看该如何在后台进行交互。

首先查看一下web.xml,有如下:

...
 <servlet>
        <servlet-name>ajaxServlet</servlet-name>
        <servlet-class>org.seasar.teeda.ajax.AjaxServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
    </servlet>
...
 <servlet-mapping>
        <servlet-name>ajaxServlet</servlet-name>
        <url-pattern>*.ajax</url-pattern>
    </servlet-mapping>
...

Seasar为处理ajax专门实现了一个Servlet,负责接受任何指向*.ajax页面的请求。这也解释了sample.html中$.ajax的url为./my.ajax,实际上你可以定义任意的以ajax结尾的地址。

接下来看看AjaxServlet的代码:

...
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doAjax(request, response);
    }

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doAjax(request, response);
    }
...

核心代码在doAjax中,仔细分析该函数,首先是

 String componentName = request
                .getParameter(AjaxConstants.REQ_PARAM_COMPONENT);
        String method = request.getParameter(AjaxConstants.REQ_PARAM_ACTION);
        if (method == null) {
            method = AjaxConstants.DEFAULT_AJAX_METHOD;
        }
...

其中AjaxConstants.REQ_PARAM_COMPONENT="component", AjaxConstants.REQ_PARAM_ACTION="action",这也解释了在sample.html中为何要在传入的参数中加入"component"和 "action"两个key。第一个是component名,第二个是要调用的该component的函数名。 接下来有:

...
  if (!method.startsWith(AJAX_PREFIX)) {
            MetaDef meta = def.getMetaDef(AjaxConstants.TEEDA_AJAX_META);
            if (meta == null) {
                throw new ServletException("Ajax Component Name["
                        + componentName + "] is not public.");
            }
        }
...

其中AJAX_PREFIX="ajax", 这意味着要调用的函数还必须是命名为以ajax开头。如sample.html中调用的ajaxNicknameCheck。 接下来:

...
 ComponentDef def = getComponentDefNoException(componentName);
...
 Object obj = def.getComponent();
...

这个使用过seasar的童鞋再熟悉不过了,就是获取相应的component实例,不太了解的可以查阅http://dhongwu.iteye.com/blog/1949725。接下来:

...
 Object[] args = this.setRequestParameter(request, obj);
...

这个函数也比较重要,进入看看:

 protected Object[] setRequestParameter(HttpServletRequest request,
            Object obj) {
        Object[] args = null;
        Map ajaxParam = new TreeMap();
        Enumeration enume = request.getParameterNames();
        while (enume.hasMoreElements()) {
            String key = (String) enume.nextElement();
            String value = request.getParameter(key);
            if (key.startsWith(AjaxConstants.DEFAULT_ARRAY_PARAM_NAME)) {
                String index = key
                        .substring(AjaxConstants.DEFAULT_ARRAY_PARAM_LENGTH);
                ajaxParam.put(new Integer(index), value);
                continue;
            }
            this.setPropertyNoException(obj, key, value);
        }
        int ajaxParamSize = ajaxParam.size();
        if (0 < ajaxParamSize) {
            args = new Object[ajaxParamSize];
            Iterator iterator = ajaxParam.keySet().iterator();
            for (int i = 0; iterator.hasNext(); i++) {
                args[i] = ajaxParam.get(iterator.next());
            }
        }
        return args;
    }

这个函数主要干了2件事。遍历所有request传入的参数,如果参数的name是形如"AjaxParam1", "AjaxParam2", "AjaxParam3"等的话(注:AjaxConstants.DEFAULT_ARRAY_PARAM_NAME="AjaxParam"),则把他们作为后台要执行的函数的参数。在sample.html中,定义了一个AjaxParam1="local",故"local"这个字符串将被作为ajaxNicknameCheck的参数。而作为执行函数参数的顺序由跟尾的数字决定。第2件事则是对于不符合AjaxParam开头的request的name,则把他对应的值注入到该component中的变量中。在本例中request有一对键和值("nickName", #nickName文本框的输入值),则在helloLogic这个component中定义一个public变量nickName(或者private变量nickName但是提供setNickName函数),就将被自动注入#nickName文本框的输入值。这一套和teeda本身的前后台注入是一样的。

了解了这么多,只需要在后台实现helloLogic这个component即可。假设工程root路径为jp.co.worksap.sample,那么新建package jp.co.worksap.sample.logic,新建接口HelloLogic:

public interface HelloLogic {

	public String ajaxNicknameCheck(String src);
}

新建package jp.co.worksap.sample.logic.impl,新建类HelloLogicImpl:

public class HelloLogicImpl implements HelloLogic {

	public String nickName; 
	
	public String ajaxNicknameCheck(String src) {
		//请自由发挥
                ...
	}

}


补充一句:关于为何HelloLogicImpl会被识别为名为"helloLogic"的component。这个在以前的文章中已经提及,请查阅http://dhongwu.iteye.com/admin/blogs/1949725。简而言之,请看下工程resources文件夹下的creator.dicon文件,里面定义了各种XXCreator,每一个Creator负责创建某个路径下的命名合法的类的实例。比如上文的jp.co.worksap.sample.logic.impl属于LogicCreator管理,然后HelloLogicImpl这个命名也符合规范,那么LogicCreator就会为HelloLogicImpl创建一个名为"helloLogic"的component。
分享到:
评论

相关推荐

    seasar框架S2Dao使用指南

    2. **JDBC知识透明**:开发人员无需深入了解JDBC细节,S2Dao内部处理了与数据库交互的复杂性。 3. **SQL语句与Java代码分离**:SQL语句被封装在独立的SQL文件中,使得代码更加清晰,易于维护。 4. **自动生成SQL**...

    seasar框架开发常用数据关系组件

    Seasar提供了多个组件,其中一个是DOMA(Database Object Mapping Accessor),这是一个强大的数据访问层,它允许开发者以对象关系映射(ORM)的方式与数据库进行交互。在这个“seasar框架开发常用数据关系组件”的...

    Seasar框架EntityService自动生成

    在Seasar框架中,EntityService是一种特殊的服务层对象,用于处理与数据库实体对象相关的业务逻辑。这个服务通常包含了CRUD(创建、读取、更新和删除)操作,以及一些复杂的业务规则。 "Seasar框架EntityService...

    seasar教程,java开发框架之一

    seasar教程,最流行的java开发框架之一,再过几年可能成为主流. struts与Spring与Hibernate的简化版本,国外很多大公司己经用了几年了,NEC,LG的软件开发都是用这个的。兄弟们快学吧

    一个日系seasar框架Demo:S2Containor+S2Dao+SAStruts+mayaa

    Seasar框架是一个源自日本的开源Java开发框架,它旨在简化企业级应用的开发流程,提高开发效率。Seasar提供了一套完整的解决方案,包括容器管理、数据访问、MVC框架以及Web应用开发等组件。在这个“S2Containor+S2...

    小日本的开源框架 Seasar2

    与许多其他轻量级容器不同,Seasar2强调了无需编写配置文件的特性,它采用了Convention over Configuration的设计理念,即遵循一定的约定,使框架能够自动配置自身,从而简化开发过程。这种理念受到了Ruby on Rails...

    seasar2.3主框架

    4. **S2JUnit**:一个集成测试框架,它扩展了JUnit,使得在Seasar2环境中进行单元测试变得更加便捷。 5. **S2Scheduler**:任务调度组件,可以方便地定义和管理定时任务,适用于需要定期执行的工作。 6. **S2Excel...

    seasar

    Seasar是一个在中国编程社区中不太为人所熟知但十分有价值的开源框架,主要针对Java开发,尤其在数据处理领域具有显著优势。Seasar项目旨在提供一套全面的解决方案,包括面向切面编程(AOP)、数据访问对象(DAO)...

    seasar 的一个action处理

    日本框架seasar 的一个action处理

    seasar2

    根据提供的文件信息,我们可以深入探讨Seasar2框架及其与Struts框架的集成方式。这份幻灯片的内容主要围绕S2Struts展开,S2Struts是Seasar2框架的一个组件,它结合了Seasar2的强大功能和Struts的灵活性。 ### S2...

    Seasar2最新版

    这使得Seasar2的应用可以轻松地与其他系统进行集成,扩展了应用的边界。 5. 配置管理:Seasar2强调减少XML配置文件,提倡使用Java配置或者注解来声明组件和服务。这种做法减少了因配置错误导致的问题,同时也提高了...

    SeasarDemo

    SeasarDemo是一个基于Seasar2框架的简单示例项目,主要展示了依赖注入(Dependency Injection,简称DI)的概念和实现。Seasar2是一个日本开发的Java应用程序框架,它提供了丰富的功能来简化企业级应用的开发,包括...

    seasar2构建工程

    "seasar2构建工程"的主题主要围绕如何使用Seasar2框架来搭建和管理Java项目。 首先,Seasar2的构建过程通常涉及到以下几个关键步骤: 1. **环境配置**:在开始构建工程前,你需要确保已安装JDK,并且设置了正确的...

    Seasar2的英文介绍

    然而,尽管Seasar2在当时是流行的框架之一,随着Spring框架的崛起,Seasar2的使用逐渐减少。不过,对于学习和理解组件化、容器化以及面向切面编程等概念,Seasar2仍是一个有价值的参考和学习资源。

    seasar2 官方例子代码

    标题“seasar2 官方例子代码”意味着这个压缩包中包含的是Seasar2官方提供的示例代码,这些代码通常是为了演示如何使用Seasar2框架的各种功能而编写的。通过学习这些示例,开发者可以更好地理解和掌握Seasar2的用法...

    seasar2中文文档

    #### 快速上手:Seasar2框架入门与实践 **最初的一步** 为了理解Seasar2框架的基本概念及如何快速启动一个项目,我们首先介绍一个简单的示例:实现一个问候功能。在这个过程中,我们将学习Seasar2中的核心组件之一...

    seasar2.PPT

    Seasar2是一个开源的Java框架,主要功能包括依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect Oriented Programming,简称AOP)。这个框架的设计目标是提高开发效率,通过将组件(Plain Old Java ...

Global site tag (gtag.js) - Google Analytics