`
hello_player
  • 浏览: 153659 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Struts2 和 Ajax 交互

    博客分类:
  • SSH
阅读更多

struts2 的项目的建立我就不多说了,网上很多。这里就说下 struts.xml 里面关于 result 的配置含义,因为 struts2 会通过这个配置来判断你想要做什么样的操作,是重定向、返回数据还是其他什么的,默认配置的结果类型是dispatcher。具体的 result-type 可以 在struts2-core-2.0.11.1.jar 包或 struts2 源代码中的 struts-default.xml 文件中找到,在这个文件中找到标签,所有的result-type都在里面定义了。

 

result-type

class

说明

dispatcher

org.apache.struts2.dispatcher.
ServletDispatcherResult

默认结果类型,用来转向页面,通常处理JSP

chain

com.opensymphony.xwork2.
ActionChainResult

action和另外一个action链接起来

freemarker

org.apache.struts2.views.freemarker.
FreemarkerResult

处理FreeMarker模板

httpheader

org.apache.struts2.dispatcher.
HttpHeaderResult

用来控制特殊的Http行为

redirect

org.apache.struts2.dispatcher.
ServletRedirectResult

重定向到一个URL

redirectAction

org.apache.struts2.dispatcher.
ServletActionRedirectResult

重定向到一个Action

stream

org.apache.struts2.dispatcher.
StreamResult

向浏览器发送InputSream对象,通常用来处理文件下载或者返回数据给 Ajax 调用

velocity

org.apache.struts2.dispatcher.
VelocityResult

处理Velocity模板

xslt

org.apache.struts2.views.xslt.
XSLTResult

处理XML/XLST模板,
XML可以通过XSL模板进行转换

plaintext

org.apache.struts2.dispatcher.
PlainTextResult

显示原始文件内容,例如文件源代码 

 

ajax 调用 action 没什么说的,跟以前 struts1 差不多,直接调用 .action ,直接将参数 post 传递过去,在 action execute 方法或者动态方法中获取参数就可以了;

action 回传数据给 ajax 的时候用到了上面 result-type 里面的 stream 参数配置,将 InputStream 对象返回给浏览器,在ajax 中通过 responseText 来获取返回的值。

有个问题需要说明一下,尽管工程和 jsp 编码都设置成 utf-8,在使用 stream 进行传递的时候仍然会出现乱码问题,这个时候过滤器也是帮不上忙的,需要在生成 InputStream 对象之前的字符串重新编码,否则中文传递到前台就会出乱码。

下面来看看代码:

ajax.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="ajax.js"></script>
<title>Insert title here</title>
</head>
<body>
	<form>
		<input type="text" id="nameId"/><br/>
		<span id="nameId2"><span></span></span><br/>
		<span id="msgId"></span><br/>
		<input type="button" onclick="checkUserName()" value="提交"/>
	</form>
</body>
</html>

 

 

ajax.js

 

var xhr ;

// 初始化 xhr 对象
// return value : 1 : IE , 2 , Mozila , 0 : create xhr error ;
function createXHR(){
	// 1,创建xhr 对象 .
	if( window.ActiveXObject ){
		xhr = new ActiveXObject( "Microsoft.XMLHTTP" ) ;
		return 1 ;
	}else if( window.XMLHttpRequest ){
		xhr = new XMLHttpRequest();
		return 2 ;	
	}else{
		return 0 ;
	}	   
}   
  
// ////////// 验证用户名是否存在 ////////////////////

// 将用户填写的用户名发送给服务器端验证
function checkUserName(){
	var ret = createXHR();
	if( ret == 0 ){
		alert( "create xhr error" ) ;
	}else{
		// 在xhr中注册用于处理应答的函数(handleCheck)
		xhr.onreadystatechange = handleCheck ;
		/*
		 * //使用Get方式向服务器发送请求 . 
		 * var url = makeQueryString( "/ajax/reg.jsp" ); 
		 * xhr.open( "get" , url ) ; 
		 * xhr.send( null );
		 */
		  
		// 通过Post 形式向服务器发送数据 .
		var url = "http://localhost:8088/Struts2Demo/ajax_test.action" ;
		xhr.open( "post" , url ) ;   
		xhr.setRequestHeader( "Content-Type" , "application/x-www-form-urlencoded" ) ;
		xhr.send( makeQueryString( null ) ) ;
	}   
}   
  
// 在指定的URL上添加参数
function makeQueryString( url ){
	var name = document.getElementById( "nameId" ).value ;
	var queryString ;
	if( url == null ){
		return "name=" + name ;	
	}else{
		return url + "?name=" + name ;	
	}
}   

function handleCheck(){  
	document.getElementById( "nameId2" ).firstChild.innerHTML="用户名不能为空";
	// 通信过程结束 .
	// readyState : 1: 初始化阶段 2 :连接建立阶段 3 : 通信中阶段 4 : 通信结束
	if( xhr.readyState == 4 ){   
		// status==200,表示服务器运行正常,其他值代表错误
		if( xhr.status == 200 ){
			processResult();
		}else if(document.getElementById( "nameId" ).value==""){
			document.getElementById( "nameId2" ).firstChild.nodeValue="用户名不能为空";
			document.getElementById( "nameId2" ).color="red";	
		}
	}
}
  
function processResult(){
	// 获得应答内容 ,把应答内容显示在网页上
	var span = document.getElementById( "msgId" ) ;
	span.innerHTML = xhr.responseText ;	
}
 

 

AjaxAction.java

 

package com.test.action;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringBufferInputStream;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class AjaxAction extends ActionSupport {

	private InputStream inputStream;

	public InputStream getInputStream() {
		return inputStream;
	}

	public String execute() throws Exception {
		return SUCCESS;
	}

	public String checkUser() throws Exception {
		HttpServletRequest request = null;
		request = ServletActionContext.getRequest();
		// 获取 ajax 传递的 name 参数值
		Object name = request.getParameter("name");
		System.out.println("name=>" + name);
		// 返回 StringBufferInputStream 对象,新的 jdk 里面已经不推荐使用,但推荐使用的 StringReader
		// 并不是 InputStream 接口的实现类,这个比较蛋疼,可以使用下面 test 里面其他的实现类来传递
		inputStream = new StringBufferInputStream(transcoding("struts2 返回 哈哈"));
		return SUCCESS;
	}
	
	public String test() throws Exception {
		// 返回 ByteArrayInputStream 对象至前台,注意跟上面的编码上的区别
		inputStream = new ByteArrayInputStream("乱码测试".getBytes("utf-8"));
		return SUCCESS;
	}
	
	private String transcoding(String str) {
		try {
			return new String(str.getBytes("utf-8"), "iso-8859-1");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return str;
	}
}
 

 

struts.xml

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<include file="struts-default.xml"></include>
	
	<package name="hello" extends="struts-default">
		<action name="helloworld" class="com.test.action.HelloWorldAction">
			<result>/result.jsp</result>
		</action>
	</package>
	
	<package name="ajax" extends="struts-default">
		<action name="ajax_*" class="com.test.action.AjaxAction" method="{1}">
			<result>/page/ajax/ajax.jsp</result>
			<result type="stream">
				<param name="inputName">inputStream</param>
			</result>
		</action>
	</package>
	
</struts>
 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
	<display-name>Struts2Demo</display-name>

	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	
	<filter>
        <filter-name>struts-cleanup</filter-name>
        <filter-class>
            com.test.filter.SetCharacterEncodingFilter
        </filter-class>
        <init-param>
        	<param-name>encoding</param-name>
        	<param-value>utf-8</param-value>
        </init-param>
    </filter>  
    <filter-mapping>
        <filter-name>struts-cleanup</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>*.action</url-pattern>
	</filter-mapping>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>
 

上面配了一个自定义的过滤器,主要处理页面提交的中文编码问题的,本例中可以不用,struts2 当中也是有自带的中文过滤器的,这个自定义的过滤器也顺便贴出来了

SetCharacterEncodingFilter.java

package com.lizanhong.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SetCharacterEncodingFilter implements Filter {

    protected String encoding = null;

    protected FilterConfig filterConfig = null;

    protected boolean ignore = true;

    public void destroy() {

        this.encoding = null;
        this.filterConfig = null;

    }

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain)
    throws IOException, ServletException {

        if (ignore || (request.getCharacterEncoding() == null)) {
            String encoding = selectEncoding(request);
            if (encoding != null)
                request.setCharacterEncoding(encoding);
        }

        chain.doFilter(request, response);

    }

    public void init(FilterConfig filterConfig) throws ServletException {

    this.filterConfig = filterConfig;
        this.encoding = filterConfig.getInitParameter("encoding");
        String value = filterConfig.getInitParameter("ignore");
        if (value == null)
            this.ignore = true;
        else if (value.equalsIgnoreCase("true"))
            this.ignore = true;
        else if (value.equalsIgnoreCase("yes"))
            this.ignore = true;
        else
            this.ignore = false;

    }

    protected String selectEncoding(ServletRequest request) {
        return (this.encoding);
    }
}

 

里面的代码尽量省略,应该可以看到最原始的交互过程了。

分享到:
评论
3 楼 ginolai 2015-05-18  
  <result>/page/ajax/ajax.jsp</result> 
            <result type="stream"> 
                <param name="inputName">inputStream</param> 
  </result>
这个配置有问题,求问 
2 楼 wzh700 2012-08-19  
说的挺好的学习了
1 楼 greatwqs 2011-12-06  

相关推荐

    struts2和ajax交互需要的6个jar包

    commons-beanutils-1.7.0.jar,commons-collections-3.1.jar,commons-lang-2.5.jar,commons-logging.jar,ezmorph-1.0.3.jar,json-lib-2.1-jdk15.jar,这六个jar包

    ajax与Struts2使用json格式交互实例

    使用Struts2和jQuery EasyUI实现简单CRUD系统,从零开始,从基础的ajax与Struts2的使用json格式进行交互开始。

    struts2ajax项目

    jQuery是一个轻量级的JavaScript库,它简化了DOM操作、事件处理以及Ajax交互,使得开发者更容易实现复杂的前端效果和交互。 首先,我们需要了解Struts2中如何配置Action。在Struts2中,Action类是业务逻辑的载体,...

    struts2的Ajax实现注册验证

    总的来说,Struts2和Ajax的结合使用使得Web应用能够提供更快速、更直观的用户交互,而这个代码和jar包组合可能就是实现这一目标的一个实例。通过阅读提供的文档和使用示例,你可以深入了解并实践这一技术,从而提升...

    Struts2的ajax支持

    ### Struts2的Ajax支持详解 #### Ajax概述与Struts2的融合 在现代Web2.0技术蓬勃发展的背景下,Ajax技术因其能够...通过掌握Struts2的Ajax支持,开发者可以轻松构建出具有高度交互性和良好用户体验的现代Web应用。

    struts2+ajax+jquery

    jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画效果以及Ajax交互等任务。 在这个例子中,我们使用jQuery的Ajax函数与Struts2进行交互。jQuery的$.ajax()方法可以创建一个Ajax请求,其参数...

    ajax与Struts2交互实例

    使用Struts2和jQuery EasyUI实现简单CRUD系统,从零开始,从基础的ajax与Struts2的交互开始。

    struts2实现ajax功能所需的jar包

    首先,我们需要了解Struts2与AJAX交互的基本原理。在AJAX中,JavaScript通常通过XMLHttpRequest对象与服务器进行异步通信,发送请求并接收响应。在Struts2框架下,我们可以利用Struts2的Action类和结果类型来处理...

    struts2 jqurey ajax简单实例

    jQuery则是一个轻量级、功能丰富的JavaScript库,它简化了HTML文档遍历、事件处理、动画以及Ajax交互。Ajax,全称Asynchronous JavaScript and XML,是一种在无需重新加载整个网页的情况下更新部分网页的技术。在这...

    struts2中AJAX实现

    通过结合Struts2和AJAX,开发者可以创建更高效、交互性更强的Web应用程序。 在Struts2中实现AJAX,主要涉及以下几个关键点: 1. **Struts2 Action和Result**:首先,你需要创建一个Struts2 Action类,它将处理...

    Struts2+Jquery+Ajax

    Jquery是一个高效的JavaScript库,简化了HTML文档遍历、事件处理、动画以及Ajax交互。它使得开发者能更便捷地操作DOM元素,创建动态网页效果。在Struts2中,Jquery可以与Ajax结合使用,实现页面的无刷新更新。 Ajax...

    Struts2+Ajax实现的用户登录

    总结来说,"Struts2+Ajax实现的用户登录"是一个典型的Web开发场景,涉及到了前端的动态交互、后端的业务处理和持久化操作。Struts2提供了控制流程,Ajax实现了无刷新的用户交互,Sprint协助管理应用程序组件,而...

    Struts 2及AJAX框架的详细介绍

    学习Struts 2和AJAX框架的组合,有助于开发者构建出响应快速、交互性强的Web应用。Struts 2的强大功能和AJAX的动态特性,使得开发者可以更好地满足用户需求,提升应用的性能和用户体验。在实际开发中,深入理解和...

    Struts2与AJAX

    Struts2的AJAX支持并不是从零开始创建一个新的AJAX框架,而是选择了当时在Java EE平台上广泛使用的AJAX库,如Dojo和Direct Web Remoting (DWR)。这样做不仅可以利用已有的成熟技术,同时也降低了学习曲线,使得...

    使用struts2 和ajax进行传递json数据

    **Struts2与Ajax交互** 在Struts2中,可以通过配置Action来处理Ajax请求。Action类中的方法可以返回一个值,这个值可以映射到一个视图,也可以是JSON字符串。使用`@Result`注解或struts.xml配置文件,可以指定一个...

    struts2对AJAX的支持

    Struts2是一个强大的Java web框架,它为开发者...总之,Struts2通过其AJAX插件,为开发者提供了便捷的方式来集成AJAX,提高了Web应用的交互性和响应速度。通过学习和掌握这些功能,可以有效地提升Web应用的用户体验。

    struts2实现ajax

    Struts2是一个非常流行的Java Web框架,它提供...通过以上步骤,开发者可以在Struts2框架下轻松地实现Ajax功能,提高Web应用的交互性和用户体验。理解并熟练掌握这些知识点,对于开发高效、用户友好的Web应用至关重要。

    ZTree+Struts2+ajax+json实现checkbox权限树

    【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...

    用案例学Java Web整合开发:Java+Eclipse+Struts 2+Ajax

    Java Web整合开发是构建Web应用程序的...通过学习和实践,你可以掌握如何在Eclipse环境中搭建Java Web开发环境,使用Struts 2框架组织应用结构,以及利用Ajax优化交互体验。这将为你在Java Web开发领域打下坚实的基础。

    Jquery struts2 json 实现ajax

    首先,jQuery是一个轻量级、功能丰富的JavaScript库,它简化了DOM操作、事件处理、动画效果以及Ajax交互。在Ajax方面,jQuery提供了$.ajax()、$.get()、$.post()等方法,使得发送异步请求变得简单易用。 在Struts2...

Global site tag (gtag.js) - Google Analytics