Heim Java JavaBase Detaillierte grafische Erläuterung der Grundlagen von Java-Webprojekten

Detaillierte grafische Erläuterung der Grundlagen von Java-Webprojekten

Nov 27, 2019 pm 02:19 PM
java

Detaillierte grafische Erläuterung der Grundlagen von Java-Webprojekten

1. Java-Webmodulstruktur

JSP-Dateien ähneln AXPX-Dateien und die Pfade und URLs entsprechen eins zu eins wird dynamisch in eine separate Klasse kompiliert. Der Kern von Java Web und ASP.NET sind die Servlet- bzw. IHttpHandler-Schnittstellen. Daher basieren sowohl die grundlegende Page-File-Methode (JSP, ASPX) als auch die später entwickelte MVC-Methode (Spring MVC, ASP.NET MVC). Schnittstelle grundsätzlich kapseln und erneut erweitern (DispatcherServlet, MvcHandler). (Empfohlen: Java-Video-Tutorial)

Mit Ausnahme von JSP-Dateien werden alle anderen Dateien im Unterverzeichnis WEB-INF des Anwendungsverzeichnisses bereitgestellt. Das Verzeichnis WEB-INF kann als ASP betrachtet werden .NET Speichern Sie die web.config-Datei, das Bin-Verzeichnis und das Laufzeitverzeichnis, beginnend mit App_, in einem einheitlichen Stammverzeichnis.

Die Konfigurationsdatei web.xml von Java Web wird ebenfalls im WEB-INF-Verzeichnis gespeichert, während die Konfigurationsdatei web.config von ASP.NET im Allgemeinen direkt im Anwendungsverzeichnis gespeichert wird (andere ASP.NET-Verzeichnisse können ebenfalls über web.net verfügen). .config-Datei). ASP.NET stellt alle Referenzen und vom Code generierten DLLs in bin bereit, während die Referenz-JARs und generierten Klassen von Java Web in den Unterverzeichnissen lib bzw. Classes von WEB-INF gespeichert werden (Referenz 1).

Zusammenfassend lässt sich sagen, dass wir, ähnlich wie web.config, bin, App_Data usw. in ASP.NET, WEB-INF, web.xml, lib und Klassen in Java Web verstehen und beherrschen müssen.

|--Assembly Root
  |---WEB-INF/
    |--web.xml
    |--lib/
    |--classes/
Nach dem Login kopieren

1. WEB-INF-Verzeichnis: das Stammverzeichnis der Java-Webdateien.

2. web.xml-Datei: Konfigurationsdatei (asp.net web.config).

3. lib-Verzeichnis: speichert Klassenbibliotheksdateien (asp.net bin).

4. Klassenverzeichnis: speichert Klassendateien (asp.net bin).

2. Grundstruktur des Java-Webprojekts [Eclipse Dynamic Web Project]

Eclipse Dynamic Web Project

( 1 ) Sie können das Quellcodeverzeichnis und das Ausgabeverzeichnis konfigurieren, die kompiliert werden müssen. Standardmäßig werden die Quelldateien im src-Verzeichnis in das Buildclasses-Verzeichnis kompiliert.

(2) Sie können das Stammverzeichnis von WEB-INF konfigurieren, das standardmäßig WebContent ist.

(3) Sie können wählen, ob eine standardmäßige web.xml-Datei generiert werden soll.

Wir erstellen ein dynamisches Webprojekt namens DynamicWP, das standardmäßig web.xml generiert. Die Dateistruktur ist wie folgt:

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

Die Ansicht des DyanmicWP-Projekts im Eclipse-Projekt-Explorer ist wie folgt:

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

1.settings ist der Eclipse-Projektordner, in dem verschiedene Konfigurationen gespeichert sind des Eslipse-Projekts. In der Eclipse-Projektansicht nicht sichtbar.

2. Das src-Verzeichnis speichert den Quellcode. In der Projektansicht von Eclipse entspricht es Java Resources/src.

3. Build speichert kompilierte Dateien.

4. Sie können die Laufzeitdateistruktur in einem ähnlichen workspace.metadata.pluginsorg.eclipse.wst.server.coretmp1wtpwebappsDynamicWP-Verzeichnis anzeigen.

3. Grundstruktur des Maven-Webprojekts

Angesichts der Tatsache, dass es viele Java-IDEs gibt und sie alle einen bestimmten Grad haben Zur Unterstützung ist das Java-Webprojekt von Eclipse nicht portierbar. Maven löst nicht nur das Spezifikationsproblem der Projektstruktur, sondern bietet auch leistungsstarke Funktionen wie eine leistungsstarke Referenzverarbeitung. Es ist zum aktuellen De-facto-Standard in Bezug auf das Projektlayout und andere Aspekte geworden. Die Hauptstruktur des Maven-Projekts ist wie folgt (Referenz 2):

