SpringMVC-ビューの解像度

I.SpringMVC解像度ビューの概要

  • コントローラがString、ModelAndViewを返すかどうかに関係なく、ViewはModelAndViewオブジェクトに変換され、ビューはビューパーサーによって解決されてから、ページがジャンプします。
    ここに画像の説明を挿入

ビュー分析ソースコード分析:2つの重要なインターフェイスViewとViewResolver

  • ビュービュー:
    ここに画像の説明を挿入
  • ViewResolverビューリゾルバー:
    ここに画像の説明を挿入

次に、ビューとビューリゾルバー

  • リクエスト処理メソッドが実行された後、ModelAndViewオブジェクトが最終的に返されます。String、View、またはModeMapを返す処理メソッドの場合、Spring MVCはそれらを内部ModelAndViewオブジェクトにアセンブルします。これには、モデルオブジェクトの論理名とビューが含まれます。
  • Spring MVCは、ViewResolverを使用して最終的なビューオブジェクト(View)取得します。最終的なビューはJSPにすることも、Excel、JFreeChartなどのさまざまなマニフェストのビューにすることもできます。
  • プロセッサは、最終的にモデルデータをレンダリングするためにどのビューオブジェクトが使用されるかを気にせず、MVCの完全なデカップリングを実現するために、モデルデータの生成作業に集中します。

2.1表示

  • ビューの役割は、モデルデータをレンダリングし、モデル内のデータを何らかの形で顧客に提示することです。

  • ビューモデルと特定の実装テクノロジの分離を実現するために、Springはorg.springframework.web.servletパッケージで非常に抽象的なView インターフェイスを定義しています
    ここに画像の説明を挿入

  • ビューオブジェクトは、ビューリゾルバによってインスタンス化されますビューはステートレスであるため、スレッドセーフの問題は発生しません。

一般的に使用されるビュー実装クラス:

ここに画像の説明を挿入

2.2ビューリゾルバー

  • SpringMVCは、ビューの論理名を解決するためのさまざまな戦略を提供します。SpringWEBコンテキストは、1つ以上の解決ポリシーで構成でき、それらの間の順序を指定します各マッピング戦略は、特定のビューリゾルバー実装クラスに対応します。
  • ビューリゾルバーの役割は比較的単純です。論理ビューを特定のビューオブジェクトに解決します。
  • すべてのビューリゾルバーは、ViewResolverインターフェイスを実装する必要があります。
    ここに画像の説明を挿入

一般的に使用されるビューリゾルバー実装クラス:
ここに画像の説明を挿入

  • プログラマーは、1つのビューリゾルバーを選択するか、複数のビューリゾルバーを混在させることができます
  • 各ビューリゾルバーは、Orderedインターフェイスを実装し、order属性を公開します。リゾルバーの優先度は、order属性を介して指定できます 順序が小さいほど、優先度は高くなります
  • SpringMVCは、解決が成功してビューオブジェクトが返されるまで、ビューリゾルバーの優先順位に従って論理ビュー名を解析します。それ以外の場合は、ServletExceptionがスローされます。
  • InternalResourceViewResolver
    • JSPは最も一般的なビューテクノロジであり、InternalResourceViewResolveをビューリゾルバとして使用できます。
      ここに画像の説明を挿入

3、JstlView(国際化)

  • プロジェクトでJSTLが使用されている場合、SpringMVCはビューをInternalResourceViewからJstlViewに自動的に変換します(ブレークポイントのデバッグ、JSTL jarパッケージをプロジェクトに追加すると、ビューパーサーは自動的にJstlViewに変更されます)

  • JSTLのfmtタグを使用する場合は、SpringMVC構成ファイルで国際化されたリソースファイルを構成する必要があります。

3.1JstlViewの使用プロセス

  1. 2つの言語で構成ファイルを構成します:(命名規則:base name_language code_country code.properties)
    ここに画像の説明を挿入

  2. jstlタグjarパッケージを追加します(ブレークポイントのデバッグ、現時点でのViewオブジェクトはJstlViewです)
    ここに画像の説明を挿入

  3. 国際化されたリソースファイルを設定する

    <!--让SpringMVC管理国际化资源文件;配置一个资源文件管理器;id是必须叫messageSource  -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    	<!--  basename指定基础名-->
    	<property name="basename" value="i18n"></property>
    </bean>
    
  4. コントローラコード

    @Controller
    public class helloController {
          
          
    	@RequestMapping("toLogin")
    	public String login(){
          
          
    		System.out.println("login...");
    		return "login";
    	}
    }
    
  5. ログインページ(/WEB-INF/pages/login.jsp)はfmtタグライブラリを使用します

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form action="toLogin">
    		<fmt:message key="username"/><input /><br/>
    		<fmt:message key="password" /><input /><br/>
    		<input type="submit" value="<fmt:message key='loginBtn' />" />
    	</form>
    </body>
    </html>
    

注意点:

  1. SpringMVCのビュー解決プロセスを実行する必要がありますユーザーはjstlViewを作成して、迅速に国際化できるようにします。ログインページに直接アクセスしたり、転送を介してアクセスしたりすることはできません

    ソースコードを分析します。
    ここに画像の説明を挿入

3.2ビューコントローラーは、リクエストをページにマップします

  • SpringMVCによってレンダリングされたページ直接応答する場合は、mvc:view-controllerタグを使用して

    <!-- 发送一个请求("toLoginPage");直接来到web-inf下的login页面;mvc名称空间下有一个请求映射标签 -->
    <!-- 
    	path="":指定哪个请求
    	view-name:指定映射给哪个视图
    	走了SpringMVC的整个流程,视图解析....不需要再写控制器方法
     -->
    <mvc:view-controller path="/toLogin" view-name="login"/>
    
  • <mvc:view-controller>を構成すると、他の要求パスが失敗します。
    解決策:mvc:annotation-drivenタグを構成します。

    <!-- 开启mvc注解驱动模式;开启了mvc的开挂模式 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    

