Springbootは、jspとhtmlを同時に持つ複数のビュー解析器を構成します.


くだらない話が少し多い.皆さん、ご了承ください.焦ったら、直接最後まで引き下がることができます.上は私の解決過程です.
この問題は一般的には遭遇できないが、私たちのプロジェクトが奇抜なせいだ.事はこのようにして、私达の先に开発したプロジェクトは1つの古いプロジェクトに集積して、新しいプロジェクトはhtmlを使って、しかし古いプロジェクトはJspを使って、その上古いプロジェクトの机能は完璧で、ただ先端は少し问题があります.
問題があったら、解決しなければならないでしょう.今はいろいろな方法があります:1、JspをHtmlに変更します;2、request.getDispacter()はジャンプします.3、springのビュー解析器を検討します.
1つ目は、本当に面倒で、私のような怠け者はやむを得ずこのような方法を採用しません.
2つ目は、1つ目よりも面倒で、バックエンドを変更するだけでなく、フロントエンドを変更する必要があります.このようにジャンプするため、jspの内蔵オブジェクトで伝達パラメータを取得し、断固として捨てなければなりません.
3つ目:3つ目といえばspringビュー解析器のソースコードを話さなければなりません.
protected View resolveViewName(String viewName, @Nullable Map model,
			Locale locale, HttpServletRequest request) throws Exception {

		if (this.viewResolvers != null) {
			for (ViewResolver viewResolver : this.viewResolvers) {
				View view = viewResolver.resolveViewName(viewName, locale);
				if (view != null) {
					return view;
				}
			}
		}
		return null;
}

DispacterServiceletでこのメソッドを見つけると、springはすべてのビュー解析器をループし、解析結果が空でないビューを返すことがわかります.
したがって、jspを返し、htmlを返すには、Jspのビュー解析器を追加する必要があります.
インターネット上の資料検索とプログラマーとしての経験とソースコード(具体的なソースコードはどこにあるか忘れました)を経て、ビュー解析器には接頭辞、接尾辞などが含まれなければならないことがわかりました.
    @Bean
    public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setOrder(0);
        viewResolver.setContentType("text/html;charset=UTF-8");
        return viewResolver;
    }

加えてプロジェクトを開始すると、プロジェクトはすべてjspとしてジャンプしていることがわかりました.解析してみると、orderのせいか、前のDispacterServiceletのコードも言っていたので、viewが空でない限り戻ってくる可能性があります.それから私はhtmlビュー解析器をもう1つ配合して、デフォルトではありませんて、しかも私は優先度も修正して、コードは以下の通りです.
@Bean
    public InternalResourceViewResolver htmlViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/");
        viewResolver.setSuffix(".html");
        viewResolver.setOrder(0);
        viewResolver.setContentType("text/html;charset=UTF-8");
        return viewResolver;
    }

    @Bean
    public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setOrder(1);
        viewResolver.setContentType("text/html;charset=UTF-8");
        return viewResolver;
    }

しかしこのようにすべてhtmlに解析して行って、私は再びソースコードについていかなければならなくて、たとえページがなくても、viewは依然として空いていないことを発見して、このようにきっとすべてHtmlとして処理したのではありませんか、私达は今1つのこのページがあるかどうかを検出することができるものが必要です.振り回された後、このようなクラスを作成する必要があります.
public class HandleResourceViewExists extends InternalResourceView {

    @Override
    public boolean checkResource(Locale locale) {
        File file = new File(this.getServletContext().getRealPath("/") + getUrl());
        return file.exists(); //        
    }
}

実際にはインスペクタです.次に、カスタム解析器にインスペクタを設定します.最終的なコードは次のとおりです.
    @Bean
    public InternalResourceViewResolver htmlViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/");
        viewResolver.setViewClass(HandleResourceViewExists.class); //     
        viewResolver.setSuffix(".html");
        viewResolver.setOrder(0);
        viewResolver.setContentType("text/html;charset=UTF-8");
        return viewResolver;
    }

    @Bean
    public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(HandleResourceViewExists.class); //     
        viewResolver.setPrefix("/WEB-INF/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setOrder(0);
        viewResolver.setContentType("text/html;charset=UTF-8");
        return viewResolver;
    }