SSHの研究ノート(C)

第三に、プロジェクト開発

小さな機能に小さなプロジェクトの前に追加され、次の、動的にApacheのPOIコンポーネントを使用するために、EXECLファイルやダウンロードを生成し、このパッケージは、デフォルトでロード春となっています

1、UserService.javaを添加する方法

公共のInputStreamのgetInputStream();

その実装クラスで達成

パッケージcom.test.service.impl。インポートのjava.io.File; 輸入java.io.FileInputStream; 輸入java.io.FileNotFoundException。輸入java.io.FileOutputStreamは、輸入java.io.InputStreamを。インポートにjava.io.OutputStream; 輸入はjava.util.List; 輸入org.apache.poi.hssf.usermodel.HSSFCell; 輸入org.apache.poi.hssf.usermodel.HSSFRow。輸入org.apache.poi.hssf.usermodel.HSSFSheet。輸入org.apache.poi.hssf.usermodel.HSSFWorkbook; 輸入com.test.bean.User。輸入com.test.dao.UserDAO。輸入com.test.service.UserService。パブリッククラスUserServiceImplはUserServiceの{プライベートUserDAO userDaoを実装します。公共ボイド削除(ユーザユーザ){// TODO自動生成方法スタブthis.userDao.removeUser(ユーザ)。}パブリックリスト<ユーザ>のfindAll(){// TODO自動生成方法スタブ戻りthis.userDao.findAllUsers()。}パブリックユーザfindById(整数ID){// TODO自動生成方法スタブリターンthis.userDao.findUserById(ID)。(ユーザユーザ){// TODO自動生成方法スタブthis.userDao.saveUser(ユーザー)に保存}公共ボイド。}公共ボイド更新(ユーザユーザ){// TODO自動生成方法スタブthis.userDao.updateUser(ユーザ)。}公共UserDAO getUserDao(){userDaoを返します。}公共ボイドsetUserDao(UserDAO userDao){this.userDao = userDao。}公共のInputStreamのgetInputStream(){HSSFWorkbookのWB =新しいHSSFWorkbook()。//生成ececl HSSFSheetシート= wb.createSheet( "シート1")。//创建シート1 HSSFRow行= sheet.createRow(0)。//创建一行HSSFCellセル= row.createCell((ショート)0)。//一个单元格cell.setEncoding(HSSFCell.ENCODING_UTF_16)。//设置字符集cell.setCellValue( "序号"); セル= row.createCell((ショート)1)。cell.setEncoding(HSSFCell.ENCODING_UTF_16)。cell.setCellValue(」

一時ファイルは、ApacheでTest.xlsをbinディレクトリを作成しました

2、com.test.user.actionの新しいGenerateExcelAction.java

パッケージcom.test.action.user。輸入java.io.InputStreamを。輸入com.opensymphony.xwork2.ActionSupport。輸入com.test.service.UserService。パブリッククラスGenerateExcelActionはActionSupport {プライベートUserServiceのサービスを拡張します。公共UserServiceののgetService(){RETURNサービス。}公共ボイドsetService(UserServiceのサービス){this.service =サービス。}公共のInputStream getDownloadFile(){(this.service.getInputStreamを返します)。} @Overrideパブリック文字列(実行){SUCCESSを返す例外をスローします。}}

structs.xmlでアクション文を追加します。

<アクション名= "generateExcel" クラス= "generateExcelAction"> <結果名= "成功" タイプ= "ストリーム"> <! - ノート型ストリーム - > <PARAM NAME = "contentTypeの">アプリケーション/ vnd.ms -excel </ param>の<! - ファイルタイプ - >の<paramの名前= "contentDisposition">ファイル名= "AllUsers.xls" </ param>のの<paramの名前<! - - ブラウザがファイル名レンダリング>を= "inputName"> downloadFile </ param>の<! - ファイルのダウンロード方法はgetDownloadFileある - > </> </アクションを結果>

applicationContext.xmlを、アクション文を追加します。

<ビーンのid =「generateExcelAction」クラス=「com.test.action.user.GenerateExcelAction」スコープ=「シングルトン」> <! - ノークラスの状態、シングルトンに構成することができる - > <プロパティ名=「サービス」参照= "UserServiceの"> </ property>の</豆>

list.jspにリンクを追加

<S:のhref = "index.jspの">ホームページ</ sの:> <BR> <BR> <S:のhref = "generateExcel.action">生成エクセル</ sの:A>

さて、この機能が完了しました。


図3は、しかし、問題がある:プログラムは、この文書を書くことで、接続がある場合には、単にファイルをダウンロードするには、別の接続があり、これは紛争につながる、中間ファイルを生成します。解決策は2つあります:1)、各接続のための接続は、速やか途中のファイルを削除して終了すると、中間ファイルのランダムな名前を生成します。2)、出力メモリに直接流れ、一時ファイルを生成しないように、直接、入力ストリーム配信クライアントを生成するために、ポイント4に記載の方法。

