27935


Springboot MVCを勉強しています。  
index.htmlをHTML5で用意し、コントローラークラスをjavaで用意しました。  
■コントローラクラス

[code]

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView index(ModelAndView mav) {
        mav.setViewName("index");
    
        return mav;
    }
    
[/code]

ブラウザ起動時に、ブラウザの情報を取得したく考えています。  
ブラウザ起動時に上記コントローラーの「index()」が呼ばれていたので  
このなかでブラウザ情報を取得したいと思ったのですが、

ブラウザの情報の取り方を探っているうちにjavascript側で取得できることを確認できました。  
■javascript側(test.js)

[code]

    function getBrowser() {
        // ブラウザ言語を取得
         var ua = window.navigator.userAgent.toLowerCase();
    
        return ua;
    }
    
[/code]

下記を参考にコントローラクラスを変更しました。  
<http://d.hatena.ne.jp/Nagise/20140227/1393500657>

[code]

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public ModelAndView index(ModelAndView mav) {
        mav.setViewName("index");
    
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("test");①
            String lang = "";
            try {
                lang = (String) engine.eval("getBrowser();");
            } catch (ScriptException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
    
        return mav;
    }
    
[/code]

engineがnullになってしまいます。  
javaからjavascriptのメソッドを呼ぶ処理が不正なのでしょうか。


CC BY-SA 3.0
2016-07-29T03:47:03.723
27930
2016-07-29T05:38:45.983
12842
question
javascript spring-boot
javaからjavascript処理をよびたい


JavaScriptというのは言語の名前です。  
この言語を実行出来る環境（処理系）はいろいろあります。

参考になさったという記事の処理系はJavaのVMで動くRhinoというものです。  
これをサーバ側で実行すれば、いわゆる「サーバサイドJavaScript(最近ではnode.jsがメジャーですね)」が実現出来ます。  
これは、サーバで動かす物ですから、クライアント(ユーザ)側のWebブラウザで動かす「クライアントサイドJavaScript」とは違います。  
別途勉強して下さい。

「サーバ側からクライアント側のJavaScriptを呼ぶ」というのは、  
「クライアント側で実行されたJavaScriptに、戻り値をサーバ側に伝えさせる」  
と捉え直し、方法を探されるとよいと思います。

`XMLHttpRequest`でサーバ側の特定のURLをGETする、あるいはPUTする、などが考えられます。

ただ、ユーザエージェント名の取得にこういった手間を掛けるのは一般的ではないです。  
ブラウザからのリクエストのヘッダーに、ユーザエージェントが含まれていますから、そちらを使う方がよいです。


CC BY-SA 3.0
2016-07-29T05:15:44.177
27933
2016-07-29T05:15:44.177
3054
27930
answer


`@RequestMapping
ハンドラ`の引数から幾つかの情報を取得することができ、例えばユーザエージェント(これはリクエストヘッダに含まれる)であれば次のような型の引数を追加すれば得ることが出来ます。

例1:

[code]

    @RequestMapping(...)
    public ModelAndView index(@RequestHeader("User-Agent") String userAgent, ModelAndView mav) {
        System.out.println(userAgent);
        ...
    }
    
[/code]

例2:

[code]

    @RequestMapping(...)
    public ModelAndView index(WebRequest request, ModelAndView mav) {
        String userAgent = request.getHeader("User-Agent");
        System.out.println(userAgent);
        ...
    }
    
[/code]

参考:

  * [22.3.3 Defining @RequestMapping handler methods - Supported method argument types](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-arguments)


CC BY-SA 3.0
2016-07-29T05:38:45.983
27935
2016-07-29T05:38:45.983
2808
27930
answer