除JSP文件外,其他全部文件支配在运用目录的WEB-INF子目录下,WEB-INF目录可以认为是ASP.NET中将web.config文件、bin目录和App_开头的运行时目录存放在了一个统一的根目录中。

Java Web的配置文件web.xml也存放在WEB-INF目录下,而ASP.NET的配置文件web.config一样平常直接存放在运用目录下(ASP.NET其他目录同样可以有web.config文件)。
ASP.NET将所有的引用和代码天生的dll都支配在bin中,而Java Web的引用jar和天生的class分别存放在WEB-INF的子目录lib和classes中(参考1)。

综上,类似ASP.NET中的web.config、bin、App_Data等,Java Web中的WEB-INF、web.xml、lib和classes是我们必须理解和节制的。

为什么创建一个jsp就报错Java  Web项目基本 Angular

|--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目录:存放class文件(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文件。

我们创建一个命名为DynamicWP的默认天生web.xml的Dynamic Web Proejct项目。
文件构造如下:

|--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项目文件夹,存放了Eslipse项目的各种配置。
在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 app项目。
文件构造如下:

|--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搜索并添加servlet依赖更新后就可以正常运行。

2. Java构建路径问题警告:利用maven搜索并添加compiler插件并配置configuration节点更新就可以肃清。

3. 墙的问题配置maven镜像,我采取的是http://maven.oschina.net/content/groups/public/。

4. 默认创建的maven webapp短缺的src/main/java、src/test/java和src/test/resources等目录须要自己手动添加。

5. 修正.settings/org.eclipse.wst.common.project.facet.core.xml,更新<installed facet="jst.web" version="3.1"/>。

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.servlet根本

正如ASP.NET的核心是IHttpHandler一样,Java Web的核心是Servlet接口,位于javax.servlet命名空间中。
Filter的观点可以参考ASP.NET的HttpModule,Servlet中的各种Listener可以参考ASP.NET HttpApplicaiton中类似的event。
无论是Java还是.NET的Web技能,都是基于HTTP协议的详细实现。
Java Web和ASP.NET中的一些核心项对应如下:

Servlet和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标注的所有类型工具。

5.自定义Session

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

ASP.NET通过SessionStateModule通过配置文件配置实际的Session供应程序,Session供应程序实现了SessionStateStoreProviderBase,因此在ASP.NET中实现自定义Session是通过继续SessionStateStoreProviderBase实现,配置Session是通过Web.config。
ASP.NET自定义session的代码参考github上的开源项目SQLiteSessionStateStore。

同理,Java Servlet中利用自定义Session通过Filter可以实现。
由于不同的servlet容器对Session的实现不同,以是通用性最好的办法是继续HttpServletRequestWrapper重写getSession方法返回自定义的Session工具。
Filter采取了职责链模式(chain of responsibility),HttpServletRequestWrapper采取了装饰模式(Decorator),可以通过《Head First 设计模式》阅读模式的干系内容。

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

(2)自定义继续HttpServletRequestWrapper的MyRequest

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

通过表明配置了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的一些抽象定义有点过分了,不足简洁。