struts+json实现注解配置

  
  1. import java.awt.Image;   
  2. import java.io.File;   
  3. import java.io.FileInputStream;   
  4. import java.io.FileOutputStream;   
  5. import javax.imageio.ImageIO;   
  6. import org.apache.struts2.ServletActionContext;   
  7. import org.apache.struts2.convention.annotation.Action;   
  8. import org.apache.struts2.convention.annotation.ParentPackage;   
  9. import org.apache.struts2.convention.annotation.Result;   
  10. import org.apache.struts2.json.annotations.JSON;   
  11. import com.opensymphony.xwork2.ActionSupport;   
  12.   
  13. @SuppressWarnings("serial")   
  14. @ParentPackage("json-default")   
  15. public class FileUploadAction extends ActionSupport   
  16. {   
  17.     private File    file;   
  18.     private String  fileFileName;   
  19.     private String  fileFileContentType;   
  20.     private String  message = "你已成功上传文件";   
  21.     private Integer width   = 0;   
  22.     private Integer height  = 0;   
  23.        
  24.     public File getFile()   
  25.     {   
  26.         return file;   
  27.     }   
  28.        
  29.     public void setFile(File file)   
  30.     {   
  31.         this.file = file;   
  32.     }   
  33.        
  34.     public String getFileFileName()   
  35.     {   
  36.         return fileFileName;   
  37.     }   
  38.        
  39.     public void setFileFileName(String fileFileName)   
  40.     {   
  41.         this.fileFileName = fileFileName;   
  42.     }   
  43.        
  44.     public String getFileFileContentType()   
  45.     {   
  46.         return fileFileContentType;   
  47.     }   
  48.        
  49.     public void setFileFileContentType(String fileFileContentType)   
  50.     {   
  51.         this.fileFileContentType = fileFileContentType;   
  52.     }   
  53.        
  54.     @JSON  
  55.     public String getMessage()   
  56.     {   
  57.         return message;   
  58.     }   
  59.        
  60.     public void setMessage(String message)   
  61.     {   
  62.         this.message = message;   
  63.     }   
  64.        
  65.     @JSON  
  66.     public Integer getWidth()   
  67.     {   
  68.         return width;   
  69.     }   
  70.        
  71.     public void setWidth(Integer width)   
  72.     {   
  73.         this.width = width;   
  74.     }   
  75.        
  76.     @JSON  
  77.     public Integer getHeight()   
  78.     {   
  79.         return height;   
  80.     }   
  81.        
  82.     public void setHeight(Integer height)   
  83.     {   
  84.         this.height = height;   
  85.     }   
  86.        
  87.     @Action(value = "uploadPic", results = { @Result(name = "success", type = "json") }, params = { "contentType""text/html" })   
  88.     public String uploadPic()   
  89.     {   
  90.         String path = ServletActionContext.getServletContext().getRealPath("/upload");   
  91.         try  
  92.         {   
  93.             File f = this.getFile();   
  94.             if (this.getFileFileName().endsWith(".exe"))   
  95.             {   
  96.                 message = "对不起,你上传的文件格式不允许!!!";   
  97.                 return INPUT;   
  98.             }   
  99.             FileInputStream inputStream = new FileInputStream(f);   
  100.             FileOutputStream outputStream = new FileOutputStream(path + "/" + this.getFileFileName());   
  101.             byte[] buf = new byte[1024];   
  102.             int length = 0;   
  103.             while ((length = inputStream.read(buf)) != -1)   
  104.             {   
  105.                 outputStream.write(buf, 0, length);   
  106.             }   
  107.             inputStream.close();   
  108.             outputStream.flush();   
  109.             message = fileFileName;   
  110.             File imageFile = new File(path + "/" + fileFileName);   
  111.             Image image = ImageIO.read(imageFile);   
  112.             width = image.getWidth(null);   
  113.             height = image.getHeight(null);   
  114.         }   
  115.         catch (Exception e)   
  116.         {   
  117.             e.printStackTrace();   
  118.             message = "对不起,文件上传失败了!!!!";   
  119.         }   
  120.         return SUCCESS;   
  121.     }   
  122. }  
import java.awt.Image;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import javax.imageio.ImageIO;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.json.annotations.JSON;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
@ParentPackage("json-default")
public class FileUploadAction extends ActionSupport
{
	private File	file;
	private String	fileFileName;
	private String	fileFileContentType;
	private String	message	= "你已成功上传文件";
	private Integer	width	= 0;
	private Integer	height	= 0;
	
