1. Java 웹 모듈 구조
JSP 파일 및 AXPX 파일과 마찬가지로 경로와 URL은 일대일로 대응하며 별도의 클래스로 동적으로 컴파일됩니다. Java Web과 ASP.NET의 핵심은 각각 Servlet과 IHttpHandler 인터페이스이므로 기본 페이지 파일(JSP, ASPX) 방식과 이후 개발된 MVC 방식(Spring MVC, ASP.NET MVC)은 모두 핵심을 기반으로 합니다. 기본적으로 다시 캡슐화하고 확장합니다(DispatcherServlet, MvcHandler). (권장:java video tutorial)
JSP 파일을 제외한 다른 모든 파일은 애플리케이션 디렉토리의 WEB-INF 하위 디렉토리에 배포됩니다. ASP.NET에서는 web.config 파일, bin 디렉터리, App_으로 시작하는 런타임 디렉터리가 통합된 루트 디렉터리에 저장됩니다.
Java 웹의 구성 파일 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 등과 유사한 WEB-INF, web.xml, lib 및 Java Web의 클래스는 우리가 이해하고 마스터해야 하는 것입니다.
|--Assembly Root |---WEB-INF/ |--web.xml |--lib/ |--classes/
1. WEB-INF 디렉터리: Java 웹 파일의 루트 디렉터리입니다.
2.web.xml 파일: 구성 파일(asp.net web.config).
3. lib 디렉터리: 클래스 라이브러리 파일(asp.net bin)을 저장합니다.
4. 클래스 디렉터리: 클래스 파일(asp.net bin)을 저장합니다.
2. Java 웹 프로젝트의 기본 구조 [Eclipse Dynamic Web Project]
Eclipse Dynamic Web 프로젝트 Project
(1) 컴파일해야 하는 소스 코드 디렉터리와 출력 디렉터리를 구성할 수 있습니다. src 디렉터리의 소스 파일은 기본적으로 buildclasses 디렉터리로 컴파일됩니다.
(2) 기본적으로 WebContent로 설정되는 WEB-INF의 루트 디렉터리를 구성할 수 있습니다.
(3) 기본 web.xml 파일 생성 여부를 선택할 수 있습니다.
기본적으로 web.xml을 생성하는 DynamicWP라는 동적 웹 프로젝트 프로젝트를 만듭니다. 파일 구조는 다음과 같습니다.
|--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은 Eclipse 프로젝트 폴더입니다. Eslipse 프로젝트를 다양한 구성으로 저장합니다. Eclipse 프로젝트 보기에는 표시되지 않습니다.
2. src 디렉터리에는 소스 코드가 저장됩니다. Eclipse 프로젝트 뷰의 Java Resources/src에 해당합니다.
3. 빌드는 컴파일된 파일을 저장합니다.
4 비슷한 작업 공간.metadata.pluginsorg.eclipse.wst.server.coretmp1wtpwebappsDynamicWP 디렉토리에서 런타임 파일 구조를 볼 수 있습니다.
3. Maven 웹 프로젝트의 기본 구조
현재 많은 Java IDE가 있으며 모두 예, Eclipse의 Java 웹 프로젝트는 이식성이 없습니다. Maven은 프로젝트 구조의 사양 문제를 해결할 뿐만 아니라 강력한 참조 처리와 같은 강력한 기능을 제공하므로 프로젝트 레이아웃 및 기타 측면에서 사실상 표준이 되었습니다. Maven 프로젝트의 주요 구조는 다음과 같습니다(참고 2):
|--root |--pom.xml |--src/ |--main/ |--java/ |--resources/ |--webapp/ |--test/ |--java/ |--resources |--target/
Eclipse에서 새로운 Maven 웹 앱 프로젝트를 생성합니다. 파일 구조는 다음과 같습니다:
|--MavenWP |--pom.xml |--.project |--.classpath |--.settings/ |--src/ |--target/ |--classes/ |--m2e-wtp/
1: maven 프로젝트 구성 파일.
2.project 파일과 .classpath 파일은 물론 .settings 디렉터리와 target/m2e-wtp 디렉터리의 파일도 Eclipse 프로젝트 구성 파일입니다.
3, src 및 대상: 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 웹앱에서 누락된 src/main/java, src/test/java 및 src/test/resources 디렉터리를 수동으로 추가해야 합니다.
5. .settings/org.eclipse.wst.common.project.facet.core.xml을 수정하고
6 web.xml 루트 노드의 시작 부분은 다음과 같이 수정됩니다.
Maven의 구성 파일 pom.xml:
4.0.0 me.test MavenWP war 0.0.1-SNAPSHOT MavenWP Maven Webapp http://maven.apache.org junit junit 3.8.1 test javax.servlet javax.servlet-api 3.1.0 MavenWP org.apache.maven.plugins maven-compiler-plugin 3.3 1.8 1.8
# #4. 서블릿 기본
ASP.NET의 핵심이 IHttpHandler인 것처럼 Java 웹의 핵심은 다음 위치에 있는 Servlet 인터페이스입니다. javax.servlet 네임스페이스. 필터의 개념은 ASP.NET의 HttpModule을 참조할 수 있으며, 서블릿의 다양한 리스너는 ASP.NET HttpApplicaiton의 유사한 이벤트를 참조할 수 있습니다. Java이든 .NET 웹 기술이든 모두 HTTP 프로토콜의 특정 구현을 기반으로 합니다. Java 웹 및 ASP.NET의 일부 핵심 항목은 다음과 같습니다.서블릿 및 ASP.NET의 단순화된 다이어그램:
用于简化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 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 EnumerationgetAttributeNames() { 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 웹 프로젝트 기본 사항에 대한 자세한 그래픽 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!