第一の方法では、2つの方法があります:彼らは、ランダムな文字列を生成するコードを記述するか、サードパーティのライブラリを使用します。次のように独自のコードワードを書き込むには:

プロジェクト内の新しいパッケージcom.test.util、パッケージの新しいCharacterUtils.java

valueOf((チャー)の結果))。//ブレーク; //ケース1://結果=恐らくMath.round(Math.random()* 25 + 97)。// sb.append(String.valueOf((チャー)の結果))。//ブレーク; //ケース2:// sb.append(。String.valueOf(新しいランダム()nextInt(10))); //ブレーク; //} //} // // sb.toString()を返します。//} //パブリック静的無効メイン(文字列[] args){// //するSystem.out.println(getRandomString2(10))。//}}

UserServiceImpl.javaは変更のtest.xml場所で発生しました

文字列filename = CharacterUtils.getRandomString(10)。fileNameに=新しいStringBufferの(fileNameに).append( "XLS。")のtoString(); ファイルファイル=新しいファイル(filename);

ランダムな文字列を生成する効果を達成するために、パッケージには、Apacheのは、以下の態様を提供することができます:
UserServiceImpl.javaをのtest.xmlを生成するための場所で

文字列filename = RandomStringUtils.randomAlphanumeric(10)。// apacheの提供的方法fileNameに=新しいStringBufferの(fileNameに).append( "XLS。")のtoString(); ファイルファイル=新しいファイル(filename);

一時ファイルを削除するには、次の、我々のアプローチは、ファイルの生成が良いです後20分のスレッドがこのファイルを削除し、Apacheのbinディレクトリに一時ファイルがあった場合、もしあれば、初期化中に()メソッドをチェックする際たびにサーバが起動されますその後、削除されました。
UserServiceImpl.javaに追加しました

新しいスレッド(新しいRunnableを(){公共ボイドラン(){)({* 60 20000のThread.sleepを試してみてください; //スリープ20分}キャッチ(InterruptedExceptionある電子){e.printStackTrace();} file.delete(); //;)(開始)}}一時ファイルを削除

パッケージDeleteFileServlet.javaの新しい新しいパッケージcom.test.servlet、Apache Tomcatの起動時間にbinディレクトリに一時ファイルを削除するには、サーブレットのXLS、ユーザーがサーブレットにアクセスすることはできません、サーブレットはのみ(INITを実装する必要があります)方法、必要なしのdoGet()、doPostメソッド()、サーブレットマッピングを必要としません。

パッケージcom.test.servlet。インポートのjava.io.File; 輸入java.io.FileFilter。輸入javax.servlet.ServletException; 輸入javax.servlet.http.HttpServlet。パブリッククラスDeleteFilesServlet)はHttpServletを{公共空破壊(){}公共ボイドのinitを(拡張ServletExceptionが{//方法一比较简单//ファイルファイル=新しいファイルをスローします( ""); //获取当前目录文件//ファイル[]サブファイルの=のfile.listFiles()。//(ファイルF:サブファイル)のための// {//場合(f.getName()endsWith( "XLS"))// {// f.delete()。//} //} //方法二、使用FileFilterのファイルファイル=新しいファイル( ""); ({};} falseを返す。{trueを返す)パブリックブール受け入れる(ファイルパス名){IF(pathname.getName()endsWith( "XLS")}新しいFileFilterの())[]サブファイルの=のfile.listFilesファイル。用(ファイルF:サブファイル){f.delete()。}}}

web.xmlに参加

<サーブレット>の<servlet-name>のDeleteFilesServlet </サーブレット名>の<servlet-class>のcom.test.servlet.DeleteFilesServlet </サーブレットクラス>の<load-on-startup> 8 </のload-on-startup> < /サーブレット>

 

4.さて、今、第二の方法を見て、出力ストリームに直接一時ファイルを生成しません。この場合、ステップ3では、全てはUserServiceImpl.javaで直接、実行する必要があります

ByteArrayOutputStream OS =新しいByteArrayOutputStream(); //不生成临时文件{wb.write(OS)をしてみてください。}キャッチ(IOExceptionを電子){e.printStackTrace(); }バイト[]コンテンツ= os.toByteArray()。入力ストリームは=新しいれるByteArrayInputStream(コンテンツ)です。リターンがあります。

 

これまでのところ、システムが完成されています。

付録:

参照する全音符[ロングXiのオリジナル] Struts2.Hibernate3.2.Spring2.0統合(空中)、 SSHの概要のための良いビデオチュートリアルです

プロジェクトソースhttp://www.kuaipan.cn/file/id_3287587011724175.html


 


 


 



 

ます。https://www.cnblogs.com/moiyer/archive/2011/08/24/2316165.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34162228/article/details/94693166