ホームページ  >  記事  >  Java  >  Java Web プロジェクトの基本を図で詳しく説明

Java Web プロジェクトの基本を図で詳しく説明

尚
転載
2019-11-27 14:19:383558ブラウズ

Java Web プロジェクトの基本を図で詳しく説明

1. Java Web モジュールの構造

JSP ファイルは AXPX ファイルに似ており、パスと URL は対応しています。 1 対 1 で、別のクラスに動的にコンパイルされます。 Java Web と ASP.NET のコアはそれぞれ Servlet と IHttpHandler インターフェイスであるため、基本的なページ ファイル (JSP、ASPX) メソッドとその後開発される MVC メソッド (Spring MVC、ASP.NET MVC) はどちらもコアに基づいています。基本的にはカプセル化して再度拡張します (DispatcherServlet、MvcHandler)。 (推奨: java ビデオ チュートリアル )

JSP ファイルを除き、他のすべてのファイルはアプリケーション ディレクトリの WEB-INF サブディレクトリにデプロイされます。WEB-INF ディレクトリは ASP と見なすことができます。 .NET App_ で始まる web.config ファイル、bin ディレクトリ、およびランタイム ディレクトリを統合ルート ディレクトリに保存します。

Java Web の構成ファイル web.xml も WEB-INF ディレクトリに格納されますが、ASP.NET の構成ファイル web.config は通常、アプリケーション ディレクトリに直接格納されます (他の ASP.NET ディレクトリにも web .config ファイル)。 ASP.NET はすべての参照とコード生成された DLL を bin に展開しますが、Java Web の参照 jar と生成されたクラスはそれぞれ WEB-INF のサブディレクトリ lib とクラスに保存されます (参考 1)。

要約すると、ASP.NET の web.config、bin、App_Data などと同様に、Java Web の WEB-INF、web.xml、lib、およびクラスを理解し、習得する必要があります。

|--Assembly Root
  |---WEB-INF/
    |--web.xml
    |--lib/
    |--classes/

1. WEB-INF ディレクトリ: Java Web ファイルのルート ディレクトリ。

2. web.xml ファイル: 構成ファイル (asp.net web.config)。

3. lib ディレクトリ: クラス ライブラリ ファイル (asp.net bin) を保存します。

4. Classes ディレクトリ: クラス ファイル (asp.net bin) を保存します。

2. Java Web プロジェクトの基本構造 [Eclipse Dynamic Web Project]

Eclipse Dynamic Web Project

( 1 ) コンパイルする必要があるソース コード ディレクトリと出力ディレクトリを設定できます。デフォルトでは、src ディレクトリ内のソース ファイルは build\classes ディレクトリにコンパイルされます。

(2) WEB-INF のルート ディレクトリを構成できます。デフォルトは WebContent です。

(3) デフォルトの web.xml ファイルを生成するかどうかを選択できます。

デフォルトで web.xml を生成する DynamicWP という名前の動的 Web プロジェクト プロジェクトを作成します。ファイル構造は次のとおりです:

|--DynamicWP
  |--.settings/
  |--build/
    |--classes/
  |--src/
  |--WebContent/
    |--META-INF/
      |--MANIFEST.MF
    |--WEB-INF/
      |--web.xml
      |--lib/

Eclipse プロジェクト エクスプローラーでの DyanmicWP プロジェクトの表示は次のとおりです:

|--DynamicWP
  |--Deployment Desciptor
  |--JAX-WS Web Services
  |--Java Resources
  |--JavaScript Resources
  |--build
  |--WebContent
    |--META-INF/
      |--MANIFEST.MF
    |--WEB-INF/
      |--web.xml
      |--lib/

1.settings は、さまざまな構成を保存する Eclipse プロジェクト フォルダーです。 Elipse プロジェクトの。 Eclipse プロジェクト ビューでは表示されません。

2. src ディレクトリにはソース コードが保存されます。 EclipseのプロジェクトビューのJava Resources/srcに相当します。

3. Build はコンパイルされたファイルを保存します。

4. ランタイム ファイル構造は、同様の \workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\DynamicWP ディレクトリで確認できます。

3. Maven Web プロジェクトの基本構造

多くの Java IDE があり、すべてに特定のサポーターが存在するという事実を考慮して, Eclipse の Java Web プロジェクト 移植性はありません。 Maven は、プロジェクト構造の仕様上の問題を解決するだけでなく、強力な参照処理などの強力な機能を提供し、プロジェクトのレイアウトなどにおいて、現在のデファクトスタンダードとなっています。 Maven プロジェクトの主な構造は次のとおりです (参考 2):

