struts1,struts2中存在的问题
在配置文件中写Action执行完跳转的路径,那么在编写Action Java代码的时候还需要切换至配置文件才能知道action转向那个页面,直接写在Action中不好么?
依照这种并且结合struts1,struts2的零配置,可以实现类似ruby on rails的基于url确定要调用的action及方法,已经在多个项目中应用,也没发现问题
struts1零配置
1.使用strus的wildcard mapping,提供类似rails的基于URL确定调用的Action与method
- 使用MappingDispathAction与扩展的DynamicModuleConfig,DynamicModuleConfig能够使用name属性作为formBean class的定义,以下为struts配置文件的全部
<action path="/example/*/*"
type="example.action.{1}Action"
name="example.form.{1}Form" scope="request"
validate="false" parameter="{2}" attribute="{1}Form">
</action>
第一个*为{1},代表需要调用的Action,每二个*为{2},代表我们要调用的action方法.
如:/example/User/save,则与下面等价
<action path="/example/User/save"
type="example.action.UserAction"
name="example.form.UserForm" scope="request"
validate="false" parameter="save" attribute="UserForm">
</action>
- 通过在Action的方法的直接返回ActionForward
而在Java Action代码中,我们直接使用new ActionForward()返回,在实际项目中使用些方法并末发现
return new ActionForward("/example/user/list.jsp");
struts2零配置编程
为Struts2增加了一种返回类型,直接通过action方法的返回值确定要返回的页面.
<result-types>
<result-type name="direct" class="javacommon.struts2.dispatcher.DirectResult"/>
</result-types>
配合struts2通符符,实现零配置,以下为配置文件action配置的全部
<package name="default" namespace="/demo" extends="custom-default">
<action name="*/*" method="{2}" class="com.kingsoft.demo.action.{1}Action">
<result name="*" type="direct">通过Action直接返回</result>
</action>
</package>
实现forward请求的java代码
/**进入更新页面*/
public String edit() {
blog = (Blog)blogManager.getById(id);
return "/demo/Blog/edit.jsp";
}
实现redirect的做法是,前面增加了一个"!"号
/**保存更新*/
public String update() {
blogManager.update(this.blog);
return "!/demo/Blog/list.action";
}