JSF(Jakarta Server Faces) ← なにこれ?
JSPとか画面実装関連が楽にできるのか、なるほど。
この状態からスタートしてます。
お知らせ:脳が無事死亡しました
xhtml あかんわ
DAY 1 (2023/04/04)
とりあえずweb.xml デプロイメント記述しの生成しとくか
で、他のサイトを参考にしつつxhtmlを表示させると
変換されてないページが表示されます。あれぇ?
なんでや!と思って知っている人に教えてもらいました。
上の画像に書かれてる URLマッピングパターン 確認すると
/faces/*
ふむ
DAY 2 (2023/04/05)
やっぱ URLマッピングパターン変更しちゃおう
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
これでURLが
http://localhost:/faces/.xhtmlから
http://localhost:/.xhtmlになる
ただ WEB-INF とか META-INF は認識しない
専門学校で習った知識(ガバ記憶)なのでDAY 1で WEB-INF に配置してる
これは草 リソース認識するわけないやん
ついでに Java7 にしとく
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:i="http://xmlns.jcp.org/jsf/component"
xmlns:jsf="http://xmlns.jcp.org/jsf"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>トップページ</title>
</h:head>
<h:body>
#{currentTime}
</h:body>
</html>
package example;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.NoneScoped;
@ManagedBean(name = "currentTime")
@NoneScoped
public class TimeBean {
private static final long CURRENT_TIME_LONG = System.currentTimeMillis();
private static final Calendar CURRENT_TIME_CALENDAR = Calendar.getInstance();
private static final SimpleDateFormat FORMATTER = new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒");
public long get() {
return CURRENT_TIME_LONG;
}
@Override
public String toString() {
return FORMATTER.format(CURRENT_TIME_CALENDAR.getTime());
}
}
http://localhost:8080/TestJSF/index.xhtml にアクセスして
今日の日付表示されればおkだ
問題なしだ
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:i="http://xmlns.jcp.org/jsf/component"
xmlns:jsf="http://xmlns.jcp.org/jsf"
xmlns:ui="http://java.sun.com/jsf/facelets">
こいつ、わからんので明日調べる
DAY 3(2023/04/10)
途中で判明したことが一つ
実はプログラムは正常に動作していません。
ブラウザの開発者ツールでソースコードを確認したところ
EL式だけ変換されていてjsfのタグ(h:とかi:とか)が無変換で表示されているということ。
原因としては3つあるらしい
- web.xmlの指定ミス
- URLのアクセスミス
- xmlns:h=とかのURLミス
今回の場合だと、「xmlns:h=とかのURLミス」それとプラスで原因があった。
そりゃお前、マーケットプレイスからJBossToolsインストールしてないからだよ。無事にインストールしたらでけた
正常に動いてる場合だと xhtml から jsf に自動的に変換されるということURLをちゃんと確認しましょう。
おかしいんだよなー。環境 JSF 2.2選んだから一つ目のやつで問題ないだけどな
- http://xmlns.jcp.org/jsf/ 間違い x
- http://java.sun.com/jsf/ 正しい o
参考サイト
DAY 4(2023/04/12)
デザイナーが書くのはhtmlタグなの(多分)。わざわざJSFタグに書き換える作業が必要になるし学習しなくちゃいけない。
とてもつらいらしい。
JacaEE 2.2以降から色々優しくなったんだってよ
<h:inputText/>
<input jsfc="h:inputText"/>
jsfcつけないと認識されないらしい注意やね
参考サイト
DAY 5(2023/04/14)
動的コンテンツ
削除ボタンおしたら行削除
追加ボタンおしたら行末尾追加
保存ボタンおしたらDBとか何かしらに保存
学生時代に考え付いたのがフロントエンドサイドのjsで色々やりとりしてjson形式でデータ送るっていう。
今回バックエンドサイドでやりたいってことで調べた。
なるほど同じページぐるぐる遷移するのか。
結構、回線に負荷がかかるのかな?どうなんだろ。
で作ってボタンぽちぽちして動作の確認をすると
あぁん♡見事に中身消えた
で?理由は
immediate=trueのせい
なんか色々処理を吹っ飛ばす、らしいので削除したら動作した。
文字化けしたなんで?
1回目は文字化けして2回目以降はしない
オーマン ひどすぎる
フィルター通せば治るらしい
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
/**
* Servlet Filter implementation class EncodingFilter
*/
@WebFilter("/*")
public class EncodingFilter implements Filter {
/* (非 Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {}
/* (非 Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {}
/* (非 Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}