もっと単純に考えたほうが良いのではないでしょうか?
サーバーサイドはJavaでJSPページをレンダリングして、レンダリングされたページのHTMLでvue読み込めばいいだけだと思いますよ。
私も今の開発ではサーバーサイドJava(SpringBoot)でフロントをvueJS組み込んでおり、そこでもHTMLの出力はJavaで行ってHTMLでVueを読み込んで行うスタイルです。SPAではなく普通にページ遷移はJavaが行うマルチページでやってます。
vueだとSPAのイメージを多く持たれているのでページ遷移のあるものできないと思われる方もいるかと思いますが各ページ毎に用意したvueのエントリポイントのapp.jsを用意すればいいですよね。
JSPの階層構造と対応するvueの階層構造を合わせてあげればわかりやすいです。
フォルダ毎にapp.jsを作るのはwebpackのオプションでやってくれます。
webpackで複数のディレクトリへ出力する
Qiita - webpackでモジュール解決しながらディレクトリ構成を保ったまま書き出す
開発時の階層例
text
1 ---- jsp (ここのフォルダの名前は適当です自分の環境に読み替えてください)
2 | +-- home
3 | | +- index.jsp
4 | | +- home.jsp
5 | +-- user
6 | | +- index.jsp
7 | | +- new.jsp
8 | | +- confirm.jsp
9 +-- css
10 +-- js
11 +-- images
12 +-- scripts( vueの元ソース置き場)
13 | +-- home
14 | | +- index
15 | | + app.js
16 | | + page.vue
17 | | +- home
18 | +-- user
19 | | +- index
20 | | +- new
21 | | +- confirm
22 | +-- components (共通で使えるVueComponents)
23 |
24 +-- dist(コンパイル後のvue置き場)
25 +-- home
26 | +- index
27 | + app.js
28 | +- home
29 | + app.js
30 +-- user
31 | +- index
32 | + app.js
33 | +- new
34 | + app.js
35 | +- confirm
36 | + app.js
JSPで出力するページは極端な話以下のようなHTMLで良いです。
html
1<body>
2 <!-- home/index -->
3 <div id="app"></div>
4 <script src="https://cdn.jsdelivr.net/npm/vue"></script>
5 <!-- home/indexに使用するvueのエントリポイント ページ毎に異なる app.jsを読む-->
6 <script src="dist/home/index/app.js"></script>
7</body>
各ページに用意するapp.jsは以下のようなものですね。
この中で各ページのレンダリングに使う.vueを読み込んであげればよいです。
js
1import Vue from "vue";
2import Page from "./page";
3
4var app = new Vue({
5 el: '#app',
6 components: { Page}
7});