|--root
  |--pom.xml
  |--src/
    |--main/
      |--java/
      |--resources/
      |--webapp/
    |--test/
      |--java/
      |--resources
  |--target/
Nach dem Login kopieren

Erstellen Sie ein neues Maven-Web-App-Projekt in Eclipse. Die Dateistruktur ist wie folgt:

|--MavenWP
  |--pom.xml
  |--.project
  |--.classpath
  |--.settings/
  |--src/
  |--target/
    |--classes/
    |--m2e-wtp/
Nach dem Login kopieren

1. pom.xml: Maven-Projektkonfigurationsdatei.

2. Die .project-Datei und die .classpath-Datei sowie die Dateien im .settings-Verzeichnis und im target/m2e-wtp-Verzeichnis sind Eclipse-Projektkonfigurationsdateien.

3. src und target: Maven-Standardprojektverzeichnis.

Entsprechende Projektressourcenverwaltungsansicht in Eclipse4.5.1

|--MavenWP
  |--Deployment Desciptor/
  |--Java Resources/
  |--JavaScript Resources/
  |--Deployed Resources/
  |--src
  |--target
  |--pom.xml
Nach dem Login kopieren

1. Das erstellte Projekt fügt eine index.jsp hinzu und meldet einen Fehler: Verwenden Sie Maven, um Servlet-Abhängigkeiten zu suchen und hinzuzufügen, und dann wird normal laufen.

2. Warnung vor Java-Build-Pfad: Verwenden Sie Maven, um das Compiler-Plug-in zu suchen und hinzuzufügen und das Konfigurationsknoten-Update zu konfigurieren, um es zu beseitigen.

3. Um das Maven-Image für das Wandproblem zu konfigurieren, verwende ich http://maven.oschina.net/content/groups/public/.

4. Verzeichnisse wie src/main/java, src/test/java und src/test/resources, die in der standardmäßig erstellten Maven-Webanwendung fehlen, müssen manuell hinzugefügt werden.

5. Ändern Sie .settings/org.eclipse.wst.common.project.facet.core.xml und aktualisieren Sie.

6. Der Anfang des web.xml-Wurzelknotens wird wie folgt geändert:

<?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">
Nach dem Login kopieren

Mavens Konfigurationsdatei 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>
Nach dem Login kopieren

4 . Servlet-Grundlagen

So wie der Kern von ASP.NET IHttpHandler ist, ist der Kern von Java Web die Servlet-Schnittstelle, die sich im Namespace javax.servlet befindet. Das Konzept von Filter kann auf das HttpModule von ASP.NET verweisen, und die verschiedenen Listener in Servlet können auf ähnliche Ereignisse in ASP.NET HttpApplicaiton verweisen.

Ob es sich um Java- oder .NET-Webtechnologie handelt, sie alle basieren auf der spezifischen Implementierung des HTTP-Protokolls. Einige Kernelemente in Java Web und ASP.NET entsprechen wie folgt:

Detaillierte grafische Erläuterung der Grundlagen von Java-WebprojektenVereinfachtes Diagramm von Servlet und ASP.NET:

Detaillierte grafische Erläuterung der Grundlagen von Java-Webprojekten

用于简化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。

Detaillierte grafische Erläuterung der Grundlagen von Java-Webprojekten

同理,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();
    }

}
Nach dem Login kopieren

(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());
    }
}
Nach dem Login kopieren

(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 自动生成的方法存根

    }

}
Nach dem Login kopieren

通过注解配置了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基础教程栏目。

Das obige ist der detaillierte Inhalt vonDetaillierte grafische Erläuterung der Grundlagen von Java-Webprojekten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Java -Programm, um das Kapselvolumen zu finden Java -Programm, um das Kapselvolumen zu finden Feb 07, 2025 am 11:37 AM

Kapseln sind dreidimensionale geometrische Figuren, die aus einem Zylinder und einer Hemisphäre an beiden Enden bestehen. Das Volumen der Kapsel kann berechnet werden, indem das Volumen des Zylinders und das Volumen der Hemisphäre an beiden Enden hinzugefügt werden. In diesem Tutorial wird erörtert, wie das Volumen einer bestimmten Kapsel in Java mit verschiedenen Methoden berechnet wird. Kapselvolumenformel Die Formel für das Kapselvolumen lautet wie folgt: Kapselvolumen = zylindrisches Volumenvolumen Zwei Hemisphäre Volumen In, R: Der Radius der Hemisphäre. H: Die Höhe des Zylinders (ohne die Hemisphäre). Beispiel 1 eingeben Radius = 5 Einheiten Höhe = 10 Einheiten Ausgabe Volumen = 1570,8 Kubikeinheiten erklären Berechnen Sie das Volumen mithilfe der Formel: Volumen = π × R2 × H (4

See all articles