tattyan3
@tattyan3 (tatsuji shimo)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

java をhtmlインターフェースとして、使う試み。

Discussion

Closed

java で思った動作を導けない

html 形式でジャバとインターフェースを取りcgiの様に動かしたい。
1点において、可能性とぐずりを見つけたので順を追って説明したい。
PCの仕様
2024/02/24 java qiita 資料(0x80070643)
デバイス名 DESKTOP-JDUOV33
プロセッサ Intel(R) Core(TM) i5-7300U CPU @ 2.60GHz 2.71 GHz
実装 RAM 8.00 GB (7.89 GB 使用可能)
デバイス ID
プロダクト ID
システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ
ペンとタッチ このディスプレイでは、ペン入力とタッチ入力は利用できません

エディション Windows 10 Pro
バージョン 22H2
インストール日 ‎2022/‎03/‎09 ‎(‎水‎)
OS ビルド 19045.4046
エクスペリエンス Windows Feature Experience Pack 1000.19053.1000.0
java のdownload 
java SDK https://www.oracle.com/jp/java/technologies/downloads/
win https://download.oracle.com/java/21/latest/jdk-21_windows-x64_bin.exe (sha256)

installdirectory

スクリーンショット 2024-02-25 111308.png

xammp 導入

2024-02-24.png
apache が単独で動いている場合はタクレットでstopをさせてから起動。

2024-02-24 (1).png

2024-02-24 (2).png
トムキャットのユーザーとパスの書き換え。

<!--chenge no stop eria-->
  <role rolename="manager-gui"/>
  <user username="tattyan_myneme" password="1122xx" roles="manager-gui"/>
 <!--変更前を置いておくこの様にコメントで -->
<!-- -->
</tomcat-users>

"manager-gui"の説明はマニュアル参照

2024-02-24 (3).png
adminを押して管理者権限を上のでいれ、リマインドする。
スクリーンショット 2024-02-24 221100.png
Server Status ボタンをクリックする
2024-02-05 (5).png
こんなのが、出てきてdirectory管理に入る。
2024-02-24 (4).png
このディレクトリC:\xampp\tomcat\webapps\examples
http://localhost:8080/examples/ になっている
リンクできるエディタでアドレスを書いていく。

最終的に

スクリーンショット 2024-02-25 115532.png
アドレス帳は

http://localhost:8080/  Apache Tomcat/8.5.96    404 セットアップアドバイス

http://localhost:8080/examples/index.html   ここのアドレス it sampul url link.
C:\xampp\tomcat\webapps\examples

cd C:\xampp\tomcat\webapps\examples

javac Hello.java
出来る Hello.class
java Hello

http://localhost:8080/examples/Hello1.html

http://localhost:8080/examples/Hello.cgi

http://localhost:8080/examples/Hello.java

まずは、tomcat での結果

スクリーンショット 2024-02-25 002508.png

スクリーンショット 2024-02-25 003716.png

スクリーンショット 2024-02-25 101647.png

スクリーンショット 2024-02-25 101712.png

スクリーンショット 2024-02-25 102715.png

スクリーンショット 2024-02-25 103058.png

スクリーンショット 2024-02-25 103241.png

スクリーンショット 2024-02-25 103812.png

2024-02-24 (5).png

// Compile: javac Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Content-type:text/html\n\n");
        System.out.println("<html>");
        System.out.println("<head>");
        System.out.println("<title>Hello World!</title>");
        System.out.println("</head>");
        System.out.println("<body>");
        System.out.println("<h1>xampp in tomcat to Hello World!</h1>");
        System.out.println("<h1>エックスアンプ の トムキャット から こんにちは 世界!</h1>");
        System.out.println("</body>");
        System.out.println("</html>");
    }
}

ローカルサーバー 80

apache 変更 java拡張子で動くように。
スクリーンショット 2024-02-25 104846.png

スクリーンショット 2024-02-25 105048.png

#!C:/Program Files/Java/jre-1.8/bin/java -Dfile.encoding=UTF-8 Hello.cgi
String utf8String = new String(isoBytes, StandardCharsets.UTF_8);

public class Hello {

    public static void main(String[] args) {
        System.out.println("Content-type:text/html\n\n");
        System.out.println("<html>");
        System.out.println("<head>");
        System.out.println("<title>Hello World!</title>");
        System.out.println("</head>");
        System.out.println("<body>");
        System.out.println("<h1>xampp in tomcat to Hello World!</h1>");
        System.out.println("</body>");
        System.out.println("</html>");
    }
}
exit();
#!C:/Program Files/Java/jre-1.8/bin/java -Dfile.encoding=UTF-8 Hello.java
String utf8String = new String(isoBytes, StandardCharsets.UTF_8);

