ITPub博客

首页 > 应用开发 > Java > Java Web系列:Java Web项目基础

Java Web系列:Java Web项目基础

Java 作者:始于初见止于终老 时间:2021-02-02 20:29:41 0 删除 编辑

1.Java Web 模块结构

JSP 文件和AXPX文件类似,路径和URL一一对应,都会被动态编译为单独class。Java Web和ASP.NET的核心是分别是 Servlet 和 IHttpHandler 接口,因此无论是基础的Page文件(JSP、ASPX)方式还是后来发展的MVC方式(Spring MVC、ASP.NET MVC)都是基于核心接口的基础上再次封装和扩展( DispatcherServlet 、 MvcHandler )。

除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 是我们必须了解和掌握的。

|--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中的一些核心项对应如下:


Java 参考3

.NET

备注

Core

javax.servlet.Servlet

System.Web.IHttpHandler


HTTP Request

javax.servlet.ServletRequest

System.Web.HttpRequest


HTTP Response

javax.servlet.ServletResponse

System.web.HttpResponse


Cookie

javax.servlet.http.Cookie

System.Web.HttpCookie


Session

javax.servlet.http.HttpSession

System.Web.HttpSessionState


Application

javax.servlet.ServletContext

System.Web.HttpApplication


Begin Request

javax.servlet.Servlet.RequestDispatcher

System.Web.HttpApplication.BeginRequest

event  

Begin\End Request

javax.servlet.Servlet.ServletRequestListener

System.Web.HttpApplication.BeginRequest\EndRequest

event  

Filter

javax.servlet.Filter

System.Web.IHttpModule


Application Event

javax.servlet.ServletContextListener

System.Web.HttpApplication.Application_Start\Application_End

method

用于简化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并转发调用)。

  View Code

(2)自定义继承HttpServletRequestWrapper的MyRequest

  View Code

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

  View Code

通过注解配置了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的一些抽象定义有点过头了,不够简洁。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69994154/viewspace-2755587/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: javascript误区
请登录后发表评论 登录
全部评论

注册时间:2021-01-28

  • 博文量
    6
  • 访问量
    2360