2023 SpringMvc および春の 8 本足のエッセイ - 面接の質問

概要

Spring MVCとは何ですか? Spring MVC についての理解を簡単に紹介してください。

Spring MVC は、リクエスト駆動型の MVC デザイン パターンを実装する Java ベースの軽量 Web フレームワークです。モデル、ビュー、コントローラーを分離することで、Web 層の責任を切り離し、複雑な Web アプリケーションを論理的に明確ないくつかの部分に分割します。開発を簡素化し、エラーを減らし、グループ内の開発者間の協力を促進します。

Spring MVCの利点

(1) JSP に限らず、さまざまなビュー技術をサポートできます。

(2) Spring フレームワーク (IoC コンテナー、AOP など) との統合。

(3) 明確な役割割り当て: フロント コントローラー (dispatcherServlet)、リクエストからハンドラーへのマッピング (handlerMapping)、ハンドラー アダプター (HandlerAdapter)、ビュー リゾルバー (ViewResolver)。

(4) 要求されたさまざまなリソースのマッピング戦略をサポートします。

コアコンポーネント

Spring MVC の主要コンポーネント?

(1) フロントエンドコントローラ DispatcherServlet の役割 (プログラマ開発不要)
: リクエストを受信して​​結果に応答する、フォワーダに相当 DispatcherServlet を使用することで、他のコンポーネント間の結合が軽減されます。

(2) プロセッサ マッパー HandlerMapping (プログラマの開発は必要ありません)
機能: 要求された URL に従ってハンドラーを検索します

(3) プロセッサアダプタ HandlerAdapter
注: Handler を記述する場合、アダプタ HandlerAdapter が Handler を正しく実行できるように、HandlerAdapter が要求する規則に従って Handler を記述する必要があります。

(4) プロセッサ ハンドラ (プログラマの開発が必要)

(5) ビューリゾルバ ViewResolver(プログラマ開発不要)
機能:ビューを解析し、ビューの論理名に従って実際のビュー(ビュー)に解決します。

(6) View View (プログラマが jsp を開発する必要があります)
View はインターフェイスであり、その実装クラスはさまざまなビュー タイプ (jsp、freemarker、pdf など) をサポートします。

DispatcherServlet とは

Spring の MVC フレームワークは、すべての HTTP リクエストとレスポンスを処理するために使用される DispatcherServlet を中心に設計されています。

Spring MVC フレームワークのコントローラーとは何ですか?

コントローラーは、通常はサービス インターフェイスを介して、アプリケーションの動作へのアクセスを提供します。コントローラーはユーザー入力を解析し、ビューによってユーザーに表示されるモデルに変換します。Spring は非常に抽象的な方法で制御層を実装し、ユーザーが複数の目的でコントローラーを作成できるようにします。

Spring MVC のコントローラーはシングルトン モードですか?そうであれば、何が問題であり、その解決方法は何ですか?

回答: シングルトン モードであるため、マルチスレッド アクセス中にスレッド セーフティの問題があります。パフォーマンスに影響を与えるため、同期を使用しないでください。解決策は、コントローラーにフィールドを書き込まないことです。

動作原理

Spring MVCのワークフローについて説明してください。DispatcherServlet のワークフローについて説明してください。

(1) ユーザーはフロント コントローラーの DispatcherServlet にリクエストを送信します。

(2) DispatcherServlet はリクエストを受信した後、HandlerMapping プロセッサ マッパーを呼び出してハンドルをリクエストします。

(3) プロセッサ マッパーは、リクエスト URL に従って特定のプロセッサを見つけ、プロセッサ オブジェクトとプロセッサ インターセプタ (存在する場合) を生成し、それを DispatcherServlet に返します。

(4) DispatcherServlet は HandlerAdapter プロセッサ アダプタを呼び出します。

(5) HandlerAdapter は、特定のプロセッサ (ハンドラー、バックエンド コントローラーとも呼ばれます) を呼び出すように構成されています。

(6) 実行完了後、ハンドラーは ModelAndView に戻ります。

(7) HandlerAdapter は、Handler の実行結果 ModelAndView を DispatcherServlet に返します。

(8) DispatcherServlet は分析のために ModelAndView を ViewResolver に渡します。

(9) ViewResolver は解析後に特定の View を返します。

(10) DispatcherServlet がビューをレンダリングします (つまり、モデル データをビューに入力します)。

(11) DispatcherServlet がユーザーに応答します。
[外部リンク画像の転送に失敗しました。ソース サイトには盗難防止リンク メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-VWBUjfGY-1692509157507) (05-Spring MVC 面接の質問 (2020 最新版))。アセット/SpringMVC workflow.png )]