public class Hello {

    public static void main(String[] args) {
        System.out.println("Content-type:text/html\n\n");
        System.out.println("<html>");
        System.out.println("<head>");
        System.out.println("<title>Hello World!</title>");
        System.out.println("</head>");
        System.out.println("<body>");
        System.out.println("<h1>xampp in Apache to Hello World!</h1>");
        System.out.println("<h1>エックスアンプ の アパッチ から こんにちは 世界!</h1>");
        System.out.println("</body>");
        System.out.println("</html>");
    }
}
exit();

結果
スクリーンショット 2024-02-25 103950.png

errorは
スクリーンショット 2024-02-25 104410.png

そして、
スクリーンショット 2024-02-25 124835.png

最終的に

apache 80 Hello.cgiでcallして

#!C:/Program Files/Java/jre-1.8/bin/java -Dfile.encoding=UTF-8 Hello.cgi

を実行してjavaを実行させるが、
1行目
#!C:/Program Files/Java/jre-1.8/bin/java -Dfile.encoding=UTF-8 Hello.cgi
の#がjavaで理解不能になって jis のエラー文\xで始まる日本語8xを含むもじをだす。

1行目に「#!」があったら1行目を無視して2行目に行けば結果は違うかもしれない。

scriptして実行できないのが残念です。

0

Perl等がインタプリタで即時実行なのに対してJavaはコンパイルをしてからVMを動かさないといけないランタイムですので,Javaを直接CGIのように即時実行するというのがかなり無理がある行為だと思います.
WebサーバーでJavaを動かす場合は,通常バックエンドを書いて動かしっぱなしにします.以下の記事はHTTPレスポンスを返すJavaプログラムの例です.

前ちょっと触れましたが,CGI自体今日日わざわざ書くものでは無い感じはあります.

0Like

tomcat にねぇ、見本で載っていたのよ。そのまま書いたらインポートが見つからんとか、色々、エラーを出されたのよ。簡単だろうとか、思っていたのが、一日がかりになったのよ。
おっしゃる通り、CGI云々は古いという感じがあるけど、perl5,ruby,pythonのhtmlゲートウエイに使える、インターフェースとしては、類を見ない感じなのです。ブラウザは、各種使えるし、小物として、css,javascript なんかも使えるしperl5からhtmlにしてpythonに渡しhtmlにしてjavaまで渡せれば、ある意味、htmlを介して、万能なんです。つまり、pythonから、javaを動かせるといったような。ルールはありますが。
参考までに

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World!</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World!</h1>");
        out.println("</body>");
        out.println("</html>");
    }

私の動かせなかったやつ。

0Like

tomcat にねぇ、見本で載っていたのよ。そのまま書いたらインポートが見つからんとか、色々、エラーを出されたのよ。

そりゃTomcatにしたってクラスパスも通さずに好きにソースを配置できるわけじゃないので…
とりあえずTomcat式にちゃんと動かすとこまではドキュメント通りに頑張ってもいいんじゃないでしょうか.

perl5からhtmlにしてpythonに渡しhtmlにしてjavaまで渡せれば、ある意味、htmlを介して、万能なんです。

言ってることがよくわかりませんが「需要がねえ」の一言に尽きると思います.
不必要にバックエンドを動かす理由がまずない.

0Like

大体、tomcat動かしてみたけど、javaが無いと、無用の長物で、使うのjavaだけやん。そこに置いて、他を動かせるか言ったら、動かせないだし。それに、難しすぎるわlocalhost:8080だしセキュリティがSSLがって、ローカルホストやろ、他から見に入られているとしたら、怖いわ。そんなもんで、何でSSL認証自分にかけにゃらん、ソースもみんな分かっていて、おかしいのバグだけだわ。
で、localhostでほかのcgi(80ポート)と一緒に動かしてみたの。それが下の。「#!」で呼び出し掛けたの、自分も見て「#!」プログラムの命令コード無いとか。他は#がコメントで無視するから、全然問題にならない。windowsも#!が一行目にありゃ、ああそうか、で済むのに、律儀に「これは違う」とかな。
みんなは、使えんから需要がないんで。不要なのか言われたら、はいそうです。言えるか? 動くのにすれば需要が出るかもしれないだけだろう?動かんから使えんのであって、まず動くから信を問えよ。

0Like

まずご自分で何を仰っているのか把握するとこから始めてみませんか?
「大体、tomcat動かしてみたけど、javaが無いと、無用の長物で、使うのjavaだけやん」とかいう考えて書いたとは思えない文章を読むのは疲れます.
せめて人に通じる文章書けるようになってから投稿していただけませんかね.
コミュニティは技術共有のためにあるものなので,(古いのはさておき)不勉強で拙い内容を垂れ流すだけならまだしも意思疎通までもまともにできないとなるとちと困ります.

