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
-->	
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章