精华内容
下载资源
问答
  • tomcat是基于JDK的web服务器,其能运行Servlet和JSP规范总。Tomcat 5支持最新的Servlet 2.4 和JSP 2.0规范。实际上Tomcat 部分是Apache服务器的扩展,但它是独立运行的。运行tomcat时,它实际作为一个与Apache ...

    一、Tomcat概述

     1.tomcat简介

             tomcat是基于JDK的web服务器,其能运行Servlet和JSP规范总。Tomcat 5支持最新的Servlet 2.4 和JSP 2.0规范。实际上Tomcat 部分是Apache服务器的扩展,但它是独立运行的。运行tomcat时,它实际上作为一个与Apache 独立的进程单独运行的。Apache 为HTML页面服务,而Tomcat实际上运行JSP页面和Servlet。tomcat具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。

        官网:tomcat.apache.org

        附录:其他的java web服务器实现

                商业版本:WebSphere、WebLogic、Oc4j… …

                开源实现:Tomcat、jetty、Resin

     

     2.Tomcat配置文件

      (1)配置文件种类

              server.xml:主配置文件

              context.xml:每个webapp有专用的配置文件,通常位于webapp应用程序目录下的WEB-INF目录中用于定义会话管理器、JDBC等;conf/context.xml是为各webapp提供默认配置;

               web.xml:用于为所有的webapp提供默认部署相关的配置;

               tomcat-users.xml:用户认证的账号和密码配置文件;

               catalina.policy:当使用-security选项启动tomcat实例时会读取此配置文件来实现其安全运行策略;

               catalina.properties:Java属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数;

              logging.properties:日志相关的配置信息;

      (2)主配置文件结构实例:

    <?xmlversion='1.0' encoding='utf-8'?>

    <Serverport="8005" shutdown="SHUTDOWN">

      <ListenerclassName="org.apache.catalina.startup.VersionLoggerListener" />

      <ListenerclassName="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on" />

      <ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>

      <ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>

      <ListenerclassName="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

      <GlobalNamingResources>

        <Resource name="UserDatabase"auth="Container"

                 type="org.apache.catalina.UserDatabase"

                  description="User databasethat can be updated and saved"

                 factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

                 pathname="conf/tomcat-users.xml" />

      </GlobalNamingResources>

      <Service name="Catalina">

        <Connector port="8080"protocol="HTTP/1.1"

                  connectionTimeout="20000"

                   redirectPort="8443"/>

        <Connectorexecutor="tomcatThreadPool"

                   port="8080"protocol="HTTP/1.1"

                  connectionTimeout="20000"

                   redirectPort="8443"/>

        <Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />

        <Engine name="Catalina"defaultHost="localhost">

        <Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />

        <Engine name="Catalina"defaultHost="localhost">

          <RealmclassName="org.apache.catalina.realm.LockOutRealm">

            <RealmclassName="org.apache.catalina.realm.UserDatabaseRealm"

                  resourceName="UserDatabase"/>

          </Realm>

          <Host name="localhost"  appBase="webapps"

                unpackWARs="true"autoDeploy="true">

            <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"

                  prefix="localhost_access_log" suffix=".txt"

                   pattern="%h %l %u %t&quot;%r&quot; %s %b" />

          </Host>

        </Engine>

      </Service>

    </Server>

     

      3.Java Web服务组织结构

           javaweb服务有特定的组织形式、层次型的目录结构;主要包含了servlet代码文件、JSP页面文件、类文件、部署描述符文件等;

    /

    web服务的根目录;相对的根路径

    WEB-IN

    私有资源目录,通常存放当前web服务器自用的web.xml;

    META-I

    私有资源目录,通常存放当前web服务器自用的context.xml;

    classes/

    此web服务的私有类;

    lib/

    此web服务的私有类,被打包为jar格式类;

    index.jsp

    web服务的主页

            webapp归档格式:.war:webapp;.jar:EJB的类库文件;.rar:资源适配器;.ear:企业级应用程序;

     

     

     

    二、安装启动Tomcat

      1.基于系统源安装RPM格式程序:openjdk + Tomcat

       (1)安装jdk(java developmentkit,java开发工具箱)

                jdk有两个版本:openjdk(开源版本)、Oracle JDK(商业版本)。此处用openjdk系列组件,需要安装三个程序包:java-1.7.0-openjdk、java-1.7.0-openjdk-devel、java-1.7.0-openjdk-devel

                 [root@localhost~]# yum install java-1.7.0-openjdk java-1.7.0-openjdk-develjava-1.7.0-openjdk-devel

       (2)配置jdk环境变量

         /usr/bin/java ->/etc/alternatives/java ->/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64/jre/bin/java,此三个位置是其软连接路径,目的是为了可以方便指向多个版本的JDK文件。

    wKiom1blL0OR8_KYAACXHcCzL_g962.png

            [root@localhost ~]# vim/etc/profile.d/java.sh        # 添加java环境变量

    export JAVA_HOME=/user/bin/java

            [root@localhost ~]# exec bash                # 重启shell进程以达到重读环境变量目的

            [root@localhost ~]# java -version      # 查看java版本确定jdk可用

    wKioL1blL8zxwmLAAABsg6_Rr7o001.png

    注意:

    Tomcat调用JDK是强依赖于环境变量JAVA_HOME,而不是/usr/bin/java

     (3)部署Tomcat

               [root@localhost ~]# yum install tomcattomcat-lib      # tomcat-lib在yum源码安装时会依赖安装,不要指明

               [root@localhost ~]# yum innstall tomcat-webapps tomcat-admin-webapps    # tomcat自带网页管理组件

       (4)启动服务

          [root@localhost~]# systemctl start tomcat.service

    wKiom1blL0ag_R66AAIvdQp250o829.png

    注意:

       1) 监听端口:8080 8009,8005。8005端口可以连接此端口发送关闭命令;8080是http监控端口;8009是ajp协议监控端口。

       2) 不能将默认端口8080改为80,但是在httpd反代的模式下可以监听在其他大于1024端口,仅有root用户才能使用1024内端口           

       3)  java运行无需root权限,tomcat是以普通用户身份运行。

     

      2.使用Oracle JDK+ Tomcat主站编译完成的安装包

       (1)下载平台版本适合程序包至本地,安装jdk

               [root@localhost~]# rpm -ivh jdk-8u25-linux-x64.rpm

    wKioL1blL9Ch6VT3AAEAWVYCoqo763.png

       (2)配置java环境变量

               [root@localhost ~]# vim /etc/profile.d/java.sh

    JAVA_HOME=/usr/java/latest

    PATH=$JAVA_HOME/bin:$PATH

    exportJAVA_HOME PATH

               [root@localhost~]# exec bash

               [root@localhost~]# java -version

       (3) 安装官网下载Tomcat

                [root@localhost~]# tar xf apache-tomcat-8.0.23.tar.gz -C /usr/local

                [root@localhost~]# cd /usr/local

                [root@localhostlocal]# ln -sv apache-tomcat-8.0.23/ tomcat

                [root@localhostlocal]# cd tomcat/

    wKioL1blL9HDpxmrAAD_F2W59bI265.png

         注释:Tomcat的目录结构

    bin:脚本及启动时用到的类

    lib: 提供的j类库

    man: 帮助手册

    conf:配置文件

    logs:日志文件

    webapps:应用程序默认部署目录

    work:工作目录,jsp代码编译成class文件装入JVM运行,临时放置编译文件位置

    temp:临时文件目录

     (4)启动环境变量

               [root@localhost ~]# vim/etc/profile.d/tomcat.sh    # 需要配置一个环境变量:CATALINA_BASE

    CATALINA_BASE=/usr/local/tomcat

    PATH=$CATALINA_BASE/bin:$PATH

    export CATALINA_BASE PATH

               [root@localhostbin]# exec bash

               [root@localhost~]# catalina.sh start

            此时可以调用/usr/local/tomcat/bin下的catalina.sh脚本运行,但是此时启动的tomcat进程是以root身份运行,不安全

    wKiom1blL0qhT0zEAAItAU7DlQc614.png

     (5)查看Tomcat和其调用的JDK版本信息

           [root@localhost~]# catalina.sh version

    wKiom1blL0zQOUytAAEC4G4ONjs310.png

     

     

     

    三、tomcat配置组件

     1.server:服务器组件

            这是一个顶级组件,其是一个tomcat实例,即运行一个jvm进程。每个server监听的端口不能相同,一个物理主机上启动多个server实例应该使用不同的端口。

           属性定义:port、shutdown、className,8005端口为关闭所使用

      <Serverport="8005" shutdown="SHUTDOWN">

      <ListenerclassName="org.apache.catalina.startup.VersionLoggerListener" />

     

     2.service:服务组件

             一个服务组件通常包含一个引擎和与此引擎相关联的一个或多个连接器。属性:name

        <Service name="Catalina">

     

     3.connector:连接器组件

           负责连接客户端(可以是浏览器或Web服务器)请求至Servlet容器内的Web应用程序,通常指的是接收客户发来请求的位置及服务器端分配的端口。默认端口通常是HTTP协议的8080,管理员也可以根据自己的需要改变此端口。一个引擎可以配置多个连接器,但这些连接器必须使用不同的端口。

    (1) tomcat作为独立的应用程序服务器,直接接受来自于浏览器的请求,此时仅能支持http、https协议传输

    (2) tomcat实现反代模式,其请求将来自于前面的反代主机

    当前端主机为httpd服务器可接受:http,https,ajp

    当前端主机为nginx服务器:http,ajp

         属性定义:

    address

    连接器监听的IP地址,不给出

    maxThreads

    最大并发线程数,默认为150

    port

    监听的TCP端口

    protocol

    连接器使用的协议,一般为HTTP/1.1或AJP/1.3

    redirectPort

    重定向端口

    connectionTimeout

    连接超时时长,单位为毫秒,默认为60000,一分钟

    enableLookups

    是否通过DNS服务实现查询

    acceptCount

    定义等待队列的长度

    scheme

    客户端请求对应映射的协议

    debug

    连接器是否启用调试功能

    secure

    工作在安全模式下

    clientAuth

    是否要验证客户端证书

    sslProcotol

    ssl协议版本

       实例:

    <Connectorport="8080" protocol="HTTP/1.1"

                  connectionTimeout="20000"

                   redirectPort="8443"/>

    <Connectorport="8443"protocol="org.apache.coyote.http11.Http11NioProtocol"

                   maxThreads="150"SSLEnabled="true" scheme="https" secure="true"

                   clientAuth="false"sslProtocol="TLS" />

    <Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />

    注意:

          1) 采用前端代理的方式且在httpd时候禁用tomcat的http功能能极大的提高安全性;且客户端访问http端口为80,而tomcat定义端口只能为任意大于1024的端口

          2) 实际生产中一般tomcat都是接受前端代理发来的请求,前端服务器和Tomcat之间通信不会是https加密,所以端口重定向不会使用。在连接器中定义redirectPort重定向规则,若端口未定义被Tomcatcat监听,定义也是无效的

          3) AJP: apachejserv protocol, 二进制协议

                ajp方式的连接器只有在前端主机时httpd服务时候才能启用。ajp传输比http文本类型协议传输效率更高。ajp方式和http方式不能同时使用。

     

     4.Engine:引擎(容器)组件

           Servive的一个实例,即servlet引擎,默认引擎是catalina。其内部可以有一个或多个Host组件来定义站点;通常需要通过defaultHost的属性定义默认虚拟主机,defaultHost后定义选项需要在Host中对应定义

    <Enginename="Catalina" defaultHost="localhost">

          <Host name="localhost"  appBase="webapps"

                unpackWARs="true"autoDeploy="true">

     </Engine>

        常用属性:name、default、JvmRoute(定义路由用户请求的方式是否附加一些条件)

     

     5.Host:虚拟主机组件

             位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义:

          <Host name="localhost"appBase="webapps"

            unpackWARs="true"autoDeploy="true"

            xmlValidation="false"xmlNamespaceAware="false">

          </Host>

         常用属性:

    name

    虚拟主机名称

    appBase

    存放非归档的web应用程序的目录或归档后的WAR文件的目录路径;可以为相对路径或绝对路径

    autoDeploy

    Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动部署;默认为true;

    unpackWars

    在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;

    xmlValidation

    是否验证xml语法合格性

    xmlNamespaceAware

    关注xml名称空间

      实例:

    <Enginename="Catalina" defaultHost="localhost">

          <Host name="localhost"appBase="webapps">

                <Context path=""docBase="ROOT"/>

                <Context path="/bbs"docBase="/web/bss"

              reloadable="true"crossContext="true"/>

          </Host>

        <Hostname="mail.magedu.com" appBase="/web/mail">

             <Context path="/"docBase="ROOT"/>

         </Host>

    </Engine>

      注意:

        主机别名定义:如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义<Alias></Alias>

     

     6.context:上下文组件

          类似于apache中的路径别名,一个Context定义用于标识tomcat实例中的一个Web应用程序;如下面的定义:

        <!-- Tomcat Root Context -->

        <Context path=""docBase="/web/webapps"/>

        <!-- buzzin webapp -->

        <Context path="/bbs"

          docBase="/web/threads/bbs"

          reloadable="true">

        </Context>

        <!-- chat server -->

          <Context path="/chat"docBase="/web/chat"/>

        <!-- darian web -->

        <Context path="/darian"docBase="darian"/>

      常用的属性定义:

            1)docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;docBase的路径名不能与相应的Host中appBase中定义的路径名有包含关系

            2)path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径;

                              如果context定义在一个单独的xml文件中,此属性不需要定义;

            3)reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false;

     注意:

         1) 在Tomcat6中,每一个context定义也可以使用一个单独的XML文件进行,其文件的目录为$CATALINA_HOME/conf/<enginename>/<hostname>。可以用于Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。

         2) path给定的路径不能以“/”结尾;

     

      7.Realm组件:

            一个Realm表示一个安全上下文,它是一个授权访问某个给定Context的用户列表和某用户所允许切换的角色相关定义的列表。因此,Realm就像是一个用户和组相关的数据库。定义Realm时惟一必须要提供的属性是classname,它是Realm的多个不同实现,用于表示此Realm认证的用户及角色等认证信息的存放位置。

    JAASRealm:基于JavaAuthintication and Authorization Service实现用户认证;

    JDBCRealm:通过JDBC访问某关系型数据库表实现用户认证;

    JNDIRealm:基于JNDI使用目录服务实现认证信息的获取;

    MemoryRealm:查找tomcat-user.xml文件实现用户信息的获取;

    UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)实现用户认证,它实现是一个完全可更新和持久有效的MemoryRealm,因此能够跟标准的MemoryRealm兼容;它通过JNDI实现;

    配置实例:

        UserDatabase的配置:

      <RealmclassName=”org.apache.catalina.realm.UserDatabaseRealm”

        resourceName=”UserDatabase”/>

        JDBC方式获取用户认证信息的配置:

      <RealmclassName="org.apache.catalina.realm.JDBCRealm" debug="99"

       driverName="org.gjt.mm.mysql.Driver"

       connectionURL="jdbc:mysql://localhost/authority"

        connectionName="test"connectionPassword="test"

        userTable="users"userNameCol="user_name"

        userCredCol="user_pass"

        userRoleTable="user_roles"roleNameCol="role_name" />

     

      8.Valve:阀门组件

               Valve类似于过滤器,它可以工作于Engine和Host/Context之间、Host和Context之间以及Context和Web应用程序的某资源之间。一个容器内可以建立多个Valve,而且Valve定义的次序也决定了它们生效的次序。

         Tomcat6中实现了多种不同的Valve:

    AccessLogValve:访问日志Valve

    ExtendedAccessValve:扩展功能的访问日志Valve

    JDBCAccessLogValve:通过JDBC将访问日志信息发送到数据库中;

    RequestDumperValve:请求转储Valve;

    RemoteAddrValve:基于远程地址的访问控制;

    RemoteHostValve:基于远程主机名称的访问控制;

    SemaphoreValve:用于控制Tomcat主机上任何容器上的并发访问数量;

               JvmRouteBinderValve:在配置多个Tomcat为以Apache通过mod_proxy或mod_jk作为前端的集群架构中,当期望停止某节点时,可以通过此Valve将用记请求定向至备用节点;使用此Valve,必须使用JvmRouteSessionIDBinderListener;

               ReplicationValve:专用于Tomcat集群架构中,可以在某个请求的session信息发生更改时触发session数据在各节点间进行复制;

                SingleSignOn:将两个或多个需要对用户进行认证webapp在认证用户时连接在一起,即一次认证即可访问所有连接在一起的webapp;

                ClusterSingleSingOn:对SingleSignOn的扩展,专用于Tomcat集群当中,需要结合ClusterSingleSignOnListener进行工作;

    相关属性定义:

           1)className:相关的java实现的类名,相应于分别应该为org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;

           2)allow:以逗号分开的允许访问的IP地址列表,支持正则表达式,因此,点号“.”用于IP地址时需要转义;仅定义allow项时,非明确allow的地址均被deny;

           3) deny:以逗号分开的禁止访问的IP地址列表,支持正则表达式;使用方式同allow;

      注意:

              RemoteHostValve和RemoteAddrValve可以分别用来实现基于主机名称和基于IP地址的访问控制,控制本身可以通过allow或deny来进行定义,这有点类似于Apache的访问控制功能;如下面的Valve则实现了仅允许本机访问/probe:

      <Context path="/probe"docBase="probe">

        <ValveclassName="org.apache.catalina.valves.RemoteAddrValve"

        allow="127\.0\.0\.1"/>

      </Context>

       实例:

            <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs"

                  prefix="localhost_access_log" suffix=".txt"

                   pattern="%h %l %u %t&quot;%r&quot; %s %b" />

    className

    类名称,常用公司域名反写的方式。

    directory

    默认相对路径,也可改为绝对路径

    prefix

    日志文件的前缀

    suffix

    日志文件的后缀

    pattern

    记录的值日信息包含的内容

      9.Listener

            Listener用于创建和配置LifecycleListener对象,而LifecycleListener通常被开发人员用来创建和删除容器。

      10.Loader

             Java的动态装载功能是其语言功能强大表现之一,Servlet容器使用此功能在运行时动态装载servlet和它们所依赖类。Loader可以用于Context中控制java类的加载。

     

     

     

    四、Tomcat的Web CUI控制接口配置

        tomcat自带的应用程序实现管理功能:manager app: webapp管理工具、host manager:虚拟主机管理工具

    wKioL1blL9myOzpLAAMM0w8lL9E023.png

      1.manager app: webapp管理工具

       (1)配置

    [root@localhost tomcat]# vim./conf/tomcat-users.xml   添加如下:

    <rolerolename="manager-gui"/>

    <userusername="tomcat" password="s3cret"roles="manager-gui"/>

    [root@localhosttomcat]# catalina.sh stop

    [root@localhosttomcat]# catalina.sh start

       说明:

            1) 支持角色:

    manager-gui

    允许访问HTMl图形化界面和状态页,最大权限

    manager-script

    允许访问文本接口和状态页

    manager-jmx

    JMX代理实现对状态管理

    manager-status

    仅授权你用户访问状态页面

    2) 配置后服务必须重启,应为java程序需要加载到内存

       (2)展示

    wKioL1blL9zC7ysWAAIO6pzcnp8763.png

    wKiom1blL1nTRab5AASTcXcEnds784.png

     

      2.host manager:虚拟主机管理工具

       (1)配置

    [root@localhost tomcat]# vim./conf/tomcat-users.xml   添加如下:

    <rolerolename="admin-gui"/>

    <userusername="tomcat" password="s3cret"roles="admin-gui"/>

    [root@localhosttomcat]# catalina.sh stop

    [root@localhosttomcat]# catalina.sh start

            支持角色:

                    admin-gui- allows access to the HTML GUI

                    admin-script- allows access to the text interface

       (2)展示

    wKiom1blL1qTZo_TAAGXgZMqtQk612.png

      注意:

           当定义相同的用户同时能够使用这两个工具需要按照如下定义

    <rolerolename="manager-gui" />

    <rolerolename="admin-gui"/>

    <userusername="tomcat" password="tomcat"roles="manager-gui,admin-gui"/>

    配置完任意一个后都可查看状态页:

    wKioL1blL-uwT8seAAZ0NowsBBM556.png

    转载于:https://www.cnblogs.com/wanghuaijun/p/7264403.html

    展开全文
  • tomcat web服务器

    2018-08-21 08:37:37
    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用...实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际作为一个与Apache 独立的进程单独运行的。
  • 方案二:将tomcat或jetty等java web服务器的源码改造,并将class文件转译成android能直接运行的dex格式文件(运行在Dalvik VM)。 注意,方案二,自己去改造服务器源码,对于一般人显然不现实,但是jetty官方...

     

    方案一:在android下搭建linux运行环境,然后在linux下运行java web服务器。

    方案二:将tomcat或jetty等java web服务器的源码改造,并将class文件转译成android能直接运行的dex格式文件(运行在Dalvik VM上)。

     

        注意,方案二,自己去改造服务器源码,对于一般人显然不现实,但是jetty官方提供了一个叫“i-jetty”的项目,可以直接在android下运行jetty服务器,然后安装dex转码过的war包。

     

    本文目前主要对方案二进行讲解。

     

        方案二,有一个很大的缺点,虽然class文件可以转换成dex格式文件运行,而且java反射也可以使用

    (因为android下为了使dex能运行,它重写了System ClassLoader,名字叫dalvik.system.DexClassLoader和PathClassLoader),

        但是,java classpath失效了,因为Dalvik VM根本不使用class。而且class打包成dex文件时,不会把classpath下面的资源文件也打包到dex文件中。

        所以,整个System ClassLoader无法获取任何class文件和资源文件。

        如果你的程序或者程序依赖的类库jar包中的代码,有用到classpath及资源文件加载的地方,都会失效,必须得重写这些代码的实现方式。

     

        举个例子,你把spring的application.properties文件放在classpath下面,肯定是无法使用的,甚至spring框架所依赖的Bean初始化,它会去classpath下面寻找配置的package下面的所有class文件,然后加载class文件中并读取里面的注解等,由于没有class了,所有它找不到class文件,而读取Android的dex文件需要特殊的实现,Spring等几乎所有的传统java框架或库,都没有这个功能。

        附:Spring扫描package下class文件的源码如下:

    private Set<BeanDefinition> scanCandidateComponents(String basePackage) {

        try {

        String packageSearchPath = "classpath*:" 

            resolveBasePackage(basePackage) + "/**/*.class";

        Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);

        for (Resource resource : resources) {

            logger.trace("Scanning " + resource);

        ...

    }

    // 代码来源:

    // org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider

        附:AndroidClassLoader源码解析,描述了从dex文件中查找资源的过程,涉及核心源码包括BaseDexClassLoader,DexPathList,DexFile

    参见:https://blog.csdn.net/qq_15274383/article/details/73306332

     

        值得一提的是,dex文件,是一个纯二进制文件,通常只包含class转换过的内容。你可以把dex文件当做一个map,可以通过标准的class name(比如com.zollty.test.Hello)来读取其二进制内容(类似于字节码),但是你不能通过package去寻找某个package下面有哪些类(它和传统的压缩包不同,传统的压缩包,比如zip,可以通过斜杆(/)分割的路径寻找里面的子文件,但是dex文件貌似不行)。我想从 dex文件查询  com.zollty 包下面的所有类,但是找不到方法。

     

        另外,注意,i-jetty 这个项目,官方没有怎么维护,实际使用起来问题很多,我也是花了整整2天时间,把i-jetty的源码,以及Android各个版本DexClassloader相关的源码,都分析阅读了之后,才把项目弄好。

        我重写了i-jetty的AndroidClassLoder,让它可以读取jar包中的资源文件,同时配合 maven  ant plugin自定义打包,将必要的java class和资源文件打包到 i-jetty的lib jar包中,同时配合我专用的zollty-mvc框架(能替代SpringMVC的绝大多数常用功能),以及android下专用的jdbc驱动,才把一个完整的项目跑起来,这里面的每个环节都不能少。

     

        源码已传到GitHub上:https://github.com/zollty/i-jetty

        如果不想直接写原生Servlet,强烈推荐配合“超轻量级MVC框架-ZolltyMVC”使用:https://github.com/zollty-org/zollty-mvc

        ZolltyMVC的代码量连SpringMVC的1%不到,但是却具备SpringMVC的80%常用功能。

     

    附:i-jetty使用说明

    1、将项目webapp文件夹复制到如下的webapps文件夹下:

    /storage/emulated/0/jetty/webapps

        项目webapp文件夹包含如下内容:

    1)静态文件;

    2)WEB-INF文件夹,下面有一个web.xml和lib\classes.zip

    其中classes.zip是classpath下面所有文件的(class文件转译成android的dex文件后)打包而成。

    classes.zip是在maven工程中,直接用maven插件打包生成。

        该Maven插件配置代码如下:

    <build>

      <plugins>

         

        <plugin>

          <groupId>org.apache.maven.plugins</groupId>

          <artifactId>maven-dependency-plugin</artifactId>

          <version>2.3</version>

          <executions>

            <execution>

              <id>unpack-dependencies</id>

              <phase>generate-sources</phase>

              <goals>

                <goal>unpack-dependencies</goal>

              </goals>

              <configuration>

                <failOnMissingClassifierArtifact>false</failOnMissingClassifierArtifact>

                <excludeArtifactIds>servlet-api,android,i-jetty-server,jetty-util</excludeArtifactIds>

                <excludeTransitive>true</excludeTransitive>

                <outputDirectory>${project.build.directory}/generated-classes</outputDirectory>

              </configuration>

            </execution>

          </executions>

        </plugin>

     

         

        <plugin>

          <artifactId>maven-antrun-plugin</artifactId>

          <executions>

            <execution>

              <id>copydex</id>

              <phase>process-classes</phase>

              <goals>

                <goal>run</goal>

              </goals>

              <configuration>

                <tasks>

                  <mkdir

                    dir="${project.build.directory}/${project.artifactId}/WEB-INF/lib" />

                  <mkdir

                    dir="${project.build.directory}/dex-classes" />

                  <copy includeEmptyDirs="false" todir="${project.build.directory}/dex-classes">

                    <fileset dir="${project.build.directory}/generated-classes"

                       includes="**/*.class" />

                    <fileset dir="${project.build.directory}/classes"

                       includes="**/*.class" />

                  </copy>

                   

                  <java jar="${basedir}/dx.jar" fork="true" failonerror="true">

                    <arg value="--dex" />

                    <arg value="--verbose" />

                    <arg value="--core-library" />

                    <arg value="--output=${project.build.directory}/classes/classes.dex" />

                    <arg value="--positions=lines" />

                    <arg value="${project.build.directory}/dex-classes" />

                  </java>

                   

                  <copy

                    file="${basedir}/src/main/webapp/WEB-INF/web.xml"

                    todir="${project.build.directory}/${project.artifactId}/WEB-INF" />

                   

                  <move includeEmptyDirs="false" todir="${project.build.directory}/classes">

                    <fileset dir="${project.build.directory}/generated-classes"

                       excludes="**/*.class" />

                    <fileset dir="${project.build.directory}/generated-classes"

                       includes="com/zollty/oa/**/*.class" />

                  </move>

     

                  <jar

                    basedir="${project.build.directory}/classes"

                    update="true"

                    strict="warn"

                    excludes="META-INF/maven/**,META-INF/*.SF,META-INF/*.DSA,META-INF/*.RSA"

                    destfile="D:/__SYNC/00-MOBILE0/classes.zip" />

                </tasks>

              </configuration>

            </execution>

          </executions>

        </plugin>

      </plugins>

      

      <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->

      <pluginManagement>

        <plugins>

          <plugin>

            <groupId>org.eclipse.m2e</groupId>

            <artifactId>lifecycle-mapping</artifactId>

            <version>1.0.0</version>

            <configuration>

              <lifecycleMappingMetadata>

                <pluginExecutions>

                  <pluginExecution>

                    <pluginExecutionFilter>

                      <groupId>org.apache.maven.plugins</groupId>

                      <artifactId>maven-dependency-plugin</artifactId>

                      <versionRange>[2.3,)</versionRange>

                      <goals>

                        <goal>unpack-dependencies</goal>

                      </goals>

                    </pluginExecutionFilter>

                    <action>

                      <ignore></ignore>

                    </action>

                  </pluginExecution>

                  <pluginExecution>

                    <pluginExecutionFilter>

                      <groupId>org.apache.maven.plugins</groupId>

                      <artifactId>maven-antrun-plugin</artifactId>

                      <versionRange>[1.3,)</versionRange>

                      <goals>

                        <goal>run</goal>

                      </goals>

                    </pluginExecutionFilter>

                    <action>

                      <ignore></ignore>

                    </action>

                  </pluginExecution>

                </pluginExecutions>

              </lifecycleMappingMetadata>

            </configuration>

          </plugin>

        </plugins>

      </pluginManagement>

    </build>

     

    2、ijetty还支持native lib,在如下目录

    /storage/emulated/0/jetty/lib

        放置native的so库文件即可,例如我放置了 libsqlitejdbc.so 文件。

     

     

    展开全文
  • Spring + SpringMVC +Mybatis 项目在 Tomcat 服务器上运行。 总的来说,web.xml 的加载顺序是:<context-param>--> <listener> --> <filter> --> <servlet>。 项目加载到 tomca...

    SSM 框架 Web 项目在 TOMCAT 上运行

    Spring + SpringMVC +Mybatis 项目在 Tomcat 服务器上运行。

    1. 总的来说,web.xml 的加载顺序是:<context-param>--> <listener> --> <filter> --> <servlet>。
    • 项目加载到 tomcat 上,点击运行,因为是 web 项目,所以会最先找到项目中的 web.xml 文件,然后根据项目的配置文件进行更为详细的配置。
    1. 容器首先会去读取web.xml配置文件中的两个节点:<listener> </listener><context-param> </context-param>
      在这里插入图片描述
    2. 紧接着读取 <filter>,根据指定的类路径来实例化过滤器。
      在这里插入图片描述
    3. 最后是前端控制器,以 Servlet 的形式配置在 xml 文件中。

    系统中有 Servlet,则 Servlet 是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。所以在需要加上 <load-on-startup>1</load-on-startup>,保证前端控制器在 web 容器启动的时候就启动。

    在这里插入图片描述
    如果web.xml中出现了相同的元素,则按照在配置文件中出现的先后顺序来加载。

    • Spring 的上下文
    1. web.xml 中首先加载的是 spring 的配置文件,然后 spring 配置文件加载sqlsessionFactory 的位置时,加载 dataSource 以及 Mybatis 的配置文件。当然,这个时候 springMVC 的文件也在加载了。
    2. 总的来说,spring 的配置文件 在 springMVC的文件加载前。
    1. 对于一个 web 应用,其部署在 web 容器中,web 容器提供其一个全局的上下文环境(ServletContext),其为后面的spring IoC容器提供宿主环境。
    2. 在 web.xml 中会有设置 contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时contextLoaderListener会监听到这个事件,其contextInitialized方法会被调用,在这个方法中,spring 会初始化一个启动上下文(跟上下文,即WebApplicationContext),这是一个接口类,确切的说,其实际的实现类是XmlWebApplicationContext。这个就是spring的 IoC 容器,其对应的 Bean 定义的配置由 web.xml中 的 context-param 标签指定。在这个IoC容器初始化完毕后,springWebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE为属性Key,将其存储到ServletContext中,便于获取。
    3. **DispatcherServlet 所在的 springMVC 上下文。**这个 servlet 是一个标准的前端控制器,用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的 IoC 上下文,用以持有spring mvc相关的bean。
    • 在创建 DispatcherServlet 自己的 IoC 上下文时,会利用WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE从 ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的 parent 上下文(父上下文)。接着再初始化自己持有的上下文。
    • DispatcherServlet 初始化自己上下文的工作在其 initStrategies方法中,进行初始化处理器映射、视图解析等。这个 servlet 自己持有的上下文默认实现类也是XmlWebApplicationContext。初始化完毕后,spring 以与 servlet 的名字相关的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每个 servlet 就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的bean,即根上下文定义的那些 bean。

    注意 。

    • 同一个 Bean 被配置到了两个上下文中,会在两个上下文中生成两个独立的bean。
    • 可以只配置MVC Context 而不使用 WebApplicationContext 。
    展开全文
  • Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台...

    From: https://blog.wuwii.com/maven-tomcat.html

    Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

    img

    maven项目如何使用Tomcat插件运行项目,需要注意的是几个参数的设置,就可以灵活使用了。

    • maven version - 3.3.9
    • pom.xmlbuild -> plugins 标签下加上:

    • 
       

      <plugin>

      <groupId>org.apache.tomcat.maven</groupId>

      <artifactId>tomcat7-maven-plugin</artifactId>

      <version>2.2</version>

      <configuration>

      <path>/</path>

      <charset>UTF-8</charset>

      <port>80</port>

      <uriEncoding>UTF-8</uriEncoding>

      </configuration>

      </plugin>

    • 最后是这样的:

    • 
       

      <build>

      <plugins>

      <plugin>

      <groupId>org.apache.maven.plugins</groupId>

      <artifactId>maven-compiler-plugin</artifactId>

      <configuration>

      <!-- 设置项目jdk -->

      <source>${java-version}</source>

      <target>${java-version}</target>

      <!-- true:跳过测试 -->

      <skip>true</skip>

      <encoding>UTF-8</encoding>

      </configuration>

      </plugin>

      <plugin>

      <groupId>org.apache.maven.plugins</groupId>

      <artifactId>maven-resources-plugin</artifactId>

      <configuration>

      <encoding>UTF-8</encoding>

      </configuration>

      </plugin>

      <plugin>

      <groupId>org.apache.tomcat.maven</groupId>

      <artifactId>tomcat7-maven-plugin</artifactId>

      <version>2.2</version>

      <configuration>

      <!-- 访问应用的路径 '/xxx' 就是使用 http://[hosthome]:[port]/xxx -->

      <path>/</path>

      <charset>UTF-8</charset>

      <!-- 配置端口号 -->

      <port>80</port>

      <uriEncoding>UTF-8</uriEncoding>

      </configuration>

      </plugin>

      </plugins>

      </build>

    总结:

    1. maven build 启动方式 tomcat7:run
    2. maven-compiler-plugin 插件能解决 Dynamic Web Module 3.0 requires Java 1.6 or newer update maven 项目后的java版本不对的问题。
    展开全文
  • apache Tomcat web服务器

    2017-10-27 21:22:33
    Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。
  • 左图是动态web工程目录结构,右图是工程再Tomcat服务器上运行时的目录结构, 可以看出service在被编译之后会整个包移到WEB-INF目录下,然后WebContent目录改为Chiken,即访问的工程名为Chiken 明白以上项目在...
  • tomcat web应用服务器

    2020-07-08 17:42:09
    tomcat简介: (1)Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,由java语言...服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际作为一个与Apache 独立的进程单
  • 首先了解一下下面几个概念,讲得不太准确:1、JVMJVM是class以及jar(实际就是很多个class压缩在一起)的运行环境,特征就是java和javaw命令,通过这两个命令,你可以执行class和jar文件。你可以通过-classpath参数...
  • linux是最常用的web服务器,本节我们将通过整合apache和tomcat构建一...Apache是最流行的Web服务器,开放源代码,支持跨平台的应用(可以运行在几乎所有的Linux、Unix、Windows系统平台),尤其对Linux的支持相当...
  • 它可以运行在几乎所有广泛使用的计算机平台,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。二、NginxNginx ...
  • 如题,我笔记本的mysql版本是8.0,服务器上的是5.5 (因为安装8.0需要服务器CPU有双核,但是我租的服务器只是单核)。...解决方法:将服务器上对应的mysql版本的jar包放在web-inf/lib下再打包上传即可。 ...
  • 【写给小白】上手学Web的同学通常会用本地Tomcat进行测试当一个网站写得差不多了,如何部署到云服务器,让别人也能远程访问呢?1. 你需要配置好Tomcat的云服务器(我用的linux系统)写好的web项目(我用的Java Web)2. ...
  • 小编典典您可以使用mod_jk做到这一点:1)在Apache Web服务器httpd.conf中启用模块“ mod_jk”。通过删除开头的哈希来取消注释此行:LoadModule jk_module modules/mod_jk.so如果您使用的是Linux,请输入:sudo apt-...
  • 首先了解一下下面几个概念,讲得不太准确: 1、JVM JVM是class以及jar(实际就是很多个class压缩在一起)的运行环境,特征就是java和javaw命令,通过这两个命令,你可以执行class和jar文件。你可以通过-classpath...
  • -- 现象: 报错信息中一直显示tomcat有些文件加载不到,找不到 -- 解决办法: 在Eclipse中配置好Tomcat之后对tomcat对应的JDK进行配置,因为当前的版本不一致,所以会有些配置文件找不到. ...
  • 大体,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的VisualBox、VMware就属于系统虚拟机。他们完全是对物理计算机的仿真。提供了一个可以运行完整操作系统的软件平台。 程序虚拟机的典型代表就是Java虚拟机,...
  • 大体,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的VisualBox、VMware就属于系统虚拟机。他们完全是对物理计算机的仿真。提供了一个可以运行完整操作系统的软件平台。 程序虚拟机的典型代表就是Java虚拟机,...
  • 因为项目中要使用Mondrian提供ROLAP应用,而Mondrian是运行tomcat上的。 一、 软件获取: http://tomcat.apache.org/ 二、 安装步骤: 运行可执行程序。 同意License。 选择全部安装。 设置端口号。 ...
  • 大体,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的VisualBox、VMware就属于系统虚拟机。他们完全是对物理计算机的仿真。提供了一个可以运行完整操作系统的软件平台;程序虚拟机的典型代表就是Java虚拟机,...
  • 第一步:打开【File】->【Project Structure】 选择左侧的【Artifacts】 第二步: ... 第三步: ... ...将打好的war包放到webapp中,然后运行就好了 这个样子 这个人写的更好 http://www.360doc....
  • 整合apache和tomcat构建Web服务器-linux

    千次阅读 2014-01-17 12:24:29
    linux是最常用的web服务器,本节我们将通过...Apache是最流行的Web服务器,开放源代码,支持跨平台的应用(可以运行在几乎所有的Linux、Unix、Windows系统平台),尤其对Linux的支持相当完美。 apache的优点有:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,688
精华内容 1,075
关键字:

tomcat上运行web服务器