20210621のJavaに関する記事は5件です。

Jasper帳票PDF出力備忘メモ ~ 複数のリストによる帳票出力 ~

上記記事の続き 前回の帳票PDF出力では、JRBeanCollectionDataSourceを利用してListに格納された値をJasperテンプレートに埋め込んで帳票出力を行っていたが、今回は複数のListをテンプレートに埋め込む方法について検証したのでその時の内容を備忘メモとして残す。 基本的にはこちらに記載されている内容の通りである。 また、コードの実装例などは大幅に省略しているので細かいことは前回の記事を参照すること Jasper側の実装 1. データセット/パラメータの作成 Outlineで右クリックを選択し、Create Datasetを選択すると下記画面が表示されるので必要事項を入力しデータセットを作成する。 Dataset name:データセット名を入力 Data Adapter:「New Data Adapter -Collection of JavaBeans」を選択 Outline上に作成したDataset1が表示されるので、Dataset1のFieldsを右クリックでCreate Fieldを選択し、フィールドを作成する。 Field01 Name: name  Class:java.lang.String Field02 Name: parameter Class:java.lang.String 次にOutlineからParametersを選択しパラメータを追加する。 設定値は下記の通りである。 Name:datasource1 Class:java.util.List XMLでは下記の設定となる。 <!-- データセット定義 --> <subDataset name="Dataset1"> <field name="name" class="java.lang.String"/> <field name="parameter" class="java.lang.String"/> </subDataset> <!-- パラメータ定義 --> <parameter name="datasource1" class="java.util.List"/> 2. Listの作成 PaletteからListを選択し、データセットとして先ほど作成したDataset1を指定する。 Connectionでは「Use a JRDatasource expression」を選択し、下記設定を指定する。 $P{datasource1}には上で作成したパラメータ名を指定すること。 new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{datasource1}) List fieldsでDataset1のフィールドを選択する。 List作成後、下図のListを選択するとリスト部の編集画面が表示されるの文字幅やフォントなど細かな設定を行う。 以上の作業を行った場合、XMLでは下記の設定となる。 <componentElement> <reportElement x="261" y="65" width="100" height="30" uuid="46944fc3-2ae0-4385-9dc2-8f347b76c260"/> <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd"> <datasetRun subDataset="Dataset1" uuid="53aa30da-b1f7-4221-b76c-a72666e1a6f9"> <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{datasource1})]]></dataSourceExpression> </datasetRun> <jr:listContents height="30" width="100"> <textField> <reportElement x="0" y="0" width="50" height="30" uuid="ac884e55-7578-4e95-aea3-955a56ee00aa"/> <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression> </textField> <textField> <reportElement x="50" y="0" width="50" height="30" uuid="5e8b1136-3781-41e0-bfdc-7e32fed0e30c"/> <textFieldExpression><![CDATA[$F{parameter}]]></textFieldExpression> </textField> </jr:listContents> </jr:list> </componentElement> Java側の実装 新たなリスト項目として下記Entityクラスを用意する。 Entiry.java @Getter @Setter public class Entity{ private String name; private String parameter; } 帳票出力処理として下記を実装する。 //Entityクラスのリストを準備 List<Entity> entityList= new ArrayList<>(); Entity entity01 = new Entity(); entity01.setName("Test User01"); entity01.setParameter("Parameter01"); entityList.add(entity01); Entity entity02 = new Entity(); entity02.setName("Test User02"); entity02.setParameter("Parameter02"); entityList.add(entity02); //parameterMapの作成 HashMap<String, Object> parameterMap = new HashMap<String, Object>(); parameterMap.put("datasource1", entityList); //前回同様JasperFillManagerでparameterMapを渡す JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameterMap, jrBeanCollectionDataSource); JasperExportManager.exportReportToPdfFile(jasperPrint, "jasper.pdf"); 出力結果 これらの設定後、PDF出力を実行した結果が下図である。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

一方通行(グラフ上の移動) Java編

 題意が上手くくみ取れずいったん放置。しかる後お手本を参考に。  お手本では「幅優先探索の一種」ということでC++のQueueを使っていたが、どう見ても可変長な二重配列。  Javaで再現するには……と悶々考えた結果、 「前の問題を活かそうぜ。そういう仕組みだろ」  となり、隣接リストを利用する形になった。 「あ、グラフ理論ってそういうこと……」と漠然とした実用法が見えた気がする。するだけ。 コード import java.util.Scanner; import java.util.ArrayList; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); //頂点の数 ArrayList<Integer> visit = new ArrayList<Integer>(); //訪れた順番 int[] done = new int[n]; //訪れたかどうかのチェック(boolでもいいかも) //ArrayListを二次元で作る(隣接リスト) ArrayList<ArrayList<Integer>> g = new ArrayList<ArrayList<Integer>>(); for(int i=0; i<n; i++){ ArrayList<Integer> gin = new ArrayList<Integer>(); g.add(gin); } for(int i=0; i<n-1; i++){ //辺を取り込んでgに入れる int a = sc.nextInt(); int b = sc.nextInt(); a--; b--; g.get(a).add(b); g.get(b).add(a); } visit.add(0); //最初は1(0)からスタートなので埋め込んでおく done[0] = 1; //引数0(頂点1)は訪れた扱い while(visit.size() != n){ //処理していけばいずれvisitはNに辿り着く int now = visit.get(visit.size()-1); //現在地はvisitの最後尾から取得 for(int j=0; j<g.get(now).size(); j++){ //頂点によって辺は1つか2つ if(done[g.get(now).get(j)] == 0){ //頂点をdoneしていないなら visit.add(g.get(now).get(j)); //visitの末尾に挿入して done[g.get(now).get(j)] = 1; //doneを1にする } } } for(int i=0; i<n; i++){ System.out.println(visit.get(i)+1); } } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Springbootで「HelloWorld」

