Struts2 Action中的bean没有重新实例化最近在做新项目,用了Struts2+Spring+Ibatis3
在使用时遇到了点问题,眼看这周即将结束,可是连增删改这基本的功能都没完成。
问题一:
在执行修改(/assess/assessTeach/edit.do?id=2) 之后 执行增加(/assess/assessTeach/edit.do)
在AssessTeachAction的prepare()方法中添加断点调试发现 action中的id为2,entity也不是null。
问题二:
刚刚进入页面执行了/assess/assessTeach/primary.do 时action的prepare()只执行了一次,而点击【增加】
或【修改】按钮调整到编辑页面的时候则执行了2次。(我调试了改框架的Demo都是执行一次的)
如:点击【增加】按钮(/assess/assessTeach/edit.do) 执行的顺序是:prepare()->primary()->prepare()->edit()Struts配置:<constant name="struts.devMode" value="true" />
<!-- struts的URL扩展名 -->
<constant name="struts.action.extension" value="do" /><!-- 允许访问静态成员变量 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true" /><constant name="struts.custom.i18n.resources" value="i18n/messages"/>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.enable.SlashesInActionNames" value="true" /><package name="custom-default" extends="struts-default">
<result-types>
    <result-type name="direct" class="cn.org.rapid_framework.struts2.dispatcher.DirectResult"/>
</result-types>
<interceptors>
<!-- 提供视图渲染的共享变量拦截器 -->
<interceptor name="sharedRenderVariableInterceptor" class="javacommon.struts2.interceptor.SharedRenderVariableInterceptor"/>
    <interceptor-stack name="customDefaultCrudStack">
<interceptor-ref name="paramsPrepareParamsStack"/>
<interceptor-ref name="sharedRenderVariableInterceptor"/>
    </interceptor-stack>
</interceptors>
<default-interceptor-ref name="customDefaultCrudStack"/>
</package><package name="assess" namespace="/assess" extends="custom-default">
<action name="*/*" method="{2}" class="{1}">
    <result name="*" type="direct"></result>
</action>
</package>部分Spring 配置:
<bean id="assessTeach" class="com.zfosft.hrm.assess.action.AssessTeachAction">
<property name="manager" ref="assessTeachManager"></property>
</bean>
<bean id="assessTeachManager" class="com.zf.hrm.assess.service.AssessTeachManager">
<property name="assessTeachDao" ref="assessTeachDao"></property>
</bean>
<bean id="assessTeachDao" class="com.zf.hrm.assess.dao.AssessTeachDao">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>部分代码如下:/**
 * Assess业务 Action接口
 * <p>
 * 关于Assess业务的所有业务操作的Action方法都将在此处定义
 * </p>
 */
public interface AssessAction extends Preparable, ModelDriven{
/**
 * 获取当前操作信息的ID
 */
public Long getId();

/**
 * 设置当前操作信息的ID
 */
public void setId(Long id);

/**
 * 主库查询
 * <p>
 * 根据当前登录的教职工工号对当前年度填写的上报信息进行和查询显示
 * </p>
 * @return
 */
public String primary(); /**
 * 调整到编辑页面
 */
public String edit();
}/**
 * Assess业务 Action抽象类
 * <p>
 * 关于Assess业务所有相同的Action方法都在此处实习
 * </p>
 */
public abstract class AssessSuperAction extends BaseStruts2Action implements AssessAction {
/**
 * 获取管理器
 * @return
 */
protected abstract AssessManager getManager(); @Override
public String primary() {
//TODO [Assess] 从session中获当前用户的职工号
String staffid = "888888";
String year = AssessProperties.getYear();

AssessEntityComp comp = new AssessTeachComp( staffid );
comp.setYear(year);

List<AssessEntityComp> list = getManager().list(comp);

getRequest().setAttribute("list", list);

return getPrimaryUrl();
} @Override
public String edit() {
return getEditUrl();
}
}/**
 * Assess中的具体业务:
 * <p>
 * 实现具体的业务Action方法
 * </p>
 */
public class AssessTeachAction extends AssessSuperAction {
private AssessTeach entity;

//业务管理器 由Sping进行注入
private AssessTeachManager manager; 

private Long id = null;

@Override
public void prepare() throws Exception { 
//当进行查询操作时该方法 执行一次
//但是在执行edit()的时候会执行2次
if (isNullOrEmptyString(id)) {
entity = new AssessTeach();
} else {
entity = (AssessTeach) manager.getById(id);
}
}

@Override
public Object getModel() {
return entity;
}
}