MVCフレームワーク

MVCとは何ですか? MVC 設計パターンの利点は何ですか?

MVC はデザイン パターンです (デザイン パターンは、コードを記述し、日々の開発の経験を要約するための良い方法です)。モデル(model) - ビュー(view) - コントローラー(controller)、3層アーキテクチャの設計パターン。フロントエンドのページ表示とバックエンドの業務データ処理の分離を実現するために使用されます。

MVC デザイン パターンの利点

1. 階層設計により、ビジネス システムのさまざまなコンポーネント間の分離が実現され、ビジネス システムの拡張性と保守性が向上します。

2. システムの並行開発が容易になり、開発効率が向上します。

共通の注意事項

アノテーションの原理とは何ですか

アノテーションの本質はアノテーションを継承した特別なインターフェースであり、その具体的な実装クラスはJavaランタイムによって生成される動的プロキシクラスです。リフレクションを通じてアノテーションを取得すると、Java ランタイムによって生成された動的プロキシ オブジェクトが返されます。プロキシ オブジェクトを通じてカスタム アノテーションを呼び出すメソッドは、最終的に AnnotationInvocationHandler の invoke メソッドを呼び出します。このメソッドは、memberValues Map から対応する値にインデックスを付けます。memberValues のソースは Java 定数プールです。

Spring MVCで一般的に使用されるアノテーションは何ですか?

@RequestMapping: リクエスト URL マッピングを処理するためのアノテーション。クラスまたはメソッドで使用できます。クラスで使用すると、リクエストに応答するクラス内のすべてのメソッドがこのアドレスを親パスとして使用することを意味します。

@RequestBody: アノテーションは、http リクエストの json データを受信し、その json を Java オブジェクトに変換することを実現します。

@ResponseBody: アノテーション実装は、conreoller メソッドによって返されたオブジェクトを json オブジェクトに変換して、クライアントに応答します。

SpingMvc のコントローラーにはどのアノテーションが一般的に使用されますか?また、置き換え可能な他のアノテーションはありますか?

回答: 一般に、@Controller アノテーションが使用されますが、@RestController も使用できます。@RestController アノテーションは、@ResponseBody + @Controller と同等であり、プレゼンテーション層であることを示します。また、通常、他のアノテーションによって置き換えられることはありません。

@Controller アノテーションの役割

Spring MVCでは、DispatcherServletで振り分けられたリクエストの処理をコントローラーが担当し、ユーザーからリクエストされたデータを業務処理層で処理した後、モデルにカプセル化し、対応するビューにモデルを返して表示します。Spring MVC は非常にシンプルな機能を提供します。

コントローラーのメソッドを定義すると便利です。特定のクラスを継承したり、特定のインターフェイスを実装したりする必要はなく、単に使用するだけです。

@Controller を使用してクラスをコントローラーとしてマークし、@RequestMapping や @RequestParam などのいくつかのアノテーションを使用して URL リクエストとコントローラー メソッド間のマッピングを定義し、外部からコントローラーにアクセスできるようにします。また、コントローラーは直接依存しません。

HttpServletRequest や HttpServletResponse などの HttpServlet オブジェクトは、Controller メソッドのパラメーターを通じて柔軟に取得できます。

@Controller はクラスをマークするために使用され、これでマークされたクラスは Spring MVC です

コントローラーオブジェクト。ディスパッチプロセッサは、アノテーションを使用してクラスのメソッドをスキャンし、メソッドを検出します。

メソッドが @RequestMapping アノテーションを使用するかどうか。@Controller はコントローラー クラスを定義するだけであり、@RequestMapping アノテーションが付けられたメソッドが実際にリクエストを処理するプロセッサーとなります。Spring はまだそれを認識していないため、クラスで @Controller タグを使用するだけでは、それが Spring MVC のコントローラー クラスであるとは言えません。では、Spring はどのようにしてそれを認識するのでしょうか? この時点で、このコントローラー クラスを Spring に渡して管理する必要があります。次の 2 つの方法があります。

  • Spring MVCの設定ファイルにMyControllerのBeanオブジェクトを定義します。
  • Spring MVC 構成ファイルで、@Controller とマークされたコントローラー コントローラーの場所を Spring に指示します。

@RequestMapping アノテーションの役割

RequestMapping は、リクエスト アドレス マッピングを処理するために使用されるアノテーションであり、クラスまたはメソッドで使用できます。