|--root
  |--pom.xml
  |--src/
    |--main/
      |--java/
      |--resources/
      |--webapp/
    |--test/
      |--java/
      |--resources
  |--target/

Eclipse で新しい Maven Web アプリ プロジェクトを作成します。ファイル構造は次のとおりです:

|--MavenWP
  |--pom.xml
  |--.project
  |--.classpath
  |--.settings/
  |--src/
  |--target/
    |--classes/
    |--m2e-wtp/

1. pom.xml: Maven プロジェクト構成ファイル。

2. .project ファイルと .classpath ファイル、および .settings ディレクトリと target/m2e-wtp ディレクトリ内のファイルは、Eclipse プロジェクト構成ファイルです。

3、src および target: Maven 標準プロジェクト ディレクトリ。

Eclipse4.5.1 の対応するプロジェクト リソース管理ビュー

|--MavenWP
  |--Deployment Desciptor/
  |--Java Resources/
  |--JavaScript Resources/
  |--Deployed Resources/
  |--src
  |--target
  |--pom.xml

1. 作成されたプロジェクトは、index.jsp を追加し、エラーを報告します: Maven を使用してサーブレットの依存関係を検索して追加し、その後、更新実行後は正常になります。

2. Java ビルド パスの問題の警告: Maven を使用してコンパイラー プラグインを検索して追加し、それを排除するように構成ノードの更新を構成します。

3. 壁の問題に対応する Maven イメージを構成するには、http://maven.oschina.net/content/groups/public/ を使用します。

4. デフォルトで作成される Maven Web アプリケーションに欠落している src/main/java、src/test/java、src/test/resources などのディレクトリは、手動で追加する必要があります。

5. .settings/org.eclipse.wst.common.project.facet.core.xml を変更し、 を更新します。

6. web.xml ルート ノードの先頭を次のように変更します:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">

Maven の設定ファイル pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>me.test</groupId>
    <artifactId>MavenWP</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>MavenWP Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>MavenWP</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

4.サーブレットの基本

ASP.NET のコアが IHttpHandler であるのと同じように、Java Web のコアは javax.servlet 名前空間にあるサーブレット インターフェイスです。フィルターの概念は ASP.NET の HttpModule を参照することができ、サーブレットのさまざまなリスナーは ASP.NET HttpApplicaiton の同様のイベントを参照することができます。

Java であっても .NET Web テクノロジであっても、それらはすべて HTTP プロトコルの特定の実装に基づいています。 Java Web と ASP.NET の一部のコア項目は次のように対応します。

Java Web プロジェクトの基本を図で詳しく説明サーブレットと ASP.NET の簡略図:

Java Web プロジェクトの基本を図で詳しく説明

用于简化web.xml配置的Servlet的注解(3.0开始支持,在ASP.NET中没有对应项):

(1)WebServlet:作用在javax.servlet.http.HttpServlet的实现类上。

(2)WebFilter:作用在javax.servlet.Filter的实现类上。

(3)WebListener:作用在Listener的实现类上(javax.servlet.ServletContextListener、javax.servlet.ServletContextAttributeListener、javax.servlet.ServletRequestListener、javax.servlet.ServletRequestAttributeListener、javax.servlet.http.HttpSessionListener、javax.servlet.http.HttpSessionAttributeListener)。

(4)WebInitParam:结合WebServlet和WebFilter注解用来配置属性。

(5)MultipartConfig:作用在javax.servlet.http.HttpServlet的实现类上。标注请求是mime/multipart类型。

用于Servlet容器初始化的ServletContainerInitializer(可实现无web.xml,3.0开始支持,可类比ASP.NET的Application_Start方法):

(1)Servlet容器启动时查找ServletContainerInitializer的实例。

(2)ServletContainerInitializer实例使用HandlesTypes标注一个或多个类型,Servlet容器将在启动时扫描classpath,获取这些类型的实例。

(3)Servlet容器在启动时调用ServletContainerInitializer实现类的onStartup方法,该方法可以获取HandlesTypes标注的所有类型对象。

五、自定义Session

Session在存储安全性要求较高的会话信息方面是必不可少的,Session当然绝对不是用来存储用户登录状态的,但类似验证码等敏感信息却必须存储在Session中。对于分布式Web应用自定义Session支持独立的状态服务器或集群是必须的。

