Javaインタビュー質問の全集(11)

Javaインタビュー質問の全集(11)

BaiyuITハハ

101.一般的に使用されるWebサーバーは何ですか?

回答:UnixおよびLinuxプラットフォームで最も広く使用されている無料のHTTPサーバーはApacheサーバーですが、Windowsプラットフォームサーバーは通常IISをWebサーバーとして使用します。Webサーバーを選択する際に考慮すべき要素は、パフォーマンス、セキュリティ、ログと統計、仮想ホスト、プロキシサーバー、バッファリングサービス、および統合アプリケーションです。以下は、一般的なサーバーの概要です。

  • IIS:MicrosoftのWebサーバー製品。フルネームはInternet InformationServicesです。IISは、パブリックイントラネットまたはインターネットで情報を公開できるようにするWebサーバーです。IISは現在最も人気のあるWebサーバー製品の1つであり、多くの有名なWebサイトがIISプラットフォーム上に構築されています。IISは、インターネットサービスを監視、構成、および制御するために使用できるInternet ServiceManagerと呼ばれるグラフィカルインターフェイス管理ツールを提供します。IISは、Webブラウジング、ファイル転送、ニュースサービス、メール送信などにそれぞれ使用されるWebサーバー、FTPサーバー、NNTPサーバー、SMTPサーバーを含むWebサービスコンポーネントであり、ネットワーク(インターネットとLANを含む)を有効にします。情報の公開は非常に簡単な作業になりました。Webサーバーの機能を拡張するためのプログラミングインターフェイスとしてISAPI(Intranet Server API)を提供すると同時に、データベースのクエリと更新を行うことができるインターネットデータベースコネクタも提供します。
  • Kangle:Kangle Webサーバーは、クロスプラットフォームで、強力で、安全で、安定していて、操作が簡単な高性能Webサーバーおよびリバースプロキシサーバーソフトウェアです。さらに、Kangleは、仮想ホスティング専用に開発されたWebサーバーでもあります。仮想ホストに依存しないプロセスと独立したID操作を実現します。ユーザー間のセキュリティ分離。1人のユーザーが他のユーザーに影響を与えることはありません。PHP、ASP、ASP.NET、Java、Rubyなどの複数の動的開発言語をサポートします。
  • WebSphere:WebSphere Application Serverは、完全に機能するオープンなWebアプリケーションサーバーです。これは、IBMのeコマースプランの中核部分です。インターネットおよびイントラネットWebアプリケーションを確立、展開、および管理し、さまざまなものに適応するためのJavaベースのアプリケーション環境です。 Webアプリケーションサーバーの必要性。
  • WebLogic:WebLogic Serverは、企業がエンタープライズアプリケーションを構築するための強固な基盤を提供する、多機能の標準ベースのWebアプリケーションサーバーです。Weblogicは、さまざまなアプリケーション開発、主要なタスクの展開、さまざまなシステムとデータベースの統合、およびインターネット間のコラボレーションに対応するサポートを提供します。その包括的な機能、オープンスタンダードへの準拠、マルチレイヤーアーキテクチャ、およびコンポーネントベースの開発のサポートにより、多くの企業のエンタープライズレベルのアプリケーションは、開発および展開環境としてそれを選択します。WebLogic Serverは、アプリケーションサーバーをエンタープライズアプリケーションアーキテクチャの基盤にする上で主導的な立場にあり、統合されたエンタープライズレベルのアプリケーションを構築するための強固な基盤を提供しています。
  • Apache:現在、Apacheは依然として世界で最も使用されているWebサーバーであり、その市場シェアは長い間60%を超えています(現在の市場シェアは約40%です)。世界の多くの有名なWebサイトはApacheの製品です。その成功は、オープンソースコード、強力な開発チーム、およびクロスプラットフォームアプリケーションのサポートにあります(ほぼすべてのUnix、Windows、Linuxシステムで実行できます)プラットフォーム)とその移植性。
  • Tomcat:Tomcatはオープンソースであり、ServletとJSPコンテナを実行しています。Tomcatは、サーブレットとJSPの仕様を実装しています。さらに、TomcatはApache-Jakarta仕様も実装しており、ほとんどの商用アプリケーションソフトウェアサーバーよりも優れているため、現在多くのWebサーバーがTomcatを選択しています。
  • Nginx:「enginex」と発音されます。これは、高性能HTTPおよびリバースプロキシサーバーであり、IMAP / POP3 / SMTPプロキシサーバーでもあります。Nginxは、ロシアで2番目に訪問されたランブラーサイト用にIgor Sysoevによって開発されました。最初のパブリックバージョン0.1.0は、2004年10月4日にリリースされました。ソースコードはBSDのようなライセンスの形式でリリースされます。これは、安定性、豊富な機能セット、サンプル構成ファイル、およびシステムリソースの消費量が少ないことで知られています。2014年下半期、Nginxの市場シェアは14%に達しました。

    102. JSPとサーブレットの関係は何ですか?

    回答:実際、この問題はすでに上記で説明されています。サーブレットは、サーバーのJVMで実行され、サーバーのサポートを受けてブラウザーに表示コンテンツを提供できる特別なJavaプログラムです。JSPは基本的にServletの単純な形式です。JSPはサーバーによってServletに似たJavaプログラムに処理され、ページコンテンツの生成を簡素化できます。ServletとJSPの主な違いは、ServletのアプリケーションロジックがJavaファイルにあり、プレゼンテーションレイヤーのHTMLから完全に分離されていることです。JSPの場合、JavaとHTMLを組み合わせて.jsp拡張子のファイルにすることができます。ServletはJavaでHTMLを記述し、JSPはHTMLでJavaコードを記述していると言う人もいます。もちろん、このステートメントは非常に一方的なものであり、十分に正確ではありません。JSPはビューに焦点を合わせ、Servletは制御ロジックに焦点を合わせます。MVCアーキテクチャパターンでは、JSPはビュー(ビュー)に適しており、Servletはコントローラー(コントローラー)に適しています。

    103.JSPの4つのスコープについて説明します。

    回答:JSPの4つのスコープには、ページ、リクエスト、セッション、およびアプリケーションが含まれます。具体的には、次のとおりです。

  • pageは、ページに関連するオブジェクトと属性を表します。
  • requestは、Webクライアントによって発行された要求に関連するオブジェクトと属性を表します。リクエストは複数のページにまたがり、複数のWebコンポーネントを含む場合があります。ページに表示する必要のある一時データは、このスコープに配置できます。
  • セッションは、特定のユーザーがサーバーと確立したセッションに関連するオブジェクトと属性を表します。ユーザーに関連するデータは、ユーザー自身のセッションに配置する必要があります。
  • アプリケーションは、Webアプリケーション全体に関連するオブジェクトと属性を表します。これは基本的に、複数のページ、要求、およびセッションを含むWebアプリケーション全体にまたがるグローバルスコープです。

    104. JSPまたはサーブレットのシングルスレッドモードを実現するにはどうすればよいですか?

    回答:
    JSPページの場合、pageコマンドで設定できます。
    <%@ page isThreadSafe =” false”%>
    Servletの場合、カスタムServletにSingleThreadModel識別インターフェイスを実装させることができます。