これは、リクエストに応答するクラス内のすべてのメソッドがこのアドレスを親パスとして使用することを示すためにクラスで使用されます。

RequestMapping アノテーションには 6 つの属性があり、以下では説明のために 3 つのカテゴリに分けます (対応する例は以下にあります)。

値、メソッド

value: リクエストの実際のアドレスを指定します。指定されたアドレスは URI テンプレート モードにすることができます (後で説明します)。

メソッド: リクエストのメソッド タイプ (GET、POST、PUT、DELETE など) を指定します。消費、生成します。

Consumers: application/json、text/html など、リクエストを処理するために送信されたコンテンツ タイプ (Content-Type) を指定します。

生成: 返されるコンテンツ タイプを指定します。これは、リクエスト ヘッダーの (Accept) タイプに指定されたタイプが含まれる場合にのみ返されます (params、headers)

params: このメソッドで処理される前に、リクエストに特定のパラメータ値が含まれている必要があることを指定します。

headers: メソッドがリクエストを処理するには、リクエストに特定の指定されたヘッダー値が含まれている必要があることを指定します。

@ResponseBody アノテーションの役割

機能: このアノテーションは、Controller メソッドによって返されたオブジェクトを適切なメソッドに渡すために使用されます。

HttpMessageConverter が指定した形式に変換した後、Response オブジェクトのボディデータ領域に書き込みます。

いつ使用するか: 返されたデータが HTML タグを含むページではなく、他の形式 (json、xml など) のデータである場合に使用します。

@PathVariable と @RequestParam の違い

リクエスト パスには id の変数値があり、@PathVariable を通じて取得できます。

@RequestMapping(値 = “/page/{id}”, メソッド =

リクエストメソッド.GET)

@RequestParam は、静的 URL リクエストを Spring アノテーションに取得するために使用され、アクションで使用されます。

他の

Spring MVCとStruts2の違い

同じ点はすべて、Web プロジェクトの開発に使用される MVC プレゼンテーション層フレームワークに基づいています。

違い

1. フロントコントローラーが異なります。Spring MVC のフロント コントローラーはサーブレットです。

ディスパッチャサーブレット。struts2 のフロント コントローラーはフィルターです。

StrutsPreparedAndExcutorFilter。

2. リクエストパラメータの受け取り方法が異なります。Spring MVC はメソッド パラメーターを使用してリクエスト パラメーターを受け取ります。メソッドベースの開発、スレッドセーフは、シングル ケース開発またはマルチケース開発として設計できます。開発にはシングル ケース モードを使用することをお勧めします (実行効率が高くなります)。デフォルトは単一ケース開発モードです。Struts2 は、クラスのメンバー変数を通じてリクエストのパラメーターを受け取ります。これはクラスベースの開発であり、スレッドセーフではなく、マルチインスタンス開発用にのみ設計できます。

3. Struts は値スタックを使用してリクエストとレスポンスのデータを保存し、OGNL を通じてデータにアクセスします。Spring MVC はパラメータ パーサーを通じてリクエストの内容を解析し、メソッドのパラメータに値を割り当て、データとビューを ModelAndView オブジェクトにカプセル化します。をクリックし、リクエスト フィールドを介して ModelAndView のモデル データをページに転送します。Jsp ビュー パーサーはデフォルトで jstl を使用します。

4. スプリング統合とは異なります。Spring MVC は Spring フレームワークの一部であり、統合する必要はありません。エンタープライズプロジェクトでは、Spring MVC がより多く使用されます。

Spring MVC はリダイレクトと転送をどのように設定しますか?

(1) Forward: 「forward:user.do?name=method4」のように戻り値の前に「forward:」を追加します。

(2) リダイレクト: 「redirect:http://www.baidu.com」のように、戻り値の前に「redirect:」を追加します。

Spring MVC と AJAX はどのように相互に呼び出しますか?

Jackson フレームワークを通じて、Java のオブジェクトを Js が認識できる Json オブジェクトに直接変換できます。

具体的な手順は次のとおりです。

(1) Jackson.jarを追加する

(2) 設定ファイルにjsonのマッピングを設定する

(3) 受け取り側のAjaxメソッド内で直接オブジェクトやリストなどを返すこともできますが、メソッドの前に@ResponseBodyアノテーションを追加する必要があります。

POSTリクエストの中国語文字化け問題の解決方法とGETリクエストの対処方法は?

(1) 投稿リクエストの文字化け問題を解決します。

web.xml で CharacterEncodingFilter フィルターを構成し、utf-8 に設定します。