	public File getFile()
	{
		return file;
	}
	
	public void setFile(File file)
	{
		this.file = file;
	}
	
	public String getFileFileName()
	{
		return fileFileName;
	}
	
	public void setFileFileName(String fileFileName)
	{
		this.fileFileName = fileFileName;
	}
	
	public String getFileFileContentType()
	{
		return fileFileContentType;
	}
	
	public void setFileFileContentType(String fileFileContentType)
	{
		this.fileFileContentType = fileFileContentType;
	}
	
	@JSON
	public String getMessage()
	{
		return message;
	}
	
	public void setMessage(String message)
	{
		this.message = message;
	}
	
	@JSON
	public Integer getWidth()
	{
		return width;
	}
	
	public void setWidth(Integer width)
	{
		this.width = width;
	}
	
	@JSON
	public Integer getHeight()
	{
		return height;
	}
	
	public void setHeight(Integer height)
	{
		this.height = height;
	}
	
	@Action(value = "uploadPic", results = { @Result(name = "success", type = "json") }, params = { "contentType", "text/html" })
	public String uploadPic()
	{
		String path = ServletActionContext.getServletContext().getRealPath("/upload");
		try
		{
			File f = this.getFile();
			if (this.getFileFileName().endsWith(".exe"))
			{
				message = "对不起,你上传的文件格式不允许!!!";
				return INPUT;
			}
			FileInputStream inputStream = new FileInputStream(f);
			FileOutputStream outputStream = new FileOutputStream(path + "/" + this.getFileFileName());
			byte[] buf = new byte[1024];
			int length = 0;
			while ((length = inputStream.read(buf)) != -1)
			{
				outputStream.write(buf, 0, length);
			}
			inputStream.close();
			outputStream.flush();
			message = fileFileName;
			File imageFile = new File(path + "/" + fileFileName);
			Image image = ImageIO.read(imageFile);
			width = image.getWidth(null);
			height = image.getHeight(null);
		}
		catch (Exception e)
		{
			e.printStackTrace();
			message = "对不起,文件上传失败了!!!!";
		}
		return SUCCESS;
	}
}


文件可以上传成功。
客户端代码:
<%@ 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">
<title>Struts2 、jquery之ajaxfileupload异步上传插件</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/ajaxfileupload.js"></script>
<script type="text/javascript">
    function ajaxFileUpload()
    {
        $.ajaxFileUpload
        (
            {
                url:'uploadPic.gp',//用于文件上传的服务器端请求地址
                secureuri:false,//一般设置为false
                fileElementId:'file',//文件上传空间的id属性  <input type="file" id="file" name="file" />
                dataType: 'json',//返回值类型 一般设置为json
                success: function (data, status)  //服务器成功响应处理函数
                {
            //从服务器返回的json中取出message中的数据,其中message为在struts2中action中定义的成员变量
                    $("#pic").val(data.message);
                    $("#width").val(data.width);
                    $("#height").val(data.height);
                    if(typeof(data.error) != 'undefined')
                    {
                        if(data.error != '')
                        {
                            alert(data.error);
                        }
                        else
                        {
                            alert(data.message);
                        }
                    }
                },
                error: function (data, status, e)//服务器响应失败处理函数
                {
                    alert(e);
                }
            }
        )
        return false;
    }
    </script>
</head>
<body>
<p align="center">Struts2 、jquery之ajaxfileupload异步上传插件</p>
<table align="center"  border="1" cellpadding="0" cellspacing="0">
<tr>
<td>图片地址:</td>
<td>
<input type="text" name="pic" id="pic" />
<br/>
<input type="file" id="file" name="file" />
<input type="button" value="上传" οnclick="return ajaxFileUpload();">
</td>
</tr>
<tr>
<td>图片宽度:</td>
<td>
<input type="text" name="width" id="width" />
</td>
</tr>
<tr>
<td>图片高度:</td>
<td>
<input type="text" name="height" id="height" />
</td>
</tr>
</table>
</body>
</html>

总是执行action以后,返回的下载框,郁闷呀,请帮忙啦!我用是Struts2.1.8.1,自带的插件,采用
配置文件的形式可以成功,也就是这样的可以成功
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <package name="struts2" extends="json-default">
        <action name="fileUploadAction" class="com.jackie.ajaxfile.action.AjaxFileUploadAction">
            <result type="json" name="success">
                <param name="contentType">
                    text/html
                </param>
            </result>
            <result type="json" name="error">
                <param name="contentType">
                    text/html
                </param>
            </result>
        </action>
    </package>
</struts>   
注解的不能成功。

------------------------------------------------------------------------------------------------------------------
问题补充:
ymw3607 写道
出现下载文件对话框,原因是
JSON插件将HTTP响应(Response)的MIME类型设为“application
/json”

怎么解决呢?

------------------------------------------------------------------------------------------------------------------
问题补充:
ymw3607 写道
出现下载文件对话框,原因是
JSON插件将HTTP响应(Response)的MIME类型设为“application
/json”

params = { "contentType", "application /json" }

我早试验了,我这样设置,照样是下载框。郁闷! 


------------------------------------------------------------------------------------------------------------------
问题补充:
angel243fly 写道
感觉这个问题是浏览器的问题。
好像IE显示服务器端返回的JSON数据时就提示下载框,FF和chrome没有这个问题

ff试验了,也是下载框

------------------------------------------------------------------------------------------------------------------
问题补充:
fengyie007 写道
results = {@Result(name = "success", type = "json",params = {"contentType", "text/html"})}
把results设置改成这个试试。
这个params是传给json result的。

你用xml配置时
<result type="json" name="success">
                <param name="contentType">
                    text/html
                </param>
            </result>
这个参数就是传给json result的。但你用注解时未添加这个参数。
你添加的那个params是传给action用的。



你说改成这样的?
@Action(value = "uploadPic", results = { @Result(name = "success", type = "json", params = { "contentType", "text/html" }) })

我试验了,还是载框。郁闷!

采纳的答案

2011-08-22 fengyie007 (初级程序员)
results = {@Result(name = "success", type = "json",params = {"contentType", "text/html"})}
把results设置改成这个试试。
这个params是传给json result的。

你用xml配置时
<result type="json" name="success">
                <param name="contentType">
                    text/html
                </param>
            </result>
这个参数就是传给json result的。但你用注解时未添加这个参数。
你添加的那个params是传给action用的。

提问者对于答案的评价:
谢谢!
额外加分:5

其他回答

感觉这个问题是浏览器的问题。
好像IE显示服务器端返回的JSON数据时就提示下载框,FF和chrome没有这个问题
angel243fly (初级程序员) 2011-08-21
出现下载文件对话框,原因是
JSON插件将HTTP响应(Response)的MIME类型设为“application
/json”
ymw3607 (初级程序员) 2011-08-22
引用
总是执行action以后,返回的下载框,郁闷呀,请帮忙啦!

你用什么浏览器执行的?用firebug看看返回的响应是什么样子的.
myali88 (资深架构师) 2011-08-22
你这个上传调用是用同步方式调用的吧。
所以返回内容是直接由浏览器解析,浏览器会把application /json类型当作下载文件。浏览器只能直接显示html代码,所以你把参数设置成这个试试。
params = { "contentType", "text/html" } 。

异步方式调用才应该设置为application /json吧。
fengyie007 (初级程序员) 2011-08-22
不是设置params = { "contentType", "text/html" } 哦。
是返回信息应该不能设置为JSON类型吧。
fengyie007 (初级程序员) 2011-08-22
我按作者的意思模拟了一下:
Java代码 复制代码  收藏代码
  1. @Action(   
  2.         value = "say" ,   
  3.         results = {   
  4.             @Result( name = "success" , type="json" , params = { "contentType""text/html" })   
  5.         }   
  6.     )   
  7.     public String say() {   
  8.         height = 20;   
  9.            
  10.         return "success";   
  11.     }   
  12.       
@Action(
		value = "say" ,
		results = {
			@Result( name = "success" , type="json" , params = { "contentType", "text/html" })
		}
	)
	public String say() {
		height = 20;
		
		return "success";
	}
	

没有加
Java代码 复制代码  收藏代码
  1. params = { "contentType""text/html" }  
params = { "contentType", "text/html" }
前,只有Chrome可以正常返回,FF和IE都返回下载框。而加上后,三种浏览器都返回正常。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值