コミュニティガイドラインも今一度ご一読くださいませ.よろしくお願いします.

☝みんなが読んでも理解できる記事を書こう
Qiitaはエンジニアにとって再利用性・汎用性の高い情報が集まる場をつくる事を目指しています。 そのためにも、一般的な名詞や用語、表現を用いて、自分以外の人が読んでも理解できる記事を書くことを心がけましょう。例えば以下のような記事を書くことはやめましょう。

  • 自分だけがわかる用語などを用いて、用語に対する説明を行わない
  • 文章として成立していないメモや走り書きを投稿する
4Like

これなぁ、role rolename=なのや、最終的に変数は、最後の代入になるの忘れた、書き方でねぇ?
a=2;a=3;a=4;て、aは最後の4やろ?
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
どうでも良いけど。

0Like

とりあえずjre+tomcatですぐ動かすなら今は使われない古い技術ですが、jspを使うとCGIに近く楽かもしれません。

examplesディレクトリにhoge.jspとかで設置すれば、http://localhost:8080/examples/hoge.jsp とかでアクセスできます。

<%@ page contentType="text/html; charset=UTF-8" %>
<!doctype html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
    <div>
      現在の日時: <%= new java.util.Date().toLocaleString() %>
    </div>
  </body>
</html>

HTMLの中にjavaの記述を埋め込む事ができ、アクセスされたときに勝手にコンパイルされます。

1Like

上のページを参考に動作確認してみました。

※OSはAndroid7.0、ターミナルアプリはTermux、Apache2.4.58(CGI設定済み)、OpenJDK17で確認。

HelloCGIをnanoから作成/開く(.java拡張子は不要)。

nano /usr/lib/cgi-bin/HelloCGI

下記内容で保存。

#!/usr/bin/java --source 11

public class HelloCGI {
    public static void main(String[] args) {
        System.out.println("Content-type: text/plain\n\n");
        System.out.println("Hello,CGI!");
    }
}

実行権限を追加。

chmod u+x HelloCGI

直接動作するか確認。

./HelloCGI && echo success || echo faild

Apache2を起動してCGIとして動作するか確認、最後に停止。

apachectl
curl localhost:8080/cgi-bin/HelloCGI && echo success || echo faild

apachectl stop

両方success確認出来ました!

※Linuxでの動作確認になってしまってすみません。(単一ファイルに限られるようですが)コンパイルせずに直接実行出来るのは面白いと思いました。

1Like

面白い試みですね。ありがとうございます。

#!C:/Program Files/Java/jre-1.8/bin/java --version "21.0.2"

source はやってない、自分自身に適用するのだから、自分の名前は要らなのだけど。

#!C:/Program Files/Java/jre-1.8/bin/java --version "21.0.2"
/* 2行目ここからはjavaに従う            --source 21 でいいのかも*/
String utf8String = new String(isoBytes, StandardCharsets.UTF_8);

public class Hello {
/*           厳密には自分自身を示せば良いのだけど     */
    public static void main(String[] args) {
        System.out.println("Content-type:text/html\n\n");
        System.out.println("<html>");
        System.out.println("<head>");
        System.out.println("<title>Hello World!</title>");
        System.out.println("</head>");
        System.out.println("<body>");
        System.out.println("<h1>xampp in tomcat to Hello World!</h1>");
        System.out.println("</body>");
        System.out.println("</html>");
    }
}
/* ひょっとして関数の終わり「;」がいる? */
exit();
/* [EOF]に従うかexit(関数?);を使うか? ともかく使う分には終わりを指定したい  */

まぁ、Windows10だからなぁ。23h2も適用してないし24h2は。。。

[Mon Feb 26 19:46:38.885241 2024] [cgi:error] [pid 1416:tid 1860] [client 127.0.0.1:51063] End of script output before headers: Hello_next.cgi
[Mon Feb 26 19:46:38.886238 2024] [cgi:error] [pid 1416:tid 1860] [client 127.0.0.1:51063] AH01215: Unrecognized option: --version: C:/xampp/htdocs/my_java/Hello_next.cgi
[Mon Feb 26 19:46:38.886238 2024] [cgi:error] [pid 1416:tid 1860] [client 127.0.0.1:51063] AH01215: Error: Could not create the Java Virtual Machine.\r: C:/xampp/htdocs/my_java/Hello_next.cgi
[Mon Feb 26 19:46:38.886238 2024] [cgi:error] [pid 1416:tid 1860] [client 127.0.0.1:51063] AH01215: Error: A fatal exception has occurred. Program will exit.\r: C:/xampp/htdocs/my_java/Hello_next.cgi

