您的位置:首页 > 编程语言 > Java开发

项目中servlet和struts2共存的解决方案

2014-03-20 18:30 381 查看
j2ee中的最基本技术就是jsp和servlet,其中jsp本质上还是servlet,只不过servlet出现得更早,而且

servlet不仅仅是一种技术,而且是一种规范,目前Tomcat7.0支持最新版本的规范Servlet3.0,这个在web.xml中的前两行就可以看到,说到struts2,其实在我看来本质都是一样的,都是作为MVC设计模式中Controller控制器层,只不过strut2要比servlet强大得多,首先strut2中的acion已经去掉request,session等底层API,而是直接操作属性进行控制,跳转的时候也是无需调用request.getRequestDispatcher("/index.jsp").forward(request,respone)类似这样的代码,直接return
"物理资源视图",而且struts2支持多种返回类型还有众多插件等等功能.总之项目中应该很少用到像servlet这种偏底层的屌丝来处理业务逻辑请求,但是如果项目真的需要servlet这种底层技术来做一些处理的话,那么需要和strut2共存

这时候引发一个问题,像我们以前那样的web.xml中如下配置:

<!-- 配置Struts2的Filter -->

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<servlet>

<servlet-name>Authcode</servlet-name>

<servlet-class>com.cippus.util.Identity</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>Authcode</servlet-name>

<url-pattern>/authcode</url-pattern>

</servlet-mapping>

其实这样的话如果在浏览器中直接访问http:localhost:8080/authcode那么会报错,错误

原因就在于strut2的filter是拦截所有请求,然后对于authcode这种url它会默认当做action

处理,相当于请求autchcode.action,这样如果struts2.xml中没有配置名为authcode的action

那么就会报错,其实解决方法很简单,

第一种就是写一个action名为authcode,然后execute

方法里什么都不做直接return "success",然后action里面配置result

<result name="success">/authcode</result>

这样的话业务逻辑请求先经过strut2的filter处理然后在return /authcode这样就提交到了servlet

的处理范围,就可以正确处理了,但是这样方案的缺点是就是每有一个servlet就有一个冗余的action

需要跳转到相应的servlet中.代码冗余过多而且strut2和servlet名字相同容易混淆

第二种就是利用servlet的特性,隐藏后台具体实现技术,这一点确实比struts2还有强,虽然现在有很多

url重写的包,struts2默认只会拦截以.action结尾的请求(如果没有会加上),但是servlet可以配置成任

意后缀和任意形式,只要和别的框架和资源不冲突就好

例如上面的示例servlet可以这样配置:

<servlet-mapping>

<servlet-name>Authcode</servlet-name>

<url-pattern>/authcode.php</url-pattern>

<url-pattern>/authcode.aspx</url-pattern>

<url-pattern>/authcode.jsp</url-pattern>

</servlet-mapping>

这样配置那三种url都可以映射到servlet处理类中去处理,这样就隐藏后台技术实现,当然url不能和

真实的jsp和php等文件重名,所以基于以上思想我们可以这样改:

<servlet-name>Authcode</servlet-name>

<url-pattern>/authcode.do</url-pattern>

熟悉strut框架的朋友会知道,strut1的默认请求路径结尾就是.do,当然我的工程中没有采用

struts1所以就可以这样映射,如果有的话请换另外一个不冲突的后缀.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: