`

struts2中以json的方式输出一张页面到前台

阅读更多
struts2中以json的方式输出一张页面到前台

package net.esj.struts.resultsupport;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Locale;
import java.util.Properties;

import javax.annotation.Resource;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.esj.basic.config.Config;
import net.esj.basic.plugins.freemarker.SpringConfigToFreemarkerManager;
import net.esj.basic.utils.hibe.HiJSONUtil;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.config.DefaultSettings;
import org.apache.struts2.dispatcher.StrutsResultSupport;
import org.apache.struts2.views.freemarker.FreemarkerManager;
import org.apache.struts2.views.util.ResourceUtil;
import org.json.JSONException;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.LocaleProvider;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.ValueStack;

import freemarker.template.Configuration;
import freemarker.template.ObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;

/**
 * 将对应的页面文件以json的方式ajax输出到前台
 * @author Administrator
 *
 */
public class JsonViewResult extends FreemarkerUsageResult {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	public static final String JSON_VIEW_PROPERTIES = "json.view.properties";
	
	protected Configuration configuration;
	protected Configuration userConfiguration;

	protected ObjectWrapper wrapper;
	private String pContentType = "text/text";

	protected SpringConfigToFreemarkerManager springConfigToFreemarkerManager;
	
	@Override
	public void doExecute(String location, ActionInvocation invocation) throws IOException, TemplateException{
		
		this.configuration = getConfiguration();
		this.wrapper = getObjectWrapper();
		
		if (!location.startsWith("/")) {
            ActionContext ctx = invocation.getInvocationContext();
            HttpServletRequest req = (HttpServletRequest) ctx
                    .get(ServletActionContext.HTTP_REQUEST);
            String base = ResourceUtil.getResourceBase(req);
            location = base + "/" + location;
        } 
		
		Template template = null;
		try{
			if(canUserConfiguration(invocation)){
				this.userConfiguration = getUserConfiguration();
				template = userConfiguration.getTemplate(location,
						deduceLocale(invocation));
			}
		}catch(Exception e){
			//NOUSE
		}finally{
			if(template==null){
				template = configuration.getTemplate(location,
						deduceLocale(invocation));
			}
		}
		

		TemplateModel model = createModel(invocation);
		
		Writer out = new StringWriter();

		if (preTemplateProcess(template, model)) {
			try {
				template.process(model, out);
				String result = HiJSONUtil.toJSONString(out.toString());//转成JSON
				ServletActionContext.getResponse().getWriter().print(result);
			} catch (JSONException e) {
				e.printStackTrace();
			} finally {
				postTemplateProcess(template, model);
			}
		}
	}

	protected void postTemplateProcess(Template template, TemplateModel data)
			throws IOException {
	}

	protected boolean preTemplateProcess(Template template, TemplateModel model)
			throws IOException {
		Object attrContentType = template.getCustomAttribute("content_type");
		if (attrContentType != null) {
			ServletActionContext.getResponse().setContentType(
					attrContentType.toString());
		} else {
			String contentType = getContentType();
			if (contentType == null) {
				contentType = "text/html";
			}
			String encoding = template.getEncoding();
			if (encoding != null) {
				contentType = contentType + "; charset=" + encoding;
			}
			ServletActionContext.getResponse().setContentType(contentType);
		}
		return true;
	}

	protected TemplateModel createModel(ActionInvocation invocation)
			throws TemplateModelException {
		ServletContext servletContext = ServletActionContext
				.getServletContext();
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		ValueStack stack = ServletActionContext.getContext().getValueStack();
		Object action = null;
		if (invocation != null)
			action = invocation.getAction(); // Added for NullPointException
		return springConfigToFreemarkerManager.buildTemplateModel(stack, action,
				servletContext, request, response, wrapper);
	}

	protected Configuration getConfiguration() throws TemplateException {
		return springConfigToFreemarkerManager.getConfiguration(ServletActionContext
				.getServletContext());
	}

	protected Configuration getUserConfiguration() {
		return springConfigToFreemarkerManager.getUserConfiguration(ServletActionContext
				.getServletContext());
	}

	protected Locale deduceLocale(ActionInvocation invocation) {
		if (invocation.getAction() instanceof LocaleProvider) {
			return ((LocaleProvider) invocation.getAction()).getLocale();
		} else {
			return configuration.getLocale();
		}
	}

	protected ObjectWrapper getObjectWrapper() {
		return configuration.getObjectWrapper();
	}

	public String getContentType() {
		return pContentType;
	}

	public void setContentType(String aContentType) {
		pContentType = aContentType;
	}

	protected Writer getWriter() throws IOException {
		return ServletActionContext.getResponse().getWriter();
	}
	
	@Resource
    public void setSpringConfigToFreemarkerManager(SpringConfigToFreemarkerManager mgr) {
        this.springConfigToFreemarkerManager = mgr;
    } 
	
}



增加struts.xml配置
<package name="melon-default" extends="struts-default" >
        <result-types>
            <result-type name="jsonview" class="net.esj.struts.resultsupport.JsonViewResult"/>
</result-types>
    </package>
分享到:
评论

相关推荐

    struts2+json

    总的来说,"struts2+json"资源涉及到了Struts2框架中的Action设计、拦截器机制、结果类型的配置,以及AJAX和JSON在Web应用中的使用。理解这些知识点对于开发动态、交互性强的Java Web应用至关重要。

    struts2返回JSON数据的两种方式

    总结,Struts2中返回JSON数据有两种主要方式:一是通过`response.getWriter().print()`手动输出JSON字符串;二是利用Struts2的内置JSON插件,通过返回特定的属性和结果类型自动处理JSON。每种方法都有其适用场景,...

    struts2与json整合

    在探讨“Struts2与JSON整合”的主题时,我们深入分析了如何在Struts2框架中集成JSON技术,实现前后端数据的高效交互。Struts2作为一款流行的Java Web开发框架,提供了丰富的功能来简化Web应用程序的开发过程。而JSON...

    struts2-json-plugin

    struts2-json-plugin,Struts JSON插件

    struts2-json

    此外,Struts2的JSON漏洞曾引起广泛关注,因此保持框架版本的更新至关重要,以修复可能的安全漏洞。 8. **客户端处理**: 客户端通常使用JavaScript或Ajax来处理JSON响应,例如使用jQuery的`$.ajax`或`fetch` API...

    struts2-json-plugin-2.3.24-API文档-中文版.zip

    赠送jar包:struts2-json-plugin-2.3.24.jar; 赠送原API文档:struts2-json-plugin-2.3.24-javadoc.jar; 赠送源代码:struts2-json-plugin-2.3.24-sources.jar; 赠送Maven依赖信息文件:struts2-json-plugin-...

    struts2-json-plugin源码

    在Struts2中,通过整合JSON插件,可以方便地将Action的返回结果转换为JSON格式,供前端JavaScript处理。 `struts2-json-plugin`是Struts2的一个插件,它使得Struts2能够处理JSON请求和响应,无需额外的配置或库。这...

    struts2返回json

    在Struts2中,返回JSON(JavaScript Object Notation)数据类型是一种常见的需求,尤其是在开发AJAX或者前后端分离的应用时。JSON是一种轻量级的数据交换格式,它允许服务器向客户端发送结构化的数据,而无需解析...

    Struts2与JSON

    在Struts2中,我们可以使用JQuery的Ajax方法(如`$.ajax()`或`$.post()`)发送异步请求,提交表单数据到服务器,同时获取JSON响应。 整合步骤如下: 1. **配置Struts2**: 首先,确保你的项目已经引入了Struts2的...

    json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar

    `struts2-json-plugin-2.1.8.1.jar` 则是Struts 2框架的一个插件,主要用于增强Struts 2对JSON的支持。Struts 2是一款非常流行的MVC(Model-View-Controller)框架,用于构建企业级的Java Web应用程序。这个插件允许...

    AJAX和struts2传递JSON数组

    总结来说,通过这种方式,我们可以利用AJAX向Struts2 Action传递JSON数组,实现异步数据交互。这在动态更新页面内容、处理表单提交等场景下非常有用。同时,使用JSON作为数据交换格式,使得前后端的数据交换变得更加...

    AJAX 想Struts2后台传送Json数据并向前台返回Json格式的数据

    1. 配置Struts2:在struts.xml配置文件中,为Action添加一个JSON结果类型,这样Struts2将会返回JSON响应。 2. 接收JSON数据:在Action类的setter方法中,使用@Param注解接收JSON参数。 3. 处理业务逻辑:在Action中...

    Struts2中使用JSON数据格式所需全部jar包

    在Struts2中集成JSON数据格式,能够使得前后端交互更加高效,因为JSON是一种轻量级、易于解析的数据交换格式。本压缩包提供了在Struts2中使用JSON所需的全部jar包,特别适用于支持struts2.18及更高版本的应用,确保...

    与struts2配套的JSON架包

    Struts2提供了一种内置的方式来处理JSON响应,无需额外的库。但是,为了更全面的功能和更好的性能,开发者通常会引入第三方JSON库,如`org.json`或`json-lib`。这个"与struts2配套的JSON架包"可能包含这些库的JAR...

    struts2所需的包和Struts2_json所需包

    导入这些包后,开发者可以按照Struts2的配置方式设置Action,通过`@ResultType("json")`注解或在配置文件中指定`result`类型为`json`,Struts2就会自动将Action的返回值转化为JSON格式并发送到客户端。 在实际开发...

    Struts2返回JSON对象的方法总结完整实例

    如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择。... Struts2返回JSON有两种方式:1.使用Servlet的输出流写入JSON字符串;2.使用Struts2对JSON的扩展。

    Struts2+Json+Android简单实现

    Struts2、JSON和Android是三个在Web应用开发中至关重要的技术。本示例将详细介绍如何结合这三者实现一个简单的交互。 首先,Struts2是一个基于MVC(Model-View-Controller)架构的Java Web框架,它简化了创建动态、...

    struts2 json

    Struts2 JSON是一个在Java开发中广泛使用的框架,它允许开发者在Struts2应用程序中方便地处理JSON(JavaScript Object Notation)数据。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和...

    struts2-json-lib

    1. 添加JSON插件到项目的类路径:确保`struts2-json-plugin-x.x.x.jar`在类路径中,并在`struts.xml`配置文件中启用JSON插件。 2. 配置Action:在Action类中,添加`@Result`注解或者在XML配置文件中定义结果类型为`...

    struts2 action 返回json方法(一)源码

    在使用JSON功能前,确保已添加Struts2 JSON插件到项目依赖中。如果是Maven项目,可以在pom.xml中添加如下依赖: ```xml &lt;groupId&gt;org.apache.struts &lt;artifactId&gt;struts2-json-plugin &lt;version&gt;your_struts2_...

Global site tag (gtag.js) - Google Analytics