最通俗、最直白的TongWeb应用移植步骤------美其名曰:移植方案

el/2024/4/13 14:17:01

一、应用能否移植到TongWeb上?

  1. .NET应用为Microsoft 的开发平台,TongWeb不支持。
  2. PHP应用TongWeb通过CGI方式支持PHP,另外TongHttpServer也支持PHP语言。
  3. TongWeb主要以支持JavaEE应用为主。在判断应用能否移植到TongWeb上,只需要回答两个问题:问题一:应用采用的JavaEE规范?  问题二:应用代码有没有跟某一JavaEE应用服务器绑死? 见:https://blog.csdn.net/realwangpu/article/details/114818293 

二、对应用移植的误解

  1.  是否能保证应用100%能平滑移植。答:虽有JavaEE规范,但各家厂商的JavaEE应用服务器实现有所不同,并不能100%平换移植。
  2.  JavaEE应用服务器不同版本能不能100%平滑升级? 答:tomcat7与tomcat8不完全兼容,TongWeb6与TongWeb7不完全兼容。
  3.  应用采用XX框架,TongWeb能不能支持? 答:无论采用哪种框架,归根结底还是看其需要的JavaEE规范,可查其官网说明。如Spring MVC:

三、web应用移植了解

       我们以最常见的web应用移植为例进行说明,在开发过程中多以tomcat开发为主,本文主要介绍从tomcat8.x向TongWeb7.0的移植过程,因为tomcat8.x与TongWeb7.0都是JavaEE7的web容器规范。只要应用符合JavaEE7规范,则移植到TongWeb7.0上问题不大。

      1. 首先确认应用能否在tomcat8.x上运行? 若能运行,则更容易迁移到TongWeb7.0上。 老版本的tomcat6、7应用也可移植到TongWeb7.0上,但会常见cookie、JSP、tld问题,如下:

          java.lang.IllegalArgumentException: An invalid domain [.sdsoon.cn] was specified for this cookie
             at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:203)

        Tomcat 8更换了默认的 CookieProcessor 实现为 Rfc6265CookieProcessor ,之前的实现为 LegacyCookieProcessor。前者是基于 RFC6265 ,而后者基于 RFC6265 、 RFC2109 、 RFC2616 。可在tomcat8 context.xml中配置 <CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />

       2. TongWeb替换tomcat,了解其在配置上的相同与不同点:

TongWeb7.0配置tomcat8.x配置说明参考

conf/default-web.xml

conf/web.xml

主要用于配置CGI、shtml、jsp编译参数等。

https://blog.csdn.net/realwangpu/article/details/109591883

https://blog.csdn.net/realwangpu/article/details/109684514

conf/tongweb.properties

conf/catalina.properties

主要配置需要过滤annotation的jar

https://blog.csdn.net/realwangpu/article/details/109490040

autodeploy目录,但解压在deployment目录下

webapps目录

自动部署目录https://blog.csdn.net/realwangpu/article/details/110230970
bin下startserver和external.vmoptions脚本

bin/startup和catalina脚本

用于配置JVM参数、-D参数 
conf/tongweb.xml文件

conf/server.xml、context.xml、logging.properties文件

常用通道、虚拟主机、数据源、日志配置。 TongWeb控制台的配置主要存于tongweb.xml。 

            功能相同的常用全局配置参数:

TongWeb7.0tomcat8.x
-Dcom.tongweb.el.parser.SKIP_IDENTIFIER_CHECK=true-Dorg.apache.el.parser. SKIP_IDENTIFIER_CHECK=true
-Dcom.tongweb.catalina.STRICT_SERVLET_COMPLIANCE=true-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=true
注:可按此规律对比tomcat与TongWeb手册参数说明。

         但有些参数位置也会发生变化,常见的比如:Attribute value view.getItems("list") is quoted with " which must be escaped when used  which must be esca 双引号异常问题。TongWeb7.0上需在default-web.xml中配置strictQuoteEscaping为false

<servlet><servlet-name>jsp</servlet-name><servlet-class>com.tongweb.web.jasper.servlet.ThanosJspServlet</servlet-class><init-param><param-name>strictQuoteEscaping</param-name><param-value>false</param-value></init-param>
......

         tomcat7.x则是: -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false。  tomcat8.x则也是在web.xml中配置。

      3. TongWeb的 Web应用迁移工具,则是将tomcat中配置的数据源、虚拟主机、通道等常用配置迁移到TongWeb下,并检查应用去掉一些不必要的类,将其部署在TongWeb上,但不对其应用JSP、代码做差异化检查,仍需人工测试检查。注意:一些不常用的tomcat配置在TongWeb上也有配置,只不过没有写在手册中而已。

