- 投稿日:2020-08-20T23:36:31+09:00
jsf.ajax.request: Method must be called within a formとなった時の対応方法
- 環境
- CentOS Linux release 7.8.2003 (Core)
- Eclipse IDE for Enterprise Java Developers.Version: 2020-03 (4.15.0)
- openjdk version "11.0.7" 2020-04-14 LTS
- JSF 2.3.9
事象 : f:ajaxを使った処理を実行したら怒られた
なんか動かないと思ったら、Chromeの開発ツールのConsoleにエラーが出ていた
Chromeの開発ツールのConsoleに出たエラーjsf.js.jsf?ln=javax.faces:1 Uncaught Error: jsf.ajax.request: Method must be called within a form at Object.request (jsf.js.jsf?ln=javax.faces:1) at Object.ab (jsf.js.jsf?ln=javax.faces:1) at HTMLInputElement.onclick (upload.jsf:12)原因 : formタグがないから
うっかりformタグを忘れていた。
xhtml<body> <!--省略--> <h:commandButton value="閉じる" action="#{uploadBean.close}"> <f:ajax onevent="windowClose" /> </h:commandButton> </div> </body>出力されたhtml<input id="j_idt11:j_idt14" type="submit" name="j_idt11:j_idt14" value="閉じる" onclick="mojarra.ab(this,event,'action',0,0,{'onevent':windowClose});return false">対応 : formタグの中にf:ajaxを配置する
xhtml<body> <h:form> <!--省略--> <h:commandButton value="閉じる" action="#{uploadBean.close}"> <f:ajax onevent="windowClose" /> </h:commandButton> </div> </h:form> </body>
- 投稿日:2020-08-20T22:38:00+09:00
kotlinとjavaで前の画面に戻りたい!
はじめに…
この記事は5個前の記事で書いた、
7日間毎日記事投稿の6日目
になってます
使うコードは下に貼りますが、このアプリの詳しい機能はその5個前の記事をご覧ください!
↓ここからが今回の記事の本題です↓
それぞれの言語で前の画面に戻るには…
※これはツールバーの戻るボタンから一つ前の画面に戻るための方法です
ツールバーの実装方法
- javaの場合
Toolbar 変数名 = findViewById(R.id.ツールバーのid); setSupportActionBar(変数);例)
WhoActiity.javaToolbar whoTb = findViewById(R.id.who_tb); // 30行目 setSupportActionBar(whoTb);
- kotlinの場合
setSupportActionBar(ツールバーのid)例)
WhoActivity.ktsetSupportActionBar(who_tb) // 21行目javaはToolBar型の変数を作る必要があるが、kotlinは作る必要がない
ツールバーに戻るボタンをつけて戻る方法
- javaの場合
(onCreate関数内)
getSupportActionBar().setDisplayShowHomeEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);(onCreate関数外)
@Override public boolean onSupportNavigateUp() { finish(); return super.onSupportNavigateUp(); }例)
(onCreate関数内)WhoActivity.javagetSupportActionBar().setDisplayShowHomeEnabled(true); // 32行目 getSupportActionBar().setDisplayHomeAsUpEnabled(true);(onCreate関数外)
WhoActivity.java@Override // 69行目 public boolean onSupportNavigateUp() { finish(); return super.onSupportNavigateUp(); }
- kotlinの場合
supportActionBar?.let { // 22行目 it.setDisplayHomeAsUpEnabled(true) it.setHomeButtonEnabled(true) } ?: IllegalAccessException("Toolbar cannot be null")AndroidManifest.xml<activity android:name=".WhoActivity" android:parentActivityName=".MainActivity" /> // ←ここを追加例)
WhoActivity.ktsupportActionBar?.let { // 22行目 it.setDisplayHomeAsUpEnabled(true) it.setHomeButtonEnabled(true) } ?: IllegalAccessException("Toolbar cannot be null")AndroidManifest.xml<activity // 20行目 android:name=".WhoActivity" android:parentActivityName=".MainActivity" />javaはコードと新しく関数を定義する必要があり、kotlinはコードとAndroidManifest.xmlを編集する必要がある
最後に…
今回はjavaとkotlinでツールバーを使って前の画面に戻りました。
どちらの言語でも画面遷移よりも複雑なコードが必要だと感じました。明日も記事を投稿するので、引き続き温かく見守ってください。
- 投稿日:2020-08-20T21:08:43+09:00
【JAVA】拡張子を除いて、ファイル名のみを取得する
目的
拡張子を除いて、ファイル名のみを取得する
実装例
example.javaimport java.io.File; String fullPathString = "/home/hoge/abc.txt"; public static String getFileName(final String fullPathString) { File file = new File(fullPathString); String basename = file.getName(); String woext = basename.substring(0,basename.lastIndexOf('.')); System.out.println(woext); }String basename = file.getName();getName()メソッドでファイル名を取得する
String woext = basename.substring(0,basename.lastIndexOf('.'));substring()メソッドで第一引数から第二引数文字目までを取得
lastINdexOf()メソッドで末尾から数えて何番目に引数(’.’)があるのか調べるこれでabcが表示されるはず
参考文献
https://java-code.jp/187
https://java-code.jp/795
http://simplesandsamples.com/basename-rmext.java.html
- 投稿日:2020-08-20T18:11:19+09:00
Javaの標準出力を利用し配列から最大値を出力する
某サイトのJavaの練習問題。標準入力で整数nを入力した後、n個の任意の数値を入力してその中から最大値を出力するプログラムのメモ。
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); //整数nを入力 int num = sc.nextInt(); int max = 0; int[] array = new int[num]; //n回任意の数値の入力を行う for(int i = 0; i < num; i++){ array[i] = sc.nextInt(); if(max < array[i]){ max = array[i]; } } System.out.println(max); } }
- 投稿日:2020-08-20T16:36:35+09:00
java8でOpenCVを使えるようにする。(自分用)
コマンドラインでJavaを実行する原始人
大学の卒研でOpenCVを使わざるをえないので導入した
その道しるべ
今検索してもほとんどがPythonやC++での話でjavaの話が少ないので苦労した。参考サイト
基本的に以下のサイトに従順してやりました。基本的にこっちのほうが丁寧です。ただ、今の最新のVer(4.4.0)だとテストコードがうまく実行できないのでそこは書きます。
JavaでOpenCVを使う | JProgramerイソストール
ダウンロードした.exeファイルを実行、Cドライブに展開するのが良いとのことで私はOpenCVなるフォルダを作成しそこに展開。
パスを通す
参考サイトではユーザ変数ですが私はシステム変数に追加しました。
「Path」を選択し、[編集]をクリック。一番下に
C:\OpenCV\opencv\build\java\x86
を追加、OpenCVをjavaで使うだけならこれだけの追加でいい、Pythonで使うとか、VisualStudioで利用するとかならこれだけじゃダメです。
私は一応VS2017が入っているんでそれ用にもパスを通してます。
最後の部分はjavaが32bitなら[x86]、64bitなら[x64]
私はマシンが64bitなので、64bitだと思ってテストコード(後述)を実行したら「俺は32bitだ!64bitのプログラムなんてムリ!」みたいなエラーがでたんで、必ずしもマシンとjavaのbitが同じとは限らないみたいです。テストコード
参考サイトのテストコードはVer.4.4.0ではエラーが出ます。
具体的には画像の出力するクラスがhighguiではなく、imgcodecsに移っています。Test.javaimport org.opencv.core.Core; import org.opencv.core.CvType; import org.opencv.core.Mat; import org.opencv.core.Scalar; import org.opencv.imgcodecs.Imgcodecs; public class Test{ public static void main(String[] args){ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat redImg=new Mat(100,200,CvType.CV_8UC3,new Scalar(0,0,255)); Imgcodecs.imwrite("test.jpg",redImg); } }コンパイルコマンドは以下↓
javac -classpath “C:\保存したフォルダ\opencv\build\java\opencv-バージョン.jar” Test.javaこれを
java -cp .;C:\保存したフォルダ\opencv\build\java\opencv-バージョン.jar Testで実行すると同じフォルダに真っ赤なJPG画像が出力(保存)されました。
クラスパスを設定すると
javac Test.java
java Testで実行できます。詳しくは参考サイトを見てくだちい。
- 投稿日:2020-08-20T15:20:31+09:00
51歳(現52)からのプログラミング 備忘 VScode javadoc
VScodeでjavadocするには拡張が必要です
[ Javadoc Tools ]
これで大丈夫ですね!
- 投稿日:2020-08-20T14:48:50+09:00
javaにelse-ifは存在しないらしい
検証すること
私はある日、
else ifについて、javaではif (flag) { System.out.println("Hi!"); }を波括弧を省略して(三項演算子を使ったほうがいいですが、ここでは考えないこととします)
if (flag) System.out.println("Hello!");とすることができる。もしかしたら、else-ifは、
if (flag) { System.out.println("Hello!"); } else { if (flag2) { System.out.println("Hello World"); } else { System.out.println("hi"); } }の波括弧を省略したものではないかと考えました。
判定方法
波括弧を省略したものとそうでないもののバイトコード(classファイル)が合致するかどうかを調べます。
結果
fcコマンドで比較したところ同じらしい。
参考
https://arakik10.hatenadiary.org/entry/20161206/p1
https://www.k-tanaka.net/cmd/fc.php
- 投稿日:2020-08-20T12:40:43+09:00
javaとpythonの違いを列挙してみた
※注意 気づいたものを順次追記する
java屋さんがpythonを使いだして、違いにびっくりしたものを列挙する。
またその対処方法を残す。switch文
pythonにはswitchにあたる構文がない。
switchがなければifでやればいいじゃないという発想らしい。
もしくは辞書を使った方法もある。Python に switch や case 文がないのはなぜですか?(公式サイト)
辞書で使った方法def function_1(): print('function_1') def function_2(): print('function_2') functions = {'a': function_1, 'b': function_2} func = functions['b'] func() ↓実行結果↓ function_1定数
pythonには厳密な定数はなく、
全部大文字に命名することで運用的に定数のように扱う。
単なる変数なので当然その気になれば変更できる。インターフェイス
pythonにはインターフェイスが存在しない。
ABC(Abstract Base Classes)という抽象クラスの概念はあるので特に困らないかな。
全部抽象メソッドにすればいいだけ。抽象クラスの書き方(abctest.py)from abc import ABC, abstractmethod class Animal(ABC): @abstractmethod def sound(self): pass class Cow(Animal): def sound(self): print("moo") class Penguin(Animal): pass # 抽象メソッドを実装していない if __name__ == "__main__": hanako = Cow() hanako.sound() taro = Penguin() # 抽象メソッドを実装していないのでインスタンス化時にエラーになる実行結果moo Traceback (most recent call last): File "abctest.py", line 19, in <module> taro = Penguin() TypeError: Can't instantiate abstract class Penguin with abstract methods soundオーバーロード
pythonにはオーバーロードという概念がない。
オーバーロードのようなことをするには引数のデフォルト設定や可変長引数を使う。オーバーロードしようとするとエラーになる例
これはダメclass Farm: def add(self, animal): print(animal) def add(self, animal1, animal2): print(animal1) print(animal2) if __name__ == "__main__": farm = Farm() farm.add('Dog') farm.add('Jersey','Holstein') ↓実行結果↓ Traceback (most recent call last): File "farmtest.py", line 13, in <module> farm.add() TypeError: add() missing 2 required positional arguments: 'animal1' and 'animal2'これはOK
class Farm: def add(self, animal='Chicken'): print(animal) if __name__ == "__main__": farm = Farm() farm.add() farm.add('Dog') ↓実行結果↓ Chicken Dogclass Farm: def add(self, *args): if len(args) == 0: print('blank') for i in args: print(i) if __name__ == "__main__": farm = Farm() farm.add() farm.add('Dog') farm.add('Jersey','Holstein') ↓実行結果↓ blank Dog Jersey HolsteinApplicationContext
JavaのServletやspringframeworkでSessionスコープより広範囲のApplicationContextに該当するものはdjangoにはない。
djangoを使っているから?ラベル付きbreak
javaで2重ループから一気に抜け出すようなときに使うラベル付きbreakはpythonにない。
javaでもあまり使わないから、まいいか。ローカル変数の有効範囲(スコープ)
pythonは関数内有効。
javaはブロック内有効。これは、、java屋さんからすると扱いづらい・・・。
フィールド定義位置
javaのインスタンス変数のような書き方をするとpythonではクラス変数の意味になってしまうので注意!
最初うっかり書き間違えたら動きが想定外になってびっくりした。class Cow: type = 'Holstein' # クラス変数 def __init__(self, name): self.name = name # インスタンス変数 def walk(self): print(self.name + 'が歩く') hanako = Cow('はなこ') hanako.walk() ↓実行結果↓ はなこが歩く
- 投稿日:2020-08-20T00:53:00+09:00
Java覚え書き
java
Oracleから対象のJDKインストーラをダウンロード
2019/4/19からダウンロードにアカウントらしきものが必要になった。
めんどい、プロファイルは作ったら削除するには18か月一切いじらず個人情報を消されるのを待つか、自分で問い合わせフォームから削除依頼をしなくてはならない、めんどいインストール後環境変数の指定をする
こういうの(プログラム関係)は、PCのシステムにインストールしてあることを教えなくてはならない、それをする(じゃあ果たしてこれはインストールといえるのか?)検索で「システム環境変数の編集」より編集する。
(コントロールパネル→システム→システムの詳細設定)システム環境変数
変数名 JAVA_HOME
値 C:~~\Java\jdk1.8.0_261変数名「Path」の値に
%JAVA_HOME%\bin
を追加とりあえずこれで定番の
Hello_World
はできるはず、メモ帳かなんかでHallo_World.javapublic class Hallo_World{ public static void main(String[] args){ System.out.println("Hello World"); } }を保存して、
コマンドプロンプト上でD:\ダウンロード\University\java>javac Hallo_World.java D:\ダウンロード\University\java>java Hallo_World Hello World D:\ダウンロード\University\java>とりあえずこれでJavaが使えるようになったぜ。
いちいちコンパイル時や実行時にjarファイル指定するのがめんどいから
CLASSPATHを設定するといちいち書かなくて済むらしい。
これはユーザー環境変数でもいいらしい。(まぁこのパソコン使うの私だけだし関係ないか)ユーザー環境変数
変数名 → CLASSPATH 変数値 → .;C:\OpenCV\opencv\build\java\opencv-440.jar 初めて設定するときは変数値の「.;」を忘れずに、
あくまでコマンドラインで実行するときの話、統合開発環境で必要かは知らない。