という事で、1回目の失敗をさらしてみました。

0Like

動く人いますか? なお、\n\nのため1行空ける事。

<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>

<html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <h1>It my_java1.jsp look it. syoumi kigen gire! old type it.</h1>
    <div>
      現在の日時: <%= new java.util.Date().toLocaleString() %>
    </div>
  </body>
</html>

こんなもの、ちょっとね。。。ゴメンね。

0Like

なお、\n\nのため1行空ける事

空ける必要はありません。

誰も何も望んでいないので、何もしなくていいですよ。
これで出来ないことがあるなら、CGIでも出来ないだけなので。
時間を無駄にしたくないので失礼します。

0Like

あまりCGIに詳しくはないのですが、Cとかのコンパイル言語で動かす場合事前にコンパイルして各呼び出しをそれぞれ実行ファイルにするのではないでしょうか?
この場合Javaだと実行可能jarをバッチファイルでくるんだもの用意すれば見かけ上動きそうな気がするのですがだめなのでしょうか?
CGI学生時代の演習でしか使ったことないので的外れでしたらすみません。

今だとGraalVMでネイティブファイルに変換するのもありなのかなと思いましたが、ある意味Lambda的になるんですかね

0Like

必要なら、hello.classからhello.exeを実行させ結果をサーバーが切れん様に受け取れれば、hello.txtとしてでも。ただ、拡張子言うのは役目が決まっているから、書式に合わせて処理され、処理する言う事ですね。
まあ、中に関数としてサブルーチンを組めば、処理時間だけの物でもありますが。

0Like

必要なら、hello.classからhello.exeを実行させ結果をサーバーが切れん様に受け取れれば、hello.txtとしてでも。ただ、拡張子言うのは役目が決まっているから、書式に合わせて処理され、処理する言う事ですね。

すみません、意図がうまくくみ取れませんでした。
変なところで文を切ったり端折らないでほしいです。
hello.classからhello.exeを実行とはどういうことでしょうか?
またhello.txtとは何のことでしょうか?

自分が言いたかったのは実行可能jarを生成した後に下記の文字列をcatなどでjarの先頭にくっつけると実行ファイルとして振舞えるのでCGI呼び出し時にそれを指定するようにしてはだめなのかと思ったまでです。

@echo off
java -jar "%0" %*\r\n\
exit /B 1\r\n\

上のスクリプトをbootstrap.batとして cat bootstrap.bat hello.jar > hello.cgi
(参考元:https://qiita.com/k_ui/items/65def414bd7ec54aedeb)

こうすればCでCGIを書く時と同じように実行できないかなと思ったのですが駄目でしょうか?

0Like

ほかの方が書かれているようにJavaをこのような方式で呼び出すことの意義には疑問があります。
呼び出し毎にJavaVMを立ち上げることになりますし、せっかくJavaの利点であるJITコンパイルも有効に活用できないのでリソースの無駄になります。

0Like

cgi と言う名のFile call、または、hello.py (pythonFile)は実行できますがcgiとすると1行目を読んで、perl,pythonなどにわたすし、*.pyをapacheのコンフィグに設定すれば、それを読み込むのです、ただどうもText File?のようです。cgiは実行するのが1行目で、きまるので1行目の書式がjavaにしてあれば、それを読むのです。
hello.txt 言うのはcallした時exeの温度と湿度がテキストで書き出し18℃:75%いう一行をcallした後File読込として得られるとした場合を書いただけで書き換えたらフラグでも立てないと分からない話しては、あります。わざわざテキストにする必要があるかは別として。ただ、書式の決まったFileなら、同期を取らず流しっぱなしとかも、考え方で出来ます。30行とか。
わかりにくかったら、すみません。その書式はバッチ形式で実行ファイルが移動してパイプに流せないっていう、問題があると思います。

0Like

あぁ、そういえばWindowsではshebangないからbatで起動実行ファイル作るときは拡張子合わせないと立ち上げれないんでしたっけ
すみません、不十分でした

xampp環境ってshebangで起動できるのですね
というか読み返すと @mochikuni さんがほぼ答え書いていますね
sourceは不要と判断されていますが必要なので書かれています。

そもそもshebangでの立ち上がり方やJavaの起動方法について理解されていないところがあるように思われます

0Like

はい、apcheはコンソールへの出力をパイプしているだけで、どこに実行java.exeがいるかは教えなきゃなりませんでした。
すみません。

0Like

Your answer might help someone💌