1 <filter>
2 <filter‐name>CharacterEncodingFilter</filter‐name>
3 <filter‐class>org.springframework.web.filter.CharacterEncodingFilter</fi
lter‐class>
4
5 <init‐param>
6 <param‐name>encoding</param‐name>
7 <param‐value>utf‐8</param‐value>
8 </init‐param>
9 </filter>
10
11 <filter‐mapping>
12 <filter‐name>CharacterEncodingFilter</filter‐name>
13 <url‐pattern>/*</url‐pattern>
14 </filter‐mapping>

(2) get リクエストの中国語パラメータの文字化けに対する解決策は 2 つあります。

① Tomcat 設定ファイルを変更して、次のようにプロジェクト コードと一致するコードを追加します。

1 <ConnectorURIEncoding="utf‐8" connectionTimeout="20000" port="8080" proto
col="HTTP/1.1" redirectPort="8443"/>

②パラメータを再コーディングする別の方法:

文字列ユーザー名 = 新しい

String(request.getParamter(“ユーザー名”).getBytes(“ISO8859-

1")、"utf-8")

ISO8859-1 は Tomcat のデフォルトのエンコードであり、Tomcat によってエンコードされたコンテンツは utf-8 でエンコードされる必要があります。

Spring MVCでの例外処理?

回答: 例外は Spring フレームワークにスローされ、Spring フレームワークによって処理されます。必要なのは、単純な例外ハンドラーを構成し、例外ハンドラーにビュー ページを追加することだけです。

インターセプトリクエストで、getメソッドによって送信されたメソッドをインターセプトしたい場合、その設定方法

回答: @RequestMapping アノテーションに method=RequestMethod.GET を追加できます。

メソッドでリクエストまたはセッションを取得するにはどうすればよいですか?

回答: メソッドの仮パラメータでリクエストを直接宣言すると、Spring MVC が自動的にリクエスト オブジェクトを渡します。

インターセプト メソッドでフォアグラウンドから渡されたパラメーターを取得したい場合、どうすれば取得できますか?

回答: このパラメータは仮パラメータで直接宣言できますが、名前は渡されたパラメータと同じである必要があります。

フォアグラウンドで渡されるパラメーターが多数あり、それらのパラメーターがすべてオブジェクトである場合、このオブジェクトをすばやく取得するにはどうすればよいでしょうか?

回答: このオブジェクトをメソッド内で直接宣言すると、Spring MVC がこのオブジェクトに属性を自動的に割り当てます。

Spring MVCの関数の戻り値は何ですか?

回答: 戻り値には、String、ModelAndView などの多くの型を含めることができます。ModelAndView クラスはビューとデータを組み合わせますが、一般的には String を使用することをお勧めします。

Spring MVC はバックグラウンドからフォアグラウンドにデータを転送するためにどのオブジェクトを使用しますか?

回答: ModelMap オブジェクトを通じて、このオブジェクトの put メソッドを呼び出し、そのオブジェクトにオブジェクトを追加すると、フロント デスクが el 式を通じてそれを取得できます。

ModelMap のデータをセッションに入れるにはどうすればよいですか?

回答: クラスに @SessionAttributes アノテーションを追加できます。そのアノテーションに含まれる文字列がセッションに入力されるキーになります。

Spring MVCでインターセプターを記述する方法

記述方法は 2 つあり、1 つは HandlerInterceptor インターフェイスを実装する方法、もう 1 つはアダプター クラスを継承してインターフェイス メソッドに処理ロジックを実装し、Spring MVC 構成ファイルでインターセプターを構成する方法です。

1 <!‐‐ 配置Spring MVC的拦截器 ‐‐>
2 <mvc:interceptors>
3 <!‐‐ 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 ‐‐>
4 <bean id="myInterceptor" class="com.zwp.action.MyHandlerInterceptor"></b
ean>
5 <!‐‐ 只针对部分请求拦截 ‐‐>
6 <mvc:interceptor>
7 <mvc:mapping path="/modelMap.do" />
8 <bean class="com.zwp.action.MyHandlerInterceptorAdapter" />
9 </mvc:interceptor>
10 </mvc:interceptors>

WebApplicationContext の導入

Interceptor" class="com.zwp.action.MyHandlerInterceptor"></b
ean>
5 <!‐‐ 一部のリクエストのみインターセプト‐‐>
6 mvc:interceptor
7 <mvc:mapping path="/modelMap.do" / >
8
9 </mvc:interceptor>
10 </mvc:interceptors>


## 介绍一下 WebApplicationContext

WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。

おすすめ

転載: blog.csdn.net/leader_song/article/details/132391111