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をビューリゾルバとして使用できます。
- JSPは最も一般的なビューテクノロジであり、InternalResourceViewResolveをビューリゾルバとして使用できます。
3、JstlView(国際化)
-
プロジェクトでJSTLが使用されている場合、SpringMVCはビューをInternalResourceViewからJstlViewに自動的に変換します(ブレークポイントのデバッグ、JSTL jarパッケージをプロジェクトに追加すると、ビューパーサーは自動的にJstlViewに変更されます)
-
JSTLのfmtタグを使用する場合は、SpringMVC構成ファイルで国際化されたリソースファイルを構成する必要があります。
3.1JstlViewの使用プロセス
-
2つの言語で構成ファイルを構成します:(命名規則:base name_language code_country code.properties)
-
jstlタグjarパッケージを追加します(ブレークポイントのデバッグ、現時点でのViewオブジェクトはJstlViewです)
-
国際化されたリソースファイルを設定する
<!--让SpringMVC管理国际化资源文件;配置一个资源文件管理器;id是必须叫messageSource --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- basename指定基础名--> <property name="basename" value="i18n"></property> </bean>
-
コントローラコード
@Controller public class helloController { @RequestMapping("toLogin") public String login(){ System.out.println("login..."); return "login"; } }
-
ログインページ(/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>
注意点:
-
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への転送操作を完了します
- 転送プレフィックスは転送操作を指定します
/** * forward:/hello.jsp * forward:转发到一个页面 * /hello.jsp:转发到当前项目下的hello * * 注意:一定加/,如果不加/就是相对路径,容易出问题 */ @RequestMapping("/handle01") public String handle01(){ System.out.println("handle01"); return "forward:/hello.jsp"; }
- リダイレクトプレフィックスは、ページへのリダイレクトを指定します
/** * 重定向到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、カスタムビュー
-
カスタムビューパーサーを記述し、実装クラスを表示します
コントローラ方式:
/** * 自定义视图解析器和视图对象 */ @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; } } }
-
ビューリゾルバーを機能させてカスタムビューオブジェクトを作成するには、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>
この時点で:カスタムビューリゾルバーは解決を優先します:(応答ページを取得します)