ASP.NET通过SessionStateModule通过配置文件配置实际的Session提供程序,Session提供程序实现了SessionStateStoreProviderBase,因此在ASP.NET中实现自定义Session是通过继承SessionStateStoreProviderBase实现,配置Session是通过Web.config。

Java Web プロジェクトの基本を図で詳しく説明

同理,Java Servlet中使用自定义Session通过Filter可以实现。由于不同的servlet容器对Session的实现不同,所以通用性最好的方式是继承HttpServletRequestWrapper重写getSession方法返回自定义的Session对象。

(1)首先自定义继承HttpSession的MySession(为了便于演示,仅包装了容器的session并转发调用)。

import java.util.Enumeration;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

public class MySession implements HttpSession {

    private HttpSession _containerSession;

    public MySession(HttpSession session) {
        this._containerSession = session;
    }

    @Override
    public long getCreationTime() {
        return this._containerSession.getCreationTime();
    }

    @Override
    public String getId() {
        return this._containerSession.getId();
    }

    @Override
    public long getLastAccessedTime() {
        return this._containerSession.getLastAccessedTime();
    }

    @Override
    public ServletContext getServletContext() {
        return this._containerSession.getServletContext();
    }

    @Override
    public void setMaxInactiveInterval(int interval) {
        this._containerSession.setMaxInactiveInterval(interval);
    }

    @Override
    public int getMaxInactiveInterval() {
        return this._containerSession.getMaxInactiveInterval();
    }

    @SuppressWarnings("deprecation")
    @Override
    public HttpSessionContext getSessionContext() {
        return this._containerSession.getSessionContext();
    }

    @Override
    public Object getAttribute(String name) {
        return this._containerSession.getAttribute(name);
    }

    @SuppressWarnings("deprecation")
    @Override
    public Object getValue(String name) {
        return this._containerSession.getValue(name);
    }

    @Override
    public Enumeration<String> getAttributeNames() {
        return this._containerSession.getAttributeNames();
    }

    @SuppressWarnings("deprecation")
    @Override
    public String[] getValueNames() {
        return this._containerSession.getValueNames();
    }

    @Override
    public void setAttribute(String name, Object value) {
        this._containerSession.setAttribute(name, value);
    }

    @SuppressWarnings("deprecation")
    @Override
    public void putValue(String name, Object value) {
        this._containerSession.putValue(name, value);
    }

    @Override
    public void removeAttribute(String name) {
        this._containerSession.removeAttribute(name);
    }

    @SuppressWarnings("deprecation")
    @Override
    public void removeValue(String name) {
        this._containerSession.removeValue(name);
    }

    @Override
    public void invalidate() {
        this._containerSession.invalidate();
    }

    @Override
    public boolean isNew() {
        return this._containerSession.isNew();
    }

}

(2)自定义继承HttpServletRequestWrapper的MyRequest

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;

public class MyRequest extends HttpServletRequestWrapper {

    public MyRequest() {
        super(null);
    }

    public MyRequest(HttpServletRequest request) {
        super(request);
        // TODO 自动生成的构造函数存根
    }

    @Override
    public HttpSession getSession(boolean create) {
        return new MySession(super.getSession(create));
    }

    @Override
    public HttpSession getSession() {
        return new MySession(super.getSession());
    }
}

(3)自定义Filter将Request包装为MyRequest

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.http.HttpServletRequest;

@WebFilter("/*")
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO 自动生成的方法存根

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        chain.doFilter(new MyRequest((HttpServletRequest) request), response);

    }

    @Override
    public void destroy() {
        // TODO 自动生成的方法存根

    }

}

通过注解配置了Filter,也可以通过原始的web.xml方式配置。

小结:

你至少应该知道的:

(1)配置文件:ASP.NET的web.config和Java的web.xml

(2)Web核心:ASP.NET的IHttpHandler接口和Java的Servlet接口

(3)拦截器:ASP.NET的HttpModule和Java的Filter

(4)应用程序事件:ASP.NET的HttpApplication event和Java的各种Listener

(5)启动器:ASP.NET的Application_Start和Java的ServletContainerInitializer

(6)引用管理:ASP.NET的Nuget和Java的Maven

感想:

ASP.NET的核心对象不像Java Servlet一样,从一开始就基于接口,这是缺点。但Java Servlet的核心对象全靠容器实现,就连HttpSession同样如此,这也是缺点。比如自定义个Session十分麻烦,没有像ASP.NET一样简单配置即可。另外Servlet的一些抽象定义有点过头了,不够简洁。

更多java知识请关注java基础教程栏目。

以上がJava Web プロジェクトの基本を図で詳しく説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。