一般的なエラーが発生しやすい問題の三つの要素でガイドのJava Webフィルタの前に導入され、その後、我々はSpringBoot環境にもたらし、この章のショーでは、サーブレット姿勢の使用を見て、Servelt 4姿勢のカスタムを登録します
@WebServlet
コメントServletRegistrationBean
Bean定義ServletContext
動的に追加- 普通のSpring Beanパターン
I.環境設定
ビルド1.プロジェクト
まず、我々はあなたが春ブーツの公式ウェブサイトでプロジェクトを作成することができ、その後の例はservelt登録実証容易にするために、Webプロジェクトをビルドする必要がある、あなたはまた、Mavenプロジェクト、のpom.xmlに以下の構成を作成することができます
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</pluginManagement>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/libs-snapshot-local</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
特記事項:
この記事から始まる、SpringBootの最新バージョンに追いつくために、エンジニアリングボーエンの例は、バージョンSpringBootへのアップグレードに対応します2.2.1.RELEASE
II。サーブレットの登録
比較的単純で、一般的な共通操作が継承されるサーブレットのカスタマイズHttpServlet
カバー、その後、doGet
、doPost
でき、他の方法が、焦点はここで、これらを識別することができ、使用がキーSpringBootでどのように私たちのカスタムサーブレットでは、登録方法の4種類があります
1. @WebServlet
Servlet3は+カスタムサーブレットに注釈を追加し@WebServlet
、このクラスはサーブレットを宣言することです
そしてFitler道の登録、春ブーツとこの注釈の使用とラインには@ServletComponentScan
、単に上記のコメントが反映されません追加します
/**
* 使用注解的方式来定义并注册一个自定义Servlet
* Created by @author yihui in 19:08 19/11/21.
*/
@WebServlet(urlPatterns = "/annotation")
public class AnnotationServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
PrintWriter writer = resp.getWriter();
writer.write("[AnnotationServlet] welcome " + name);
writer.flush();
writer.close();
}
}
上記のリクエストパラメータ受信、簡単なテストサーブレットでname
、リターンをwelcome xxx
、上記のコメントを有効にするために、起動クラスを提供
@ServletComponentScan
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
その後、テストを開始し、出力結果:
➜ ~ curl http://localhost:8080/annotation\?name\=yihuihui
# 输出结果
[AnnotationServlet] welcome yihuihui%
2. ServletRegistrationBean
登録フィルターは、私たちは春の豆を定義する方法がある知っているFilterRegistrationBean
Springコンテナは、私たちのフィルタを管理できるように、私たちのカスタムフィルタをラップするためには、サーブレットで同じ、同様のパッケージ豆があります。ServletRegistrationBean
カスタムBeanは、クラスが上の任意の注釈を持っていないことをメモして、次の
/**
* Created by @author yihui in 19:17 19/11/21.
*/
public class RegisterBeanServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
PrintWriter writer = resp.getWriter();
writer.write("[RegisterBeanServlet] welcome " + name);
writer.flush();
writer.close();
}
}
我々が定義する必要が次にServletRegistrationBean
、それが保持しているRegisterBeanServlet
例を
@Bean
public ServletRegistrationBean servletBean() {
ServletRegistrationBean registrationBean = new ServletRegistrationBean();
registrationBean.addUrlMappings("/register");
registrationBean.setServlet(new RegisterBeanServlet());
return registrationBean;
}
次のように出力テスト要求:
➜ ~ curl 'http://localhost:8080/register?name=yihuihui'
# 输出结果
[RegisterBeanServlet] welcome yihuihui%
3.のServletContext
この位置は、実際のサーブレット登録で、実際には、あまりにも多くの使用、主なアイデアは、によって、サーブレットコンテキストの初期化であるjavax.servlet.ServletContext#addServlet(java.lang.String, java.lang.Class<? extends javax.servlet.Servlet>)
サーブレットを追加積極的にする方法
取得するために適切な時間を見つける必要があり、我々はそうServletContext
SpringBoot生態学では、例をしてサーブレットを登録し、あなたは助けることができますServletContextInitializer
ServletContextInitializerは主にRegistrationBeanのServletContext容器登録サーブレット、フィルターまたはEventListenerを実装するために使用します。メインServletContextInitializerは、これらのインスタンスのSpring IoCコンテナの管理に使用されるように設計されています
/**
* Created by @author yihui in 19:49 19/11/21.
*/
public class ContextServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
PrintWriter writer = resp.getWriter();
writer.write("[ContextServlet] welcome " + name);
writer.flush();
writer.close();
}
}
/**
* Created by @author yihui in 19:50 19/11/21.
*/
@Component
public class SelfServletConfig implements ServletContextInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
ServletRegistration initServlet = servletContext.addServlet("contextServlet", ContextServlet.class);
initServlet.addMapping("/context");
}
}
試験結果は次の通りであります
➜ ~ curl 'http://localhost:8080/context?name=yihuihui'
# 输出结果
[ContextServlet] welcome yihuihui%
4.豆
次の登録こうして、エレガントではないが、あなたはまた、登録サーブレットの目的を達成することができますが、ピット、してください使用注意ギャングがあります
私の以前のブログ記事を読むのチュートリアルのWeb記事のフィルターフィルターガイド191016-SpringBootシリーズの学生を、ビットマップがあるかもしれない、フィルターに直接添加することができる@Component
春のコンテナがBeanをスキャンするとき、メモ、すべて実現されるフィルタを見つけましたサブクラス、およびそれがためのイニシアチブパッケージを取るFilterRegistrationBean
登録の目的を達成します
私たちのサーブレットは、これが起こることができていますか?我々が測定し次
@Component
public class BeanServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
PrintWriter writer = resp.getWriter();
writer.write("[BeanServlet1] welcome " + name);
writer.flush();
writer.close();
}
}
さて問題は、サーブレットの上にどのように要求して、urlMappingルールを定義されていませんか?
サーブレット以上登録されているかを決定するために、前面フィルタのソースコード解析によるキーリンクは、我々は、登録の実際の場所を見つけますServletContextInitializerBeans#addAsRegistrationBean
// org.springframework.boot.web.servlet.ServletContextInitializerBeans#addAsRegistrationBean(org.springframework.beans.factory.ListableBeanFactory, java.lang.Class<T>, java.lang.Class<B>, org.springframework.boot.web.servlet.ServletContextInitializerBeans.RegistrationBeanAdapter<T>)
@Override
public RegistrationBean createRegistrationBean(String name, Servlet source, int totalNumberOfSourceBeans) {
String url = (totalNumberOfSourceBeans != 1) ? "/" + name + "/" : "/";
if (name.equals(DISPATCHER_SERVLET_NAME)) {
url = "/"; // always map the main dispatcherServlet to "/"
}
ServletRegistrationBean<Servlet> bean = new ServletRegistrationBean<>(source, url);
bean.setName(name);
bean.setMultipartConfig(this.multipartConfig);
return bean;
}
あなたは、これはどちらかのサーブレットURLで、上記のコードから見ることができる/
のいずれか、/beanName/
その後、すべての404測定
➜ ~ curl 'http://localhost:8080/?name=yihuihui'
{"timestamp":"2019-11-22T00:52:00.448+0000","status":404,"error":"Not Found","message":"No message available","path":"/"}%
➜ ~ curl 'http://localhost:8080/beanServlet1?name=yihuihui'
{"timestamp":"2019-11-22T00:52:07.962+0000","status":404,"error":"Not Found","message":"No message available","path":"/beanServlet1"}%
➜ ~ curl 'http://localhost:8080/beanServlet1/?name=yihuihui'
{"timestamp":"2019-11-22T00:52:11.202+0000","status":404,"error":"Not Found","message":"No message available","path":"/beanServlet1/"}%
ときにサーブレットを定義します
@Component
public class BeanServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getParameter("name");
PrintWriter writer = resp.getWriter();
writer.write("[BeanServlet2] welcome " + name);
writer.flush();
writer.close();
}
}
テストを再び
➜ ~ curl 'http://localhost:8080/beanServlet1?name=yihuihui'
{"timestamp":"2019-11-22T00:54:12.692+0000","status":404,"error":"Not Found","message":"No message available","path":"/beanServlet1"}%
➜ ~ curl 'http://localhost:8080/beanServlet1/?name=yihuihui'
[BeanServlet1] welcome yihuihui%
➜ ~ curl 'http://localhost:8080/beanServlet2/?name=yihuihui'
[BeanServlet2] welcome yihuihui%
それは実際の試験結果から分かるように、この定義モードの使用は、このサーブレットのURLに対応しますbeanName + '/'
注意事項
その後、質問は、サーブレットの定義だけが、以前のソースコードの解析によれば、これは適切なサーブレットでなければならない場合には、http://localhost:8080/
要求が、テスト404なぜ場合?
あなたがたは、この質問に答える、主な問題は、サーブレットの優先順位があり、このようにサーブレットのそれぞれの優先順位は、これは単純であることを確認するためには、以下のURL Springのサーブレットに同じ要求に割り当てられた以上、春のWeb Servelt優先順位よりもあります二段階
- まず、アノテーション
BeanServlet2
クラスの注釈@Component
- では
BeanServlet1
、クラス、注釈を追加@Order(-10000)
次のようにもう一度テストを開始し、出力され
➜ ~ curl 'http://localhost:8080/?name=yihuihui'
[BeanServlet1] welcome yihuihui%
➜ ~ curl 'http://localhost:8080?name=yihuihui'
[BeanServlet1] welcome yihuihui%
5.まとめ
本論文では、サーブレットの使用は次の待っている案内するようサーブレットは、4つの方法を説明し、登録しました
二つの一般的な登録の場合:
@WebServlet
サーブレットクラスの注釈、クラスおよびブートを追加@ServletComponentScan
Serlvet3 +注釈を確保するためには、春に識別することができます- カスタムサーブレットの例では、Beanに委任しました
ServletRegistrationBean
二つのあまり一般的で登録の場合:
- インターフェイスを実装
ServletContextInitializer
することにより、ServletContext.addServlet
カスタムサーブレットへの登録 - 直接スプリングに登録され、通常の豆としてSerlvet
- プロジェクトがあるときにのみ、そのような場合は、サーブレット、応答URLです:それは要求を受信しない「/」が、ノートの優先度が指定されていないこと、デフォルトのシナリオサーブレット春優先順位の高い、ので、
- サーブレットのようにAの複数の場合は、URLの応答があるプロジェクト
beanName + '/'
、「/」の後ろに関心持っている必要があります
II。その他
プロジェクト・スコープ
ウェブシリーズボーエン
- 記事の191120-SpringBootのWebチュートリアルシリーズは、GZIPデータ圧縮を開きます
- チュートリアルのWebフィルターフィルターガイドの延長片の一連の191018-SpringBootの章
- チュートリアルのWebフィルタフィルタガイドのシリーズの191016-SpringBootの章
- 例外処理HandlerExceptionResolverのチュートリアルのカスタムWeb記事の191012-SpringBootシリーズ
- 記事の例外処理の191010-SpringBootグローバルウェブチュートリアルシリーズ
- チュートリアルWeb設定のシリーズの404、500例外ページ190930-SpringBootの章
- 記事チュートリアルウェブリダイレクションの190929-SpringBootシリーズ
- チュートリアルのWebテキスト、ウェブページ、画像操作姿勢のリターンシリーズの190913-SpringBootの章
- チュートリアルのWeb記事の190905-SpringBootシリーズは、中国の文字化けの問題を解決します
- パラメータパーサーをカスタマイズする方法についての記事の190831-SpringBootのWebチュートリアルシリーズ
- チュートリアルのWeb記事の190828-SpringBootシリーズPOSTリクエストパラメータの解析姿勢の概要
- チュートリアルのWeb記事の190824-SpringBootシリーズは、姿勢の概要を解析するリクエストパラメータを取得します。
- Beetlを構築するためのチュートリアルのWeb環境の一連の190822-SpringBootの章
- Thymeleafを構築するためのチュートリアルのWeb環境の一連の190820-SpringBootの章
- Freemakerを構築するためのチュートリアルのWeb環境の一連の190816-SpringBootの章
- WEB 190421-SpringBoot命令の高度な部分をWebSocketを
- 異常な完全な分析の190327-春RestTemplateでurlencodeパラメータ解析
- 建物のないJavaの設定XMLコンフィギュレーションの190317-Spring MVCのベースのWebアプリケーション
- XMLコンフィギュレーションを構築するための190316-Spring MVCのベースのWebアプリケーション
- 190213-SpringBootファイルアップロードのプロンプトは、一時的なアップロード先のxxxは有効ではありません異常検知します
ソースプロジェクト
- プロジェクト:https://github.com/liuyueyi/spring-boot-demo
- プロジェクト:https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/211-web-servlet
1.灰色のブログ
本は良いとして、上記、により制限され、個人能力に、純粋な言葉の一つであるされていない、すべてを信じて、それは避けられない欠落やミス、などのバグを見つけたり、より良い提案を歓迎批判と寛大な感謝されていがあります
ここでは灰色個人のブログ、ブログ内のすべての研究と仕事を記録し、周りに行くことを歓迎
- 灰色のブログ個人のブログhttps://blog.hhui.top
- 灰色のブログ-春のテーマのブログhttp://spring.hhui.top