四、移植tomcat下web应用步骤

       1. 搭一套TongWeb7.0与tomcat8.x的运行环境,并保证tomcat8.x与TongWeb7.0在同一台机器、使用同一 JDK、同一数据库、同一应用包。这样通过对比测试容易定位问题方向。

       2. 一定把bin/external.vmoptions中的-DWebModuleOnly=false设为true,这样将近似tomcat的web容器功能,不加载EJB,JPA,CDI、mail这些,以免移植引起各类问题。最常见的为CDI、JPA冲突,实际项目中常用hibernate JPA,而TongWeb自带所带OpenJPA常会与应用冲突。

      3. 若确认应用没有采用JavaEE5规范之后的annontation,则可把tongweb.properties中的tongweb.util.scan.StandardJarScanFilter.jarsToSkip加上*.jar。否则可能引起一些没有必要的annontation扫描异常,见:https://blog.csdn.net/realwangpu/article/details/109490040 

      4. 参考tomcat启动脚本增加的参数设置到TongWeb的bin/external.vmoptions中,参考tomcat的conf/web.xml配置设置到TongWeb的conf/default-web.xml中。

      5. 若tomcat上配置的数据源,则需要在TongWeb上配置数据源。两者均需将数据库JDBC驱动包放在TongWeb/tomcat的lib下。

       //tomcat数据源
       <Resource
           name="jdbc/testdb"
           auth="Container"
           type="javax.sql.DataSource"
          factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3316/platform?serverTimezone=UTC"
          ......

          TongWeb上配置数据源

          TongWeb与tomcat在数据源调用上不同,见:https://blog.csdn.net/realwangpu/article/details/115036184

      6. 若有乱码问题,则注意tomcat与TongWeb的编码配置,“URL编码格式”等于URIEncoding,uri处理等于“useBodyEncodingForURI”。

 <Connector port="8080"   maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
               enableLookups="false" redirectPort="8443" acceptCount="100" 
               connectionTimeout="20000"  disableUploadTimeout="true" useBodyEncodingForURI="true"   URIEncoding="GBK"/> 

       7.  静态资源配置。

 <!-- tomcat  的静态资源映射配置 -->
    <Context path="/html" docBase="/home/static/html" reloadable="true" crossContext="true"></Context> 

    TongWeb的静态资源配置

    方法一:在该静态目录下增加WEB-INF目录,当成web应用部署在TongWeb上。
    方法二:在应且的WEB-INF目录下增加tongweb-web.xml文件,设置虚拟目录。
    <?xml version="1.0" encoding="UTF-8"?>
   <tongweb-web-app>
       <property name="aliases" value="/html=/home/static/html"/>
   </tongweb-web-app>

       8. 检查应用包,web应用的WEB-INF/lib下通常存在大量重复但版本不同的jar或是无用的jar。 tomcat*.jar,weblogic.jar这些为其它应用服务器的jar,TongWeb上不需要,且容易与TongWeb冲突。javax.servlet、 javax.ejb、 javax.jms、 javax.websocket等这些类为JavaEE 规范类,TongWeb已提供,应用无需再带。    

       9. 部署应用包,tomcat下的应用包根下可以没有WEB-INF目录,而TongWeb下应用必须有WEB-INF目录才认为是合法的web应用。ROOT目录下的应用相当于TongWeb上部署应用时"应用前缀为"  / 。若部署失败注意查看server.log分析原因。

      10. 测试应用功能点是否正常,从tomcat5,6,7移植到TongWeb7.0上的应用重点检查JSP编译是否正常。

五、Spring Boot嵌入式应用移植

      1. 需使用TongWeb7.0.E嵌入版替换tomcat-embed版本。

      2. 主要是在通过maven打成jar包时,去掉tomcat相关jar,引入TongWeb相关jar。如下:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 不用tomcat --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency>
<!--引入tongweb包 -->
<dependency><groupId>com.tongweb.springboot</groupId><artifactId>tongweb-spring-boot-starter</artifactId><version>2.x.0.RELEASE</version>
</dependency>
<dependency><groupId>com.tongweb</groupId><artifactId>tongweb-embed</artifactId><version>7.0.E.1</version>
</dependency>

       3. Spring Boot主配置文件application.properties中tomcat相关配置改为TongWeb的即可。

#tomcat配置
server.tomcat.uri-encoding=UTF-8
server.tomcat.min-spare-threads=10
server.tomcat.max-threads=200
#TongWeb配置
server.tongweb.uri-encoding=UTF-8
server.tongweb.min-spare-threads=10
server.tongweb.max-threads=200

六、针对其它应用服务器的移植

      1. 若采用JBoss、WebLogic、WebSphere应用服务器,但仅仅是web应用,也可移植到TongWeb,主要是关注JSP编译问题以及有没有针对特定应用服务器的特殊配置。如:

  <!--  weblogic.xml配置,相当于TongWeb的子加载 -->
  <container-descriptor>
      <prefer-web-inf-classes>true</prefer-web-inf-classes>
  </container-descriptor>

       2.若应用用到了CDI、EJB、JCA等功能,则一定要把-DWebModuleOnly设为false

       3.针对EJB容器层的移植主要是关注各应用服务器特定的EJB2.1的xml文件和EJB JNDI命名规则。TongWeb7.0提供对JBoss、WebLogic等的EJB xml文件解析。

<!-- 如weblogic-ejb-jar.xml  --> 
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-ejb-jar>
    <weblogic-enterprise-bean>
        <ejb-name>TestEJB</ejb-name>
        <jndi-name>TestEJBRemote</jndi-name>
    </weblogic-enterprise-bean>
</weblogic-ejb-jar>

//解析weblogic-ejb-jar.xml
package com.tongweb.tongejb.jee.wls;import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="weblogic-ejb-jar", propOrder={"description", "weblogicEnterpriseBean", "securityRoleAssignment", "runAsRoleAssignment", "securityPermission", "transactionIsolation", "messageDestinationDescriptor", "idempotentMethods", "retryMethodsOnRollback", "enableBeanClassRedeploy", "disableWarning", "workManager", "weblogicCompatibility"})
public class WeblogicEjbJar
{public Description description;@XmlElement(name="weblogic-enterprise-bean")public List<WeblogicEnterpriseBean> weblogicEnterpriseBean;@XmlElement(name="security-role-assignment")public List<SecurityRoleAssignment> securityRoleAssignment;@XmlElement(name="run-as-role-assignment")public List<RunAsRoleAssignment> runAsRoleAssignment;@XmlElement(name="security-permission")public SecurityPermission securityPermission;@XmlElement(name="transaction-isolation")public List<TransactionIsolation> transactionIsolation;@XmlElement(name="message-destination-descriptor")public List<MessageDestinationDescriptor> messageDestinationDescriptor;@XmlElement(name="idempotent-methods")public IdempotentMethods idempotentMethods;

        说明:由于近年采用EJB开发的项目很少,应用主要采用spring框架,所以针对EJB层的移植差异说明经验很少,这部分只能具体问题具体分析。至于不同应用服务器之间web容器层的差异,除去标准的JavaEE规范外,各应用服务器自身的特点也鲜有深入的对比分析。


http://www.ngui.cc/el/414776.html

相关文章

MM裙子破了(爆笑!!!)

有一美媚在某it企业工作。有一天早上&#xff0c;天气特别好&#xff0c;it美眉正全神贯注的工作&#xff0c;裙子被抽屉夹住了都没有察觉。当她站起身的时候裙子“嘶啦”一声被撕破。同事们都闻声望来&#xff0c;it美眉连忙拿起身边一份it杂志遮住下面。不料&#xff0c;同事…

结婚前的暴强对话

结婚前他们的对话&#xff1a; G\R6K:f7   他&#xff1a;万岁&#xff01;终于到来了&#xff01;我都等不及了&#xff01; ~7gFddii   她&#xff1a;我可以离开吗&#xff1f; GL _hRu   他&#xff1a;不&#xff0c;你甚至想都别想&#xff01; -Un"z6*…

教授说接吻

一位大学教授对学生讲道&#xff1a;“古时候‘吕’是接吻的意思&#xff0c;口对口&#xff0c;很形象。” -yg9ug |?s%8cw   其中一学生问道&#xff1a;“如果‘吕’是接吻的意思&#xff0c;那么小品的‘品’呢&#xff1f;又怎么解释&#xff0c;三个人在一起接吻吗…

对俺胖子老婆说

感动版&#xff1a;老婆&#xff0c;你一定要多保重啊!(当然&#xff0c;是保持过去的体重了&#xff0c;嘿嘿!) fG{oi(T   诚恳版&#xff1a;你是我们家最“重”要的人物。 >!2|y^   安慰版&#xff1a;其实&#xff0c;你的腰比前年还是细了不少的。(当然&#x…