This page (revision-1) was last changed on 20-Apr-2024 11:53 by Hiroaki Tateshita

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
20-Apr-2024 11:53 3 KB Hiroaki Tateshita

Page References

Incoming links Outgoing links

Version management

Difference between version and

At line 1 added 94 lines
[{PageViewPlugin}]
[GeoPicPlugin]
!!!Abstract
以下にGeoPicPlugin開発時のお恥ずかしい苦労話などを記録します。
!!!Topic
!!やりたいこと:
*フォームに入っているテキストをもとにページを作成し、ファイルを添付する。
*JSPWikiのライブラリを最大限活用
*web.xmlはいじりたくない。つまりできるだけJSPWikiから独立に開発を進めたい。
*Tomcat8.5でも動かしたい。(コンテンツ分けるか)
!!記録
*JSP or Servlet
|やりたいことをやるには、JSPかServletか
|HttpServletRequestでフォームの情報は引き出せそう。JSPからは使える?サーブレットから渡してやる感じか。つまり少なくともサーブレットは作らないとか。
|Pluginの中にサーブレットクラスって入れられる?JSPWIKIでの例はなさそうなので、やってみるしかないか。→[1]の方法でできた!割と簡単。WEB.XML編集しなくてもできるんだ。Servlet3.0, [Tomcat]8から対応とのこと。
*つぎは、Formの使い方か
|[2]を参照して実施。
|FormタグでAction属性に、動かしたいURLを指定
|Formタグで囲われた中にInput type="Submit"を。
|Buttonは、TypeもButtonとしておかないと、Type=submitと同じ動きをする。
|Formにenctype="multipart/form-data" を設定する必要がある。
*GetとPostの違いを確認
|Getは主にサーバからクライアントが情報を取るとき。
|Postは、サーバに情報をアップデートするとき。
*ServletのなかでWikiEngine呼び出せるかな。
|AttacheServletが参考になる。最初に必ず
{{{
org.apache.wiki.InternalWikiException: No wiki engine, check logs.
org.apache.wiki.WikiEngine.getInstance(WikiEngine.java:377)
org.apache.wiki.WikiEngine.getInstance(WikiEngine.java:316)
org.braincopy.jspwiki.plugin.TestServlet.init(TestServlet.java:28)
}}}
|これは、WikiEngine.getInstance()をやるときにWeb.xmlを見に行こうとするから一回目は出るらしい。
|JSPWikiのUpload.jspをみると、JSP側でもWikiEngine.getInstance()を呼び出している。このあたりの違いか。要確認。
|JSP側の処理で上記以外もある。PluginからcontextをServletに渡すことは可能か?
|Access権関係なんかあるのかな。
|どうも新しいページを作れない。
|WikiEngineオブジェクトがおかしいのか。saveTextが使われるはず。→ん?呼ばれない?Contextがページと結びついているはず。SaveTextが呼ばれた瞬間にPageは作られているか?
|AttacheServletにディスパッチしてForwardしよう!
|もうJSPからつくるつもりにならないとだめか。。。
|まずは、WikiEngineがちゃんと作られていないというエラーを対処する方向で。
{{{
org.apache.wiki.WikiEngine@1d6c9a6
./temp/personal: org.apache.wiki.WikiEngine@1d6c9a6
org.apache.wiki.WikiEngine@1bf1ec2
org.apache.wiki.WikiEngine@1bf1ec2
}}}
|新しいWikiEngineが作られている。自然ではない。
|ServletContextの中にWikiEngineが保存されていない?
|AttacheServletのInitから呼ばれているgetInstanceでは、そこは保存されているようで、
{{{
WikiEngine engine = (WikiEngine) context.getAttribute( ATTR_WIKIENGINE );
}}}
|でえられていた。
|でもgetInstance()の中で、setAttributeもやっている。どういうことだ。
|参照しているServletContextが違うオブジェクト?
{{{
org.apache.catalina.core.ApplicationContextFacade@12bc773
org.apache.catalina.core.ApplicationContextFacade@1c81301
}}}
|うーん、違う。このContextの中だと保存されていない。。。gpuploadがPersonalの配下にいない。。。
|form でactionを指定するときに"/gpupload"だとhostname/gpuploadになってしまう。actionを"gpupload"にすると狙い通りhostname/appname/gpuploadになる。これでWikiEngineは、ちゃんと作れるようになった。
*さて、あとは新しいページをどう作るかだ。
|WikiPageオブジェクトをnewで作ればいいだけだった。。。
*さて、フォワードしよう。どうするかな。
|フォワードしたさきの
{{{
upload.parseRequest( req );
}}}
|でうまくITEMが取れていない。一回とっちゃうとダメなんじゃ。うん、2回parseRequestはできないっぽい。
|選択肢は、AttacheServletの内容をコピーする。でもあまりやりたくない。AttacheServletを継承できるかな。→AttacheServletを継承し、privateで見えないメンバ変数とメソッドを再度定義しつつ、uploadメソッドをオーバーライド。
!!記録2(Tomcat8.5対応)
*まずは何が動いていないか確認したい。
*/gpuploadが呼び出されたら何が動くのか?init()かupload()だろうね。
|やばい。自分で緯度経度を指定する場合、普通に動いた。EXIFを使う場合だけ、へんなエラーが出るのかもしれない。
|executeUpload(context, in, filename, nextPage, wikipage, changeNote, fileSize);で何か起きてる。
|実はUseEXIF関係ない。ファイルサイズ制限のエラー処理ができていない。たぶん今設定で4Mまでにしているところ8Mをアップしようとしたから落ちたのだろう。エラーメッセージがおかしいのも問題だが、やはり適切なサイズでアップするようなプログラムにしたい。
|executeUpload()のオーバライドに挑戦。もはやAttachmentServletを継承している意味がなくなりつつあるが。その中でAttacheManager.validateFileName()がis not visibleとでる。AttachmentManagerはpublicクラスだし、validateFileName()はstaticメソッドだし、見れないはずないのだが。コンパイルも通るし。なんでだろう。staticメソッドはpublic指定されていないと使えない。何も書かないとprotectedよりきつい[3]。ということで権限のないメソッドはコピーしてくる。
|相変わらず、ファイルサイズ制御のエラーは、ちゃんとエラー処理できていない。org.apache.commons.fileupload.FileUploadBase$FileSizeLimitExceededExceptionをちゃんと受け止め切れていない。[まあ、その前にファイルサイズを落とすことを考えよう|Resize image file w GeoPicPlugin]。
!!!Reference
#[#1][http://www.javaroad.jp/servletjsp/sj_servlet14.htm]
#[#2][http://www.tagindex.com/html_tag/form/input_submit.html]
#[#3][https://www.sejuku.net/blog/22679]