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所以就可以这样映射,如果有的话请换另外一个不冲突的后缀.