注:JSPまたはServletがシングルスレッド作業モードに設定されている場合、各リクエストでServletインスタンスが作成されます。この方法では、重大なパフォーマンスの問題が発生します(サーバーのメモリ負荷が非常に大きく、ガベージコレクションが頻繁に発生します)。したがって、通常は実行されません。

105.セッション追跡を実装するためのテクノロジーは何ですか?

回答:HTTPプロトコル自体はステートレスであるため、サーバーは異なるユーザーを区別するためにユーザーセッションを追跡する必要があります。つまり、ユーザーを登録し、ユーザーに一意のIDを割り当てる必要があります。次にユーザーがこれをリクエストに含めるときID、サーバーはこれに基づいてどのユーザーであるかを判断します。
①URLの書き換え:URLにユーザーセッション情報をリクエストパラメータとして追加するか、URLの末尾に一意のセッションIDを追加してセッションを識別します。
②フォームの非表示フィールドを設定します。非表示のフォームフィールドにセッショントラッキングに関連するフィールドを追加します。この情報はブラウザには表示されませんが、フォームの送信時にサーバーに送信されます。
これらの2つの方法は、複数のページ間での情報転送を処理するのが困難です。毎回URLを変更したり、ユーザーセッション関連の情報を格納するためにページに暗黙のフォームフィールドを追加したりする必要がある場合、非常に面倒になります。
③Cookie:Cookieには2種類あります。1つはウィンドウベースです。ブラウザウィンドウを閉じるとCookieはなくなり、もう1つは情報を一時ファイルに保存して存在時間を設定します。ユーザーがブラウザを介してサーバーとのセッションを確立すると、セッションIDが応答情報とともに返され、ウィンドウベースのCookieに保存されます。つまり、ブラウザが閉じられておらず、セッションがタイムアウトしない限り、セッションIDは次のリクエストで再び表示されます。サーバーがユーザーを識別するためにサーバーに送信されます。セッション中にユーザーの情報を保存できます。セッションオブジェクトはサーバーのメモリにあり、ウィンドウベースのCookieはクライアントのメモリにあります。ブラウザがCookieを無効にしている場合、セッションの追跡には次の2つの方法が必要です。もちろん、Cookieを使用する際には、注意すべき点がいくつかあります。まず、機密情報をCookieに保存しないでください。次に、Cookieに保存するデータの量が制限されている(4k)ため、Cookieに多くのコンテンツを保存することはできません。また、ブラウザでは通常、1つのサイトしか許可されていません。最大20個のCookieを保存します。もちろん、ユーザーのセッションに関連する他の情報(セッションIDを除く)にも、セッションの追跡を容易にするためのCookieを含めることができます。
④HttpSession:すべてのセッション追跡テクノロジーの中で、HttpSessionオブジェクトは最も強力で最も用途が広いです。ユーザーが初めてWebサイトにアクセスすると、HttpSessionが自動的に作成され、各ユーザーは自分のHttpSessionにアクセスできます。HttpSessionは、HttpServletRequestオブジェクトのgetSessionメソッドを介して取得でき、値は、HttpSessionのsetAttributeメソッドを介してHttpSessionに配置できます。HttpSessionに格納されているオブジェクトは、HttpSessionオブジェクトのgetAttributeメソッドを呼び出し、属性名を渡すことによって取得できます。上記の3つの方法との違いは、HttpSessionがサーバーのメモリに配置されるため、メモリがいっぱいになったときに現在のServletコンテナがHttpSession内のオブジェクトを他のストレージデバイスに移動できる場合でも、大きすぎるオブジェクトを配置しないことです。 、しかし、これはパフォーマンスに影響を与えることになります。HttpSessionに追加される値は、任意のJavaオブジェクトにすることができます。このオブジェクトは、必要に応じてServletコンテナがファイルにシリアル化できるようにSerializableインターフェイスを実装することが望ましいです。そうしないと、シリアル化中に例外が発生します。

補足: Web StorageテクノロジーをHTML5で使用して、JavaScriptを介してデータを保存できます。たとえば、localStorageとsessionStorageを使用してユーザーセッション情報を保存でき、セッション追跡も実現できます。

106.フィルターの機能と使用法は何ですか?

回答:Java Web開発のフィルターは、Servlet 2.3仕様から追加され、Servlet2.4仕様で拡張された機能です。Webアプリケーションの場合、フィルターはサーバー側にあるWebコンポーネントであり、クライアントとサーバー間の要求および応答情報をインターセプトし、情報をフィルター処理できます。Webコンテナは、リソースの要求を受信すると、そのリソースに関連付けられているフィルターがあるかどうかを判別します。その場合、コンテナは要求を処理のためにフィルタに渡します。フィルタでは、リクエストの内容を変更したり、リクエストのヘッダー情報をリセットしてから、ターゲットリソースにリクエストを送信したりできます。ターゲットリソースがリクエストに応答すると、コンテナは最初にレスポンスをフィルタに転送します。ここで、レスポンスのコンテンツを変換してから、クライアントにレスポンスを送信できます。
一般的なフィルターの用途には、主に、ユーザーリクエストの均一な認証、ユーザーアクセスリクエストの記録と確認、ユーザーから送信されたデータのフィルタリングまたは置換、画像形式の変換、応答コンテンツの圧縮による送信の削減、要求または応答を暗号化および復号化し、リソースアクセスイベントをトリガーし、XSLTをXML出力に適用します。
フィルタに関連するインターフェイスには、主にFilter、FilterConfig、FilterChainが含まれます。
エンコードフィルターの例:


import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.annotation.WebInitParam;@WebFilter(urlPatterns = { "*" }, 
        initParams = {@WebInitParam(name="encoding", value="utf-8")})public class CodingFilter implements Filter {
    private String defaultEncoding = "utf-8";    @Override
    public void destroy() {
    }    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        req.setCharacterEncoding(defaultEncoding);
        resp.setCharacterEncoding(defaultEncoding);
        chain.doFilter(req, resp);
    }    @Override
    public void init(FilterConfig config) throws ServletException {
        String encoding = config.getInitParameter("encoding");        if (encoding != null) {
            defaultEncoding = encoding;
        }
    }
}

ダウンロードカウントフィルターの例:


import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.util.Properties;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;@WebFilter(urlPatterns = {"/*"})public class DownloadCounterFilter implements Filter {

    private ExecutorService executorService = Executors.newSingleThreadExecutor();    private Properties downloadLog;    private File logFile;    @Override
    public void destroy() {
        executorService.shutdown();
    }    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;        final String uri = request.getRequestURI();
        executorService.execute(new Runnable() {            @Override
            public void run() {
                String value = downloadLog.getProperty(uri);                if(value == null) {
                    downloadLog.setProperty(uri, "1");
                }                else {                    int count = Integer.parseInt(value);
                    downloadLog.setProperty(uri, String.valueOf(++count));
                }                try {
                    downloadLog.store(new FileWriter(logFile), "");
                } 
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        chain.doFilter(req, resp);
    }    @Override
    public void init(FilterConfig config) throws ServletException {
        String appPath = config.getServletContext().getRealPath("/");
        logFile = new File(appPath, "downloadLog.txt");        if(!logFile.exists()) {            try {
                logFile.createNewFile();
            } 
            catch(IOException e) {
                e.printStackTrace();
            }
        }
        downloadLog = new Properties();        try {
            downloadLog.load(new FileReader(logFile));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注:ここでは、Servlet 3仕様の注釈を使用してフィルターをデプロイします。もちろん、質問108に示すように、<filter>タグと<filter-mapping>タグを使用してweb.xmlにフィルターをデプロイすることもできます。

107.リスナーの機能と使用法は何ですか?

回答:Java Web開発のリスナーは、アプリケーション、セッション、および要求の3つのオブジェクトが作成、破棄、または追加されて属性を変更および削除すると、次のようにコードを自動的に実行する機能コンポーネントです
。①ServletContextListener:サーブレットコンテキストの作成そして監視のために破壊します。
②ServletContextAttributeListener:サーブレットコンテキスト属性の追加、削除、置換を監視します。
③HttpSessionListener:セッションの作成と破棄を監視します。

補足:セッション破棄には2つの状況があります:1)セッションタイムアウト(web.xmlの<session-config> / <session-timeout>タグを使用してタイムアウト時間を構成できます); 2)(セッションオブジェクトの)invalidate()を呼び出すことによって)メソッドはセッションを無効にします。

④HttpSessionAttributeListener:Sessionオブジェクトの属性の追加、削除、および置換を監視します。
⑤ServletRequestListener:リクエストオブジェクトの初期化と破棄を監視します。
⑥ServletRequestAttributeListener:リクエストオブジェクト属性の追加、削除、置換を監視します。
以下は、Webサイトで最も多くのオンラインユーザーをカウントするモニターの例です。

注:Servlet 3仕様の@WebListenerアノテーションは、リスナーの構成に使用されます。もちろん、質問108に示すように、web.xmlファイルの<listener>タグを使用してリスナーを構成できます。

108. web.xmlファイルで何を構成できますか?

回答:web.xmlは、リスナー、フィルター、サーブレット、関連パラメーター、セッションタイムアウト、セキュリティ検証方法、エラーページなど、Webアプリケーションの関連情報を構成するために使用されます。以下は開発中のものです。一般的な構成:
①Springコンテキストロードリスナーを構成して、Spring構成ファイルをロードし、IoCコンテナーを作成します。


  <context-param>
     <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

  <listener>
     <listener-class>
       org.springframework.web.context.ContextLoaderListener     </listener-class>
  </listener>

②遅延ロードと休止状態のセッション終了の間の矛盾を解決するために、SpringのOpenSessionInViewフィルターを構成します。


  <filter>
      <filter-name>openSessionInView</filter-name>
      <filter-class>
         org.springframework.orm.hibernate3.support.OpenSessionInViewFilter      </filter-class>
  </filter>

  <filter-mapping>
      <filter-name>openSessionInView</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

③セッションタイムアウト時間を10分に設定します。


  <session-config>
      <session-timeout>10</session-timeout>
  </session-config>

④404および例外エラーページを構成します。


  <error-page>
      <error-code>404</error-code>
      <location>/error.jsp</location>
  </error-page>

  <error-page>
      <exception-type>java.lang.Exception</exception-type>
      <location>/error.jsp</location>
  </error-page>

⑤セキュリティ認証方式を設定します。


  <security-constraint>
      <web-resource-collection>
          <web-resource-name>ProtectedArea</web-resource-name>
          <url-pattern>/admin/*</url-pattern>
          <http-method>GET</http-method>
          <http-method>POST</http-method>
      </web-resource-collection>
      <auth-constraint>
          <role-name>admin</role-name>
      </auth-constraint>
  </security-constraint>

  <login-config>
      <auth-method>BASIC</auth-method>
  </login-config>

  <security-role>
      <role-name>admin</role-name>
  </security-role>

注:Servlet(スモールサービス)、Listener(リスナー)、Filter(フィルター)などのWebコンポーネントの構成について、Servlet 3仕様は、注釈ベースの構成方法を提供します。これは、それぞれ@ WebServlet、@ WebListener、および@WebFilter注釈を使用して実行できます。構成。

補足:Webが貴重な商業情報または機密データを提供する場合は、サイトのセキュリティを考慮する必要があります。セキュリティ認証はセキュリティを達成するための重要な手段であり、認証は「あなたはあなたが誰であるか」という問題を解決することです。認証には多くの方法があります。要するに、次の3つのカテゴリに分類できます
。A。知っていること?—パスワード
B.持っているもの?—デジタル証明書(Uシールド、秘密のセキュリティカード)
C。あなたは誰ですか?—指紋認識、
セキュアソケットレイヤー(セキュアソケットレイヤー、SSL)を介したTomcatでの虹彩認識とセキュリティは、基本的なフォームの検証または検証をサポートすることで実現されます。

109.プロジェクトで使用されているJSTLタグはどれですか。

回答:JSTLのコアタグライブラリは主にプロジェクトで使用されます。これには、主にループの構築に使用される<c:if>、<c:choose>、<c:when>、<c:else>、<c:forEach>などが含まれます。そして、表示ロジックを制御するための分岐構造。

注:JSTLタグライブラリはコア、sql、fmt、xml、およびその他のタグライブラリを提供しますが、実際の開発ではコアタグライブラリ(コア)のみを使用することをお勧めします。式言語(EL)で補足されたブランチタグとループタグのみを使用することをお勧めします。 )、データ表示とビジネスロジックの分離を真に実現するために、これがベストプラクティスです。

110.タグライブラリを使用する利点は何ですか?JSPタグをカスタマイズする方法は?

回答:タグライブラリを使用する利点は次のとおりです。

  • JSPページのコンテンツとロジックを分離し、Web開発を簡素化します。
  • 開発者は、カスタムラベルを作成して、ビジネスロジックと表示ロジックをカプセル化できます。
  • ラベルは、優れた携帯性、保守性、および再利用性を備えています。
  • スクリプトレット(小さなスクリプト)の使用は避けてください(多くの企業では、プロジェクト開発のために小さなスクリプトをJSPで作成することを許可していません)
    JSPタグのカスタマイズには、次の手順が含まれます。
  • Tag / BodyTag / IterationTagインターフェイスを実装するJavaクラスを記述し(通常、開発時にこれらのインターフェイスを直接実装するのではなく、デフォルトの適応モードのアプリケーションであるTagSupport / BodyTagSupport / SimpleTagSupportクラスを継承します)、doStartTag()、doEndTagをオーバーライドします。 ()およびラベルによって完了する機能を定義するその他の方法
  • カスタムラベルを展開するには、拡張子tldを使用してラベル記述ファイルを記述します。tldファイルは通常、WEB-INFフォルダーまたはそのサブディレクトリに配置されます。
  • taglibディレクティブを使用して、JSPページのタグライブラリを参照します。
    以下は、カスタムタグライブラリの例です。
    ステップ1-タグクラスのソースコードTimeTag.java:

ステップ2-ラベルライブラリ記述ファイルmy.tldを書き込みます。


<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">

    <description>定义标签库</description>
    <tlib-version>1.0</tlib-version>
    <short-name>MyTag</short-name>
    <tag>
        <name>time</name>
        <tag-class>com.jackfrued.tags.TimeTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>format</name>
            <required>false</required>
        </attribute>
        <attribute>
            <name>foreColor</name>
        </attribute>
        <attribute>
            <name>backColor</name>
        </attribute>
    </tag></taglib>

手順3-JSPページでカスタムタグを使用する:


<%@ page pageEncoding="UTF-8"%><%@ taglib prefix="my" uri="/WEB-INF/tld/my.tld" %><%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%><!DOCTYPE html><html>
  <head>
    <base href="<%=basePath%>">
    <title>首页</title>
    <style type="text/css">
        * { font-family: "Arial"; font-size:72px; }
    </style>
  </head>

  <body>
    <my:time format="yyyy-MM-dd" backColor="blue" foreColor="yellow"/>
  </body></html>

ヒント:カスタムタグライブラリをJARファイルに公開する場合は、タグライブラリ記述ファイル(tldファイル)をJARファイルのMETA-INFディレクトリに配置する必要があり、JDKのjarツールを使用してJARファイルの生成を完了することができます。

おすすめ

転載: blog.51cto.com/15061944/2593706
おすすめ