1.スプリングMVCを深く理解する(MVCモードへのサポート)
32134 ワード
1.SpringMVCコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラコントローラのサポート
SpringMVCコントローラの核心はDispactch Servletです.
Displatch Servletの役割: Model処理ロジックの検索(HandlerMapping) Model処理ロジックの実行(Handler) Viewのレンダリング 1.1プロセッサコントローラの検索
1.1.1直接URLマッピングHandler
このマッピング方式は、springにSimpleUrlhandlerMappingタイプを登録するBeanによって実現される.
このマッピング方式は、ビーンのnameまたは別名が/で始まると、このビーンは自動的にHandlerのマッピングパスとして、URLはビーンのnameまたは別名であり、Handlerはこのビーン自体である.この自動登録のロジックはBeanNameUrlHanlerMappingで発生します.
これは最も一般的なマッピングの使用方法であり、そのHandler検索戦略はRequest MappingHandlerMappingによって実現される.
1.2プロセッサ実行
Handlerの検索と実行は分離されています.いくつかの一般的なHandlerを紹介します.
1.2.1 HttpRequest Handler
これは最も簡単なHandlerであり、一つの方法しかないHandleRequestは、HttpServletRequestとHttpServletResonseの2つのパラメータが入ってきています.しかも、リターン値がないので、reponseオブジェクトを通じて内容を返します.
インターフェース:
1.2.2 ControllerインターフェースのHandler
このHandlerはMVCで定義されたControllerにより近いです.同じようにhandleRequest法と同じパラメータしかありませんが、その戻り値はModelAndViewオブジェクトで、ModelとViewが封入されています.
このタイプのhandlerは、まずRequest MappinghandlerMappingで条件を満たす@Request Mappingを検索し、それを表示する方法をHandlerMethodオブジェクトHandlerMethodオブジェクトにパッケージします.SimpleUrlandlerMappingで組み合わせて使用することもできますが、一般的にはRequest Mappleppingと組み合わせて使用されます.
1.3インターセプター
Handlerを検索するとき、HandlerMappingはHandler自体に戻るのではなく、Handlerの実行チェーンHandler Execution Charinに戻ります.この実装チェーンは、このHandler上のすべてのブロックに適用する必要があります.
実行プロセス:は、プロセッサhandlerを実行する前に、Handler IntercepterのpreHandle方法を実行します.この方法がfalseに戻ると、処理の流れが中断される. はプロセッサHandlerを実行し、Handlerを実行した後、2つの結果があります. 正常にHandlerを実行したら、ブロックのpostHandleの方法を実行します.例外を出すと、この方法はスキップされます. 異常が発生しているかどうかにかかわらず、最終的にはafterCompration方法を実行します. 2.Spring MVCモデル(Model)へのサポート
2.1 Modelモデルの関連タイプ Mapインターフェース Modelインターフェース:属性の追加、マージ属性などの機能を提供しています.このインターフェースはMapを実現していませんが、asMap方法を使用してmap に変換することができます. ModelMapインターフェース:LinkdHashMapクラスを継承し、このインターフェースのすべての方法は、Mapのput方法によって、属性追加動作 を実現する. RedirectAttributesインターフェース:Modelインターフェースから継承され、このインターフェースはリダイレクトパラメータに特別な方法を提供し、addFlash Attributeを介してリダイレクトが使用できるModelパラメータを追加します. 2.2モデルの使用
1.Mapのタイプパラメータを宣言する
5.@ ModelAttribute方式この方式は同様に戻り値を取ってmodelに入れます.属性名は@ModelAttributeコメントの名称で、値は方法の戻り値です.
6.直接ModelAndViewに戻る
3.1ビュータイプ
(1)内部リソースビューInternal Resource View:このビューは内部リソースを表しています.このビューを作成するには、内部リソースの経路を示すためにURLが必要です.一般的なリソースのタイプは、静的リソース、JSPビュー、転送ビューの3つのビュー遷移が、対応する経路Request Displatchを取得することによって達成される.
転送ビューの例:
SpringMVCはView Resoloverインターフェースを提供して、ビュー名を検索して解析するためのビューを提供しています.このインターフェースは、resoveView Name方法があり、Viewビューに戻ります.
このようにviewビューを検索するにはspring容器のbeanとして宣言する必要があり、この解析方式はBenNameView Resolaverを通じて実行され、この方式は声明のbeanにviewインターフェースを実現するように要求される.
各テンプレートエンジンには自分のビュー解像器があり、spring-boot-starter-freemarrを導入した後、自動的にThymeleafViewResoloverをSprigMVCに生成します.デフォルトではこの解像度はクラスパス:/templates/をプレフィックスとして使います.
3.2.4直接指定ビュー
SpringMVCコントローラの核心はDispactch Servletです.
Displatch Servletの役割:
1.1.1直接URLマッピングHandler
このマッピング方式は、springにSimpleUrlhandlerMappingタイプを登録するBeanによって実現される.
@Configuration
public class HandlerMappingConfig {
@Bean
public SimpleUrlHandlerMapping simpleUrlHandlerMapping(){
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
// url handler , map
mapping.setUrlMap(Collections.singletonMap("/url1",Handler));
return mapping;
}
}
1.1.2 beanName(Handler)によるURLマッピングこのマッピング方式は、ビーンのnameまたは別名が/で始まると、このビーンは自動的にHandlerのマッピングパスとして、URLはビーンのnameまたは別名であり、Handlerはこのビーン自体である.この自動登録のロジックはBeanNameUrlHanlerMappingで発生します.
//
public class BeanNameUrlHandlerMapping extends AbstractDetectingUrlHandlerMapping {
public BeanNameUrlHandlerMapping() {
}
protected String[] determineUrlsForHandler(String beanName) {
List<String> urls = new ArrayList();
// beanName /
if (beanName.startsWith("/")) {
urls.add(beanName);
}
String[] aliases = this.getApplicationContext().getAliases(beanName);
String[] var4 = aliases;
int var5 = aliases.length;
for(int var6 = 0; var6 < var5; ++var6) {
String alias = var4[var6];
if (alias.startsWith("/")) {
urls.add(alias);
}
}
return StringUtils.toStringArray(urls);
}
}
登録方式は以下の2種類があります.(1)configration注釈類にbeanを入れます. @Bean(name={"/url1","url2"})
public HttpRequestHandler beanNameHandler(){
// handler
return new BeanNameUrlRequestHandler();
}
(2)Component注解を使ってbeanを取得する@Component()
public class BeanNameUrlRequestHandler{
...
}
1.1.3 Request Mappingマッピングこれは最も一般的なマッピングの使用方法であり、そのHandler検索戦略はRequest MappingHandlerMappingによって実現される.
1.2プロセッサ実行
Handlerの検索と実行は分離されています.いくつかの一般的なHandlerを紹介します.
1.2.1 HttpRequest Handler
これは最も簡単なHandlerであり、一つの方法しかないHandleRequestは、HttpServletRequestとHttpServletResonseの2つのパラメータが入ってきています.しかも、リターン値がないので、reponseオブジェクトを通じて内容を返します.
インターフェース:
public interface HttpRequestHandler {
void handleRequest(HttpServletRequest request, HttpServletResponse response);
}
使用:(1)まずHttpRequest Handlerの実装クラスを作成します.public class MyRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response){
response.getWriter().write("hello httpRequestHandler");
}
}
(2)関連mappingを使用して、このhandlerを検索できるようにする:@Configuration
public class HandlerMappingConfig {
@Bean
public SimpleUrlHandlerMapping simpleUrlHandlerMapping(){
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
// url handler , map
mapping.setUrlMap(Collections.singletonMap("/url1",new MyRequestHandler()));
return mapping;
}
}
このHandlerはビュールックアップ解析などの流れはないが、解析を必要としない静的リソースのいくつかに対しては、このhandlerを使用して実現することができる.1.2.2 ControllerインターフェースのHandler
このHandlerはMVCで定義されたControllerにより近いです.同じようにhandleRequest法と同じパラメータしかありませんが、その戻り値はModelAndViewオブジェクトで、ModelとViewが封入されています.
@Component("/myController")
public class MyController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
Map<String,Object> model = new HashMap<>();
model.put("name","123");
return new ModelAndView("defaultView",model);
}
}
1.2.3 Request Mapping定義のHandlerMethodこのタイプのhandlerは、まずRequest MappinghandlerMappingで条件を満たす@Request Mappingを検索し、それを表示する方法をHandlerMethodオブジェクトHandlerMethodオブジェクトにパッケージします.SimpleUrlandlerMappingで組み合わせて使用することもできますが、一般的にはRequest Mappleppingと組み合わせて使用されます.
1.3インターセプター
Handlerを検索するとき、HandlerMappingはHandler自体に戻るのではなく、Handlerの実行チェーンHandler Execution Charinに戻ります.この実装チェーンは、このHandler上のすべてのブロックに適用する必要があります.
実行プロセス:
2.1 Modelモデルの関連タイプ
1.Mapのタイプパラメータを宣言する
@RequestMapping("/testUrl")
public String mapParams(Map<String,Object> map){
map.put("name",123);
return "defaultView";
}
2.Modelのタイプパラメータを宣言する @RequestMapping("/testUrl")
public String modelParams(Model model){
model.addAttribute("name",123);
return "defaultView";
}
3.ModelMapタイプのパラメータModelMap自体はMapタイプと宣言していますが、Modelオープンインターフェース方法を使ってデータを操作することもできます. @RequestMapping("/testUrl")
public String modelMapParams(ModelMap modelMap){
modelMap.put("name",123);
modelMap.addAttribute("name",123);
return "defaultView";
}
4.自分でModelを作成して戻る @RequestMapping("/defaultView")
public Map createModel(){
Map<String,Object> model = new HashMap<>();
model.put("name",123);
return model;
}
ここではビデオではなくmodelオブジェクトを返しますので、ビューの名前はルートurlから来ています.ここのurlはdefault Viewです.だから、ビューの名前はdefault Viewです.5.@ ModelAttribute方式この方式は同様に戻り値を取ってmodelに入れます.属性名は@ModelAttributeコメントの名称で、値は方法の戻り値です.
6.直接ModelAndViewに戻る
@RequestMapping("/testUrl")
public ModelAndView createMV(){
ModelAndView mv = new ModelAndView();
mv.setViewName("/defaultView");
mv.addObject("name",123);
return mv;
}
3.SpringMVCのビューへのサポート3.1ビュータイプ
(1)内部リソースビューInternal Resource View:このビューは内部リソースを表しています.このビューを作成するには、内部リソースの経路を示すためにURLが必要です.一般的なリソースのタイプは、静的リソース、JSPビュー、転送ビューの3つのビュー遷移が、対応する経路Request Displatchを取得することによって達成される.
転送ビューの例:
@RequestMapping("/testUrl")
public String forwardView(Model model){
// ,springmvc request.setAttribute model request
model.addAttribute("name",123);
return "forward:forwardTargetView";
}
@RequestMapping("/forwardTargetView")
public String targetView(HttpServletRequest request,Model model){
// request, model
String name = (String)request.getAttribute("name");
model.addAttribute("name",name + 123);
return "defaultView"
}
(2)リダイレクトビュー @RequestMapping("/testRedirect")
public String redirectView(RedirectAttributes model){
model.addAttribute("name",123);
return "redirect:redirectTargetView";
}
3.2ビューの検索解析SpringMVCはView Resoloverインターフェースを提供して、ビュー名を検索して解析するためのビューを提供しています.このインターフェースは、resoveView Name方法があり、Viewビューに戻ります.
public interface ViewResolver {
/**
* params:
* viewName:
* locale: ,
*/
View resolveViewName(String viewName, Locale locale throws Exception;
}
3.2.1 BenNameを通じてビューを検索するこのようにviewビューを検索するにはspring容器のbeanとして宣言する必要があり、この解析方式はBenNameView Resolaverを通じて実行され、この方式は声明のbeanにviewインターフェースを実現するように要求される.
// /testUrl ViewName
@Component("testUrl")
public class CustomerView implements View {
@Override
public String getContentType() {
return MediaType.TEXT_HTML_VALUE;
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
Object name = model.get("name");
response.getWriter().write("name is " + name);
}
}
3.2.2テンプレートエンジン解析ビュー(Thymeleafを例にして)各テンプレートエンジンには自分のビュー解像器があり、spring-boot-starter-freemarrを導入した後、自動的にThymeleafViewResoloverをSprigMVCに生成します.デフォルトではこの解像度はクラスパス:/templates/をプレフィックスとして使います.
spring.thymeleaf.prefix =
spring.thymeleaf.suffix =
3.2.3内部リソースビューの解析3.2.4直接指定ビュー
@RequestMapping("/testUrl")
public View returnView(Model model){
model.addAttribute("name",123);
return new CustomerView();---> View
}