Springbootで「HelloWorld」を表示する 開発環境 Windows 10 Home 64bit Eclipse Version: 2021-03 (4.19.0) Java 11 Springbootでプロジェクトを追加する ファイル → 新規 → Springスターター・プロジェクト プロジェクト名を決める デフォルトロケーションを使用 * 型:Gradle * Javaバージョン:11 * パッケージリング:Jar * 言語:Java で次へ 依存関係選択 Thymeleaf Spring web を選択して完了 このような階層構造でJavaファイルが生成される プロジェクト上で右クリック → 実行 → Spring boot App コンソールにこのように表示されたら、作成成功! HTMLファイルの作成 プロジェクト上で右クリック → 新規 → その他 → HTMLファイル 今回【test.html】というファイル名で作成 親フォルダーを入力または選択は:TestHello/src/main/resources/templates をパスで指定して新規作成 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> <h1>Hello World!</h1> ようこそ、Springbootの世界へ </body> </html> いったん上記のよう<title>にタイトルと、<body>にテキストを記述 クラスファイルの作成 プロジェクト上で右クリック → 新規 → クラス 【TestController】というクラス名で作成 このような構成で.Javaファイルが作成されます。 package com.example.demo; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller //ClassにControllerのアノテーション public class TestController { //RequestMappingのアノテーション @RequestMapping(value = "/", method = RequestMethod.GET) public String test(Model model) { return "test"; //"test"は表示したいHTMLの名前(拡張子不要) } } 上記のようにコードを記述 実行とブラウザに表示 保存したら プロジェクト上で右クリック → 実行 → Spring boot App ブラウザでhttp://localhost:8080/にアクセスして、テキストが表示されるか確認 Controllerからテキストを渡す HTMLのコードに xmlns:th="http://www.thymeleaf.org"(Thymeleafの属性) th:text = "${テキスト}"を加える。後述のControllerのコードで ここにデータ名が渡される。 どちらもHTMLのタグ内に記述する <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title >test</title> </head> <body> <h1 th:text = "${title}">HelloWorld!</h1> ようこそ、Springbootの世界へ! </body> </html> Controllerのファイルには model.addAttribute("title","テキスト");を加える 引数のテキストがth:textに渡される その際HTMLにテキストがあっても上書きされる public class TestController { //RequestMappingのアノテーション @RequestMapping(value = "/", method = RequestMethod.GET) public String test(Model model) { model.addAttribute("title", "th:textで出力した場合はHTMLは上書きになる" );//Controllerから送りたいテキスト return "test"; //"test"は表示したいHTMLの名前(拡張子不要) } } 以上 Thymeleafを使いこなせるように頑張って、また続き書きます
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VSCodeでserialVersionUIDを自動生成したい!【2021/04~】

こんな人のための記事 Language Support for Java(TM) by Red Hat では 0.77.0 (April 15th, 2021) 以降、 Serializableの実装クラスで serialVersionUIDが未定義のクラスに対して Warningが出ないようになりました。 え!? Warningが出なかったら、Quick fix から Add generated serial version ID できないじゃん!! 見つけるのはWarningを消す記事ばかり 大体の「Warningを消したい」サイトには、アノテーションを追加するか .settings/org.eclipse.jdt.core.prefs org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore を追記しろという話でした。 逆手に取りましょう。 デフォルトがignoreになったなら、出すためにobeyを追記しよう! .settings/org.eclipse.jdt.core.prefs org.eclipse.jdt.core.compiler.problem.missingSerialVersion=obey これで無事にWarningが出てAdd generated serial version ID ができるようになります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】Map+繰り返し+条件分岐をした際にうまくいかなかった原因

起こった問題 Listの中に入っているMapを繰り返し処理で取り出して条件分岐させたのですが、うまくいきませんでした。 問題のコード List<Map<String, String>> list = new ArrayList<Map<String,String>>(); Map<String, String> map = new HashMap<String, String>(); map.put("name", "hello"); map.put("name2", "hello2"); list.add(map); for(Map<String, String> map2 : list) { if(map2.get("name") == "hello") { System.out.println("hi"); } } // =>表示されない 原因 Javaの文字列比較で==演算子は使うことがNGだったようです。 簡単に紹介すると 比較している内容が メモリ上のアドレスを比較するのか(==演算子) メモリ上のアドレスに置いてあるデータを比較するのかの違いだそうです。(equalsメソッド) 下記の記事を参考にしました。 [Java]文字列比較で==はダメ、equalsが正解!・・・なんだけど、その理由をちゃんと知ろう! 解決策 上でも軽く触れていますが、==からequalsメソッドに変えることで解決します。 List<Map<String, String>> list = new ArrayList<Map<String,String>>(); Map<String, String> map = new HashMap<String, String>(); map.put("name", "hello"); map.put("name2", "hello2"); list.add(map); for(Map<String, String> map2 : list) { if(map2.get("name").equals("hello")) { System.out.println("hi"); } } // =>hi // しっかり表示されました。 おわりに springを用いてDBから値を取り出して加工するプログラムを書いている際に起こった問題でした。 DBから値を取り出していたので、文字コードが変わっているんじゃないかと考えたのですが、全くダメで、結局解決策はすごく単純でした。 自分はまだスキルが乏しく、あまり気づけないことも多いので、もっと勉強していきたいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む