Struts2 Chapter 7&8 :文件的上传和下载,图形报表的生成part1

 
<!--
	Struts2 Chapter 7&8 :文件的上传和下载,图形报表的生成part1
	Goal:今天将详细讲到上传的各种配置,以及文件的下载(可包含中文),以及图形报表的生成
-->

一,文件的上传,高级篇

回顾一下昨天写的文件上传:

------------点这里进行回顾-------------

这次这个高级的:
	1)一个action类(这个没变):
	public class FileAction extends ActionSupport{
		
		private File myFile;//别忘了要和表单中的file的name相同哦
		private String myFileFileName;//别忘了是XXX+FileName
		private Srring myFileContentType;//XXXX+ContentType表示类型
		
		//省略getter&setter,以及try_catch_finally模块
		
		//上传的方法
		public String uploadFile(){
			FileInputStream fin=new FileInputStream(myFile);
			FileOutputStream fout=new FileOutputStream(ServletActionContext.getServletContext().getRealPath("/")+myFileFileName);
			byte[] data=new byte[1024];
			int len=0;
			while((len=fin.read(data))>0){
				fout.write(data,0,len);
			}
		}
	}
	
	2)配置action(这个变化巨大),以及不能忘记在web.xml中配置过滤*.jsp页面:
	<struts>
		
		//注意在struts中默认上传文件最大为2MB,所以我们要写个常量来更正
		<constant name="struts.multipart.maxSize">可上传的最大字节数</constant>
		
		//加载系统拦截器,达到拦截用户上传数据的效果
		<interceptors>
				<!--位于struts-core>default-struts.xml中的defaultStack-->
			 <interceptor-stack name="myStack">
          <interceptor-ref name="exception"/>
          <interceptor-ref name="alias"/>
          <interceptor-ref name="servletConfig"/>
          <interceptor-ref name="i18n"/>
          <interceptor-ref name="prepare"/>
          <interceptor-ref name="chain"/>
          <interceptor-ref name="debugging"/>
          <interceptor-ref name="scopedModelDriven"/>
          <interceptor-ref name="modelDriven"/>
          <interceptor-ref name="fileUpload">
          	<!--控制最大长度-->
          	<param name="maximumSize">字节数(1024字节=1k)</param>
          	<!--控制上传的文件格式-->
          	<param name="allowedTypes">image/pjpeg</param>
          	<!--更多的可以参照struts-core.org.apache.struts2.interceptor.FileUploadInterceptor.class-->
         	</interceptor-ref>
          <interceptor-ref name="checkbox"/>
          <interceptor-ref name="multiselect"/>
          <interceptor-ref name="staticParams"/>
          <interceptor-ref name="actionMappingParams"/>
          <interceptor-ref name="params">
            <param name="excludeParams">dojo\..*,^struts\..*</param>
          </interceptor-ref>
          <interceptor-ref name="conversionError"/>
          <interceptor-ref name="validation">
              <param name="excludeMethods">input,back,cancel,browse</param>
          </interceptor-ref>
          <interceptor-ref name="workflow">
              <param name="excludeMethods">input,back,cancel,browse</param>
          </interceptor-ref>
       </interceptor-stack>
		</interceptors>
		
		<package name="myPack" extends="struts-default" namespace="/">
			<action name="*File" class="com.shu.action.FileAction" method="{1}">
				<!--引入拦截器-->
				<interceptor-ref name="myStack"/>
				<result name="input">验证不成功是需要跳转的页面</result>
				//....
			</action>
			
		</package>
		
	</struts>
	
	3)页面中:
	<form action="uploadFile.action" enctype="multipart/form-data" method="post"><!--记得上午忘记写method了,结果纠结了半天~晕-->
		<input type="file" name="myFile"/>
		<input type="submit"/>
		<s:fieldError/><!--打印错误信息,不能忘记导入struts标签库哦-->
	</form>
	
	4)显示友好的页面提示信息
		当用户上传的东西被拦截后,就会在页面中产生提示,但是这个提示非专业人士看不懂得!
		所以呢~我们就要在页面中产生友好的提示信息:
		找到:struts-core>org.apache.struts2>org.apache.struts2,
		在那个里面去找到对应的错误提示信息,然后在自己的properties文件中写入相应的提示即可!
		eg:
		struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}
		struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}
		-->变为(注意是放到properties文件中的,就是那个切换预言时写的那个,还是要注意中文编码问题!):
		struts.messages.error.file.too.large=Sorry~The file is too large to upload!
		struts.messages.error.content.type.not.allowed=Sorry~This kind of file is not allowed to upload!
		
	这样高级上传就OK了~
	
