公司有一个B/S的项目,其中视图层是使用JSP+JAVASCRIPT的方式。控制层是使用的spring的MVC基于REST的规范来实现的,根据前台JS发出的POST请求URL及正文信息,找到相关的模域层的业务处理方法。模域层的实现是基于EJB3+JPA来实现的。控制层通过JNDI找到相关EJB服务进行调用来完成业务逻辑的处理。
整个项目的工程是一个EAR包,其中包含一个WAR包和EJB的JAR包:
由于该项目一直都是在jboss上做的开发,现在项目要上线,需要将工程迁移到WEBSPHERE环境下。在迁移过程中遇到一个关于环境的问题,这个问题主要是关于控制层的。
由于前台的所有请求是基于REST的如系统登录,前台将会发出一个http://ip:port/project/login的POST请求,并在请求正文中传入登录所需要的数据信息。而前台请求的静态资源也是根据URL来获取,如:http://ip:port/project/login.css,http://ip:port/project/login.jpg 等。
所以我们需要在工程的web.xml文件中定义两个不同的servlet来处理,web.xml文件的具体内容如下:
<servlet> <servlet-name>auth</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>auth</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.data</url-pattern> </servlet-mapping>
其中有一个org.springframework.web.servlet.DispatcherServlet,它会拦截前台的请求,通过HTTP请求中的URL路径及方法来判断是不是调用后台的业务逻辑处理。
还有一个就是jboss的获取servlet。具体的servlet的类名是什么,开发人员不需要关心,只需要在web.xml文件中直接使用就可以通过它来处理静态资源。网上的资源中的说法是:
Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字 -- "default"
Google App Engine 自带的 默认Servlet的名字 -- "_ah_default"
Resin 自带的 默认Servlet的名字 -- "resin-file"
WebLogic 自带的 默认Servlet的名字 -- "FileServlet"
WebSphere 自带的 默认Servlet的名字 -- "SimpleFileServlet"
所以,我在发布到websphere的工程中将名称改为:SimpleFileServlet,
<servlet-mapping> <servlet-name>SimpleFileServlet</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>SimpleFileServlet</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>SimpleFileServlet</servlet-name> <url-pattern>*.data</url-pattern> </servlet-mapping> .......
但后台抛出异常,大概意思就是说服务在发布的时间,在加载servlet的时候报空指针异常。后面能过资料查找和测试,正解如下:
<servlet> <servlet-name>default</servlet-name> <servlet-class>com.ibm.ws.webcontainer.servlet.SimpleFileServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.data</url-pattern> </servlet-mapping> <servlet id="auth"> <servlet-name>auth</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping id="auth-mapping"> <servlet-name>auth</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
让was的静态处理的servlet后加载,spring的servlet先加载。并且将was的静态处理的servlet放在spring的servlet的前面。保证所有的请求先由was的servlet先处理。