3、転送とリダイレクト

  • 通常の状況では、コントローラーメソッドは文字列型の値を返し、論理ビュー名として扱われます
  • 文字列forward:またはredirect:プレフィックス、SpringMVCを付けて返される場合、それらは特別な扱いを受けます:forward:およびredirect:をインジケーターとして、その後に処理するURLとしての文字列が続きます
  • redirect:success.jsp:success.jspへのリダイレクトを完了します
  • forward:success.jsp:success.jspへの転送操作を完了します
  1. 転送プレフィックスは転送操作を指定します
    /**
     * forward:/hello.jsp
     * 		forward:转发到一个页面
     * 		/hello.jsp:转发到当前项目下的hello
     * 	
     * 	注意:一定加/,如果不加/就是相对路径,容易出问题
     */
    @RequestMapping("/handle01")
    public String handle01(){
          
          
    	System.out.println("handle01");
    	return "forward:/hello.jsp";
    }
    
  2. リダイレクトプレフィックスは、ページへのリダイレクトを指定します
    /**
     * 重定向到hello.jsp页面
     * 有前缀的转发和重定向操作,配置的视图解析器就不会进行拼串;
     * 
     * 转发	forward:转发的路径
     * 重定向	redirect:重定向的路径
     * 		/hello.jsp:代表就是从当前项目下开始;SpringMVC会为路径自动的拼接上项目名
     * 
     * 		原生的Servlet重定向/路径需要加上项目名才能成功
     * 		response.sendRedirect("/hello.jsp")
     * @return
     */
    @RequestMapping("handle03")
    public String handle03(){
          
          
    	System.out.println("handle03...");
    	return "redirect:/hello.jsp";//请求转发到hello.jsp页面
    }
    

4、カスタムビュー

  1. カスタムビューパーサーを記述し、実装クラスを表示します

    コントローラ方式:

    /**
     * 自定义视图解析器和视图对象
     */
    @Controller
    public class MyViewResolverController {
          
          
    	@RequestMapping("/handleplus")
    	public String handleplus(Model model){
          
          
    		List<String> vname = new ArrayList<String>();
    		List<String> imgname = new ArrayList<String>();
    		vname.add("佟老师");
    		vname.add("康师傅");
    		imgname.add("萌萌");
    		model.addAttribute("video", vname);
    		model.addAttribute("imgs", imgname);
    		return "meinv:/login";
    	}
    }
    

    カスタムビュー:

    /**
     * 自定义视图
     * @author ZB
     *
     */
    public class MyView implements View {
          
          
    	@Override
    	public String getContentType() {
          
          
    		// TODO Auto-generated method stub
    		return "text/html";
    	}
    
    	@Override
    	public void render(Map<String, ?> model, HttpServletRequest request,
    			HttpServletResponse response) throws Exception {
          
          
    		// TODO Auto-generated method stub
    		
    		System.out.println("进入到自定义视图中:"+model.get("viedo"));
    		response.setContentType("text/html");//设置相应类型
    		response.getWriter().write("<h1>哈哈</h1>");
    	}
    }
    

    カスタムビューリゾルバー:

    /**
     * 自定义视图解析器
     * @author ZB
     *
     */
    public class MyMeiNvViewResolver implements ViewResolver {
          
          
    	
    	@Override
    	public View resolveViewName(String viewName, Locale locale)
    			throws Exception {
          
          
    		/**
    		 * 根据视图名返回视图对象
    		 */
    		//处理以meinv为前缀的
    		if(viewName.startsWith("meinv:")){
          
          
    			return new MyView();
    		}else{
          
          
    			//如果不能处理返回null即可
    			return null;
    		}
    	}
    }
    
  2. ビューリゾルバーを機能させてカスタムビューオブジェクトを作成するには、iocコンテナーに配置する必要があります。

    <bean class="com.zb.view.MyMeiNvViewResolver">
    </bean>
    

URL / handleplusを入力すると、404が報告されます:/ 05_SpringMVC_viewResolver / WEB-INF / pages / meinv:/login.jsp

デバッグ分析の理由:

InternalResourceViewResolverビューリゾルバーは、解決するカスタムビューリゾルバーの前にあります。meinv:/ loginがInternalResourceViewResolverによって連結され、要求パスがWEB-INF / pages / meinv:/login.jspにスペルされ、404になります。
ここに画像の説明を挿入

解決策:ビューリゾルバーの優先度を指定します

カスタムビューリゾルバーは、Orderedインターフェイスを実装します。

/**
 * 自定义视图解析器
 * @author ZB
 *
 */
public class MyMeiNvViewResolver implements ViewResolver,Ordered {
    
    
	
	private Integer order;
	
	@Override
	public View resolveViewName(String viewName, Locale locale)
			throws Exception {
    
    
		/**
		 * 根据视图名返回视图对象
		 */
		//处理以meinv为前缀的
		if(viewName.startsWith("meinv:")){
    
    
			return new MyView();
		}else{
    
    
			//如果不能处理返回null即可
			return null;
		}
	}

	@Override
	public int getOrder() {
    
    
		return order;
	}
	
	public void setOrder(Integer order){
    
    
		this.order = order;
	}

}

ばね構成で優先度を指定します。数値が小さいほど、優先度が高くなります。

<bean class="com.zb.view.MyMeiNvViewResolver">
	<!-- 自定义的视图解析器,value="1"数字越小优先级越高 -->
	<property name="order" value="1"></property>
</bean>

この時点で:カスタムビューリゾルバーは解決を優先します:(応答ページを取得します)
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_44630656/article/details/115188294