Websphere中静态资源的过虑

     公司有一个B/S的项目,其中视图层是使用JSP+JAVASCRIPT的方式。控制层是使用的spring的MVC基于REST的规范来实现的,根据前台JS发出的POST请求URL及正文信息,找到相关的模域层的业务处理方法。模域层的实现是基于EJB3+JPA来实现的。控制层通过JNDI找到相关EJB服务进行调用来完成业务逻辑的处理。

    整个项目的工程是一个EAR包,其中包含一个WAR包和EJB的JAR包:

  •     视图层的JSP+AJAX和控制层都在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先处理。

猜你喜欢

转载自duyangsss.iteye.com/blog/1726319