二,文件的下载:

	1)在action类中,为了解决中文问题,这里直接就讲最好的一种方法:
		public class FileAction{
			//一个必须的字段,表示文件名
			private String fileName;
			//省略getter&setter
			
			//上传时需要调用的方法,注意:返回类型为inputStream,并且以get开头
			public InputStream getFileData(){
				//这个本该是写道action配置文件中的,但是写到这边为了是解决中文问题!
				/*
				*如果这个要写道配置文件中,应该这样写:
				*<param name="contentDispositon">attachment;${fileName}</param>
				*/
				ServletActionContext.getResponse().setHeader(
					"content-disposition",
					"attachment;fileName="+URLEncoder.encode(fileName,"UTF-8");
				);
				
				FileInputStream fin=new FileInputStream(ServletActionContext.getServletContext().getRealPath("/")+fileName);
				//注意这个流不能关
				return fin;
			}
			
			//然后写一个让action可以访问的方法
			public String downLoad(){
				return "downLoad";
			}
		}
	
	2)struts.xml配置文件中:
		<struts>
			<package name="myPack" extends="struts-default" namespace="/">
				<action name="*File" class="com.shu.action.FileAction" method="{1}">
					<!--配置一个downLoad方法返回的值,并且注意type-->
					<result name="downLoad" type="stream">
						<!--这里写类中真正执行的方法,注:去掉get,首字母小写-->
						<param name="inputName">fileData</param>
					</result>
				</action>
			</package>
		</struts>
		
	3)页面中:
		<a href="downLoadFile.action?fileName=现代战争3.rar">Call Of Duty:Mordren Warfare3</a>
		
	4)拓展:
		这里如果当保存对话框弹出后,用户取消保存,那么在服务器端就会报错,据说是个正常的错,呵呵~,
		为了避免这样,我们要在struts.xml中的配置文件中这样写(前提是导入:struts2-sunspoter-stream-1.0.jar):
		<struts>
			<result-types>
				<result-type name="myStream" class="com.sunspoter.lib.web.struts2.dispatcher.StreamResultX"></result-type>
			</result-types>
			<package name="myPack" extends="struts-default" namespace="/">
				<action name="*File" class="com.shu.action.FileAction" method="{1}">
					<!--注意这里的type已经是我们上面定义的那个了!-->
					<result name="downLoad" type="myStream">
						<param name="inputName">fileData</param>
					</result>
				</action>
			</package>
		</struts>
		
		这样就解决了那个问题了~其实也就只是在catch块中什么也没有写!这个~你懂得!
		
三,图形报表的生成!
	哎呀~今天写这么多~都有点累了,两个肩头比较有点不舒服~呵呵~坚持写完吧~
	必需的两个包:jcommon-1.0.16.jar,jfreechart-1.0.13.jar
	然后,我就偷点懒,直接写java代码了,就不写什么类了!
	注意,在前面不要忘了写这些东西(为的是解决中文问题):
	
	response.setContentType("image/jpeg");
	//创建主题样式  
	StandardChartTheme standardChartTheme = new StandardChartTheme("CN");  
	//设置标题字体  
	standardChartTheme.setExtraLargeFont(new Font("隶书", Font.BOLD, 20));  
	//设置图例的字体 
	standardChartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 15));  
	//设置轴向的字体  
	standardChartTheme.setLargeFont(new Font("宋体", Font.PLAIN, 15));  
	//应用主题样式  
	ChartFactory.setChartTheme(standardChartTheme); 
	
	1)生成饼状图:
	public void pieDataPic(){
		//先实例化数据!
		DefaultPieDataset data=new DefaultPieDataset();
		data.setValue("名称",数据量);
		data.setValue("名称",数据量);
		data.setValue("名称",数据量);
		data.setValue("名称",数据量);
		data.setValue("名称",数据量);
		
		//实例化数据图形对象
		//JFreeChart jfc=ChartFactory.createPieChart("图表名称",数据,是否显示图列,这个不大清楚,是否允许连接);
		JFreeChart jfc=ChartFactory.createPieChart("编程语言--饼状图",data,true,true,false);
		
		//输出该图
		ChartUtilities.writeChartAsJPEG(response.getOutputStream(),jfc,500, 400);
	}
	
	2)生成柱状图:
	public void barDataPic(){
		DefaultCategoryDataset dcd=new DefaultCategoryDataset();
		data.setValue(数据量,"这个可不写","所在列名");
		data.setValue(数据量,"这个可不写","所在列名");
		data.setValue(数据量,"这个可不写","所在列名");
		data.setValue(数据量,"这个可不写","所在列名");
		JFreeChart jfc2=ChartFactory.createBarChart3D("图表名称","x轴名称","y轴名称", dcd,PlotOrientation.VERTICAL,true,true,false);
		ChartUtilities.writeChartAsJPEG(response.getOutputStream(), jfc2, 400, 500);
	}
	
	3)折线图:
	public void barDataPic(){
		DefaultCategoryDataset dcd=new DefaultCategoryDataset();
		data.setValue(数据量,"这个可不写","所在列名");
		data.setValue(数据量,"这个可不写","所在列名");
		data.setValue(数据量,"这个可不写","所在列名");
		data.setValue(数据量,"这个可不写","所在列名");
		JFreeChart jfc2=ChartFactory.createLineChart("图表名称","x轴名称","y轴名称", dcd,PlotOrientation.VERTICAL,true,true,false);
		ChartUtilities.writeChartAsJPEG(response.getOutputStream(), jfc2, 400, 500);
	}
	
<!--
Author:Lovingshu's Forever
Date:2011-11-01 21:39
Remark:写了这么多~有点来不起了~该放松下了~呵呵~
Single man's day?~whatever
-->	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值