请大家容许我跟帖把代码的格式修改一下,谢谢
LoginAction.java package struts.action; import java.io.IOException; 
import java.util.Vector; import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; import myclass.pro.MesProperty; 
import myclass.pro.ParProperty; 
import myclass.pro.RetProperty; 
import myclass.pro.UserProperty; 
import myclass.user.UserLoad; 
import myclass.common.ChangeBean; 
import myclass.common.MD5; 
import myclass.common.UsedBean; import org.apache.struts.action.Action; 
import org.apache.struts.action.ActionForm; 
import org.apache.struts.action.ActionForward; 
import org.apache.struts.action.ActionMapping; import extDao.ExtTmsYhbDAO; 
import struts.form.LoginForm; public class LoginAction extends Action { private ChangeBean CB = new ChangeBean(); private UserLoad uload = new UserLoad(); public ActionForward execute(ActionMapping mapping, ActionForm form, 
HttpServletRequest request, HttpServletResponse response) 
throws IOException { 
LoginForm loginForm = (LoginForm) form; 
HttpSession httpSession = request.getSession(); 
MesProperty mpro = new MesProperty(); 
MD5 md5 = new MD5(); 
String sDlm = CB.clearNull(loginForm.getDlm());// 登陆帐号 
String sMm = md5.getMD5ofStr(CB.clearNull(loginForm.getMm()));// 登陆密码 
String sLx = CB.clearNull(loginForm.getLx());// 身份类型 
String sYzm = CB.clearNull(loginForm.getYzm());// 验证码 
String sReturnUrl = CB.clearNull(request.getParameter("retUrl"));// 返回地址 
String sErrorUrl = CB.clearNull(request.getParameter("errorUrl"));// 失败返回地址 // 最开始的是判断验证码 开始 =========================================== 
String sessionYzm = (String) httpSession.getAttribute("sessionYzm"); 
if (sessionYzm == null  ¦ ¦ !sessionYzm.equals(sYzm)) { 
mpro.setMessage("对不起,验证码不正确"); 
httpSession.setAttribute("ReturnMpro", mpro); 
response.sendRedirect(sErrorUrl); 
return null; 
} else { 
// 以下是准备条件 开始 ======================================= 
ParProperty ppproUser = new ParProperty();//  
ppproUser.setBh(sDlm);// 帐号 RetProperty prproUser = new RetProperty(); 
prproUser = uload.getOne(ppproUser); 
if (prproUser == null) { 
mpro.setMessage("对不起,您的帐号不存在或者已被禁用"); 
httpSession.setAttribute("ReturnMpro", mpro); 
response.sendRedirect(sErrorUrl); 
return null; 

String sOldMmUser = CB.clearNull(prproUser.getMm());// 用户表密码 
String sUserLx = CB.clearNull(prproUser.getLx()); if (!sMm.equals(sOldMmUser)) { 
mpro.setMessage("对不起,密码不正确"); 
httpSession.setAttribute("ReturnMpro", mpro); 
response.sendRedirect(sErrorUrl); 
return null; 
} else { 
// 以下是将需要的数据写入session,已供页面使用 
UserProperty sessionInfo = new UserProperty(); if(sUserLx.equals("2")){ 
sessionInfo.setYhlx("js"); 
}else{ 
sessionInfo.setYhlx("xs"); 

sessionInfo.setDlm(CB.clearNull(prproUser.getXm())); 
sessionInfo.setUserbh(CB.clearNull(prproUser.getBh()));// 内部用户编号 
httpSession.setAttribute("sessionLoginInfo", sessionInfo); 
// 以上步骤都正确,则登陆成功 
mpro.setFlag(true); 
httpSession.setAttribute("ReturnMpro", mpro); 
response.sendRedirect(sReturnUrl); 
//System.out.println("=========end===================="); 
return null; 
} } 
} public UserLoad getUload() { 
return uload; 
} public void setUload(UserLoad uload) { 
this.uload = uload; 
} public ChangeBean getCB() { 
return CB; 
} public void setCB(ChangeBean cb) { 
CB = cb; 

UserLoad.java package myclass.user; import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Vector; import myclass.common.ChangeBean; 
import myclass.common.UsedBean; 
import myclass.pro.ParProperty; 
import myclass.pro.RetProperty; 
import extDao.ExtJkxtTxxxbDAO; 
import extDao.ExtTmsYhbDAO;; public class UserLoad { 
private ExtTmsYhbDAO extTmsYhbDAO; 
private UsedBean ub = new UsedBean(); 
private ChangeBean cb = new ChangeBean(); public RetProperty getOne(ParProperty ppro) { 
extTmsYhbDAO = (ExtTmsYhbDAO) ub.getBean("ExtTmsYhbDAO"); 
return extTmsYhbDAO.getOneInfoByCondition(ppro); 
} public ChangeBean getCb() { 
return cb; 
} public void setCb(ChangeBean cb) { 
this.cb = cb; 

public UsedBean getUb() { 
return ub; 
} public void setUb(UsedBean ub) { 
this.ub = ub; 
} public ExtTmsYhbDAO getExtTmsYhbDAO() { 
return extTmsYhbDAO; 
} public void setExtTmsYhbDAO(ExtTmsYhbDAO extTmsYhbDAO) { 
this.extTmsYhbDAO = extTmsYhbDAO; 
} } ExtTmsYhbDAO.java package extDao; import java.util.List; 
import java.util.Vector; import myclass.common.SpringPageBean; 
import myclass.common.UsedBean; 
import myclass.pro.ParProperty; 
import myclass.pro.RetProperty; 
import tablemapping.TmsYhb; 
import tablemapping.TmsYhbDAO; public class ExtTmsYhbDAO extends TmsYhbDAO { 
private UsedBean ub = new UsedBean(); public RetProperty getOneInfoByCondition(ParProperty ppro) { 
RetProperty rpro = new RetProperty(); 
String hql_query = "from TmsYhb where 1=1 "; 
if (ppro.getBh() != null && !ppro.getBh().equals("")) { 
hql_query += "and bh='" + ppro.getBh() + "'"; 

if (ppro.getBj() != null && !ppro.getBj().equals("")) { 
hql_query += "and bj='" + ppro.getBj() + "'"; 

if (ppro.getLx() != null && !ppro.getLx().equals("")) { 
hql_query += "and lx='" + ppro.getLx() + "'"; 

System.out.println("hql_query=="+hql_query); 
List list = getHibernateTemplate().find(hql_query); 
// System.out.println("list="+list.size()); 
if (list.size() > 0) { 
TmsYhb tmsyhb = (TmsYhb) list.get(0); 
ub.copyPropertise(rpro, tmsyhb, "管理权限单条数据查询"); 
} else { 
rpro = null; 

return rpro; 
} public UsedBean getUb() { 
return ub; 
} public void setUb(UsedBean ub) { 
this.ub = ub; 
} } 
UsedBean.java package myclass.common; import java.net.URL; 
import java.util.List; 
import java.util.Date; 
import java.util.Vector; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; import myclass.pro.ParProperty; 
import myclass.pro.RetProperty; 
import myclass.user.UserLoad; import org.apache.commons.beanutils.BeanUtils; 
import org.hibernate.Session; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.FileSystemXmlApplicationContext; import extDao.ExtTmsYhbDAO; public class UsedBean { 
private static String url; private static ApplicationContext ctx; static { 
URL classurl = ApplicationContext.class.getResource("/"); 
setCtx(classurl.toString()); 
} public Object getBean(String beanName) { 
return getCtx().getBean(beanName); 
} public ApplicationContext getCtx() { 
return ctx; 
} public static void setCtx(String classpath) { 
if (ctx == null) { 
ctx = new FileSystemXmlApplicationContext(classpath + "config.xml"); 
System.out.println("初始化:载入 " + classpath + "config.xml 成功!"); 


public static void setCtx(ApplicationContext ctx) { 
UsedBean.ctx = ctx; 
} } 

解决方案 »

  1.   

    代码太长,且你的spring用法有些奇怪,一般是在web.xml中设置监听,在struts中配置plugin,运用时直接将一个bean注入到业务对象中,如:
    <bean id="extTmsYhbDAO" class="extDao.ExtTmsYhbDAO"/>
    <bean id="userLoad" class="myclass.user.UserLoad">
    <property name="extTmsYhbDAO"><ref bean="extTmsYhbDAO"/></property>
    </bean>
    这样就将extTmsYhbDAO注入到userLoad中了,在userLoad中只要这样用:
    public RetProperty getOne(ParProperty ppro) { 
    return extTmsYhbDAO.getOneInfoByCondition(ppro); //在userLoad中已经有一个初始化了的extTmsYhbDAO
    }如果按照你的用法,UsedBean应该是一个单例类
      

  2.   

    我额外允许你把代码裁减一下
    =======================
    那些import之类的东西贴它干嘛
      

  3.   

    谢谢两位的关注
    这里是我的配置文件:config.xml<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans default-lazy-init="true">
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass">
    <value>com.mysql.jdbc.Driver</value>
    </property>
    <property name="jdbcUrl">
    <value>jdbc:mysql://localhost:3306/tms</value>
    </property>
    <property name="user">
    <value>tms</value>
    </property>
    <property name="password">
    <value>0000</value>
    </property>
    <property name="minPoolSize">
    <value>15</value>
    </property>
    <property name="acquireIncrement">
    <value>5</value>
    </property>
    <property name="maxPoolSize">
    <value>200</value>
    </property>
    </bean>
    <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
    <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">
    org.hibernate.dialect.MySQLDialect
    </prop>
    </props>
    </property>
    <property name="mappingResources">
    <list>
    <<value>tablemapping/TmsYhb.hbm.xml</value>
    </list>
    </property>
    </bean>
    <bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref local="sessionFactory" />
    </property>
    </bean>
            <!-- 这是自定义的DAO -->
    <import resource="/config-extdao.xml" />

    <!-- 这是自定义的struts -->
    <import resource="/config-struts.xml" />
    <bean id="TmsYhbDAO" class="tablemapping.TmsYhbDAO">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
    </bean>config-struts.xml        <bean name="/home/login" class="struts.action.LoginAction">
    <property name="uload">
    <ref bean="UserLoad" />
    </property>
    </bean>
    <bean id="UserLoad" class="myclass.user.UserLoad">
    <property name="extTmsYhbDAO">
    <ref bean="ExtTmsYhbDAO" />
    </property>
    </bean>
    config-extdao.xml <bean id="ExtTmsZxbDAO" class="extDao.ExtTmsZxbDAO">
    <property name="sessionFactory">
    <ref bean="sessionFactory" />
    </property>
    </bean>
    再贴一次LoginAction.java的代码public class LoginAction extends Action {
    private ChangeBean CB = new ChangeBean();
    private UsedBean ub = new UsedBean();
    private UserLoad uload;
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws IOException {
    LoginForm loginForm = (LoginForm) form;
    HttpSession httpSession = request.getSession();
    MesProperty mpro = new MesProperty();
    MD5 md5 = new MD5();
    String sDlm = CB.clearNull(loginForm.getDlm());// 登陆帐号
    String sMm = md5.getMD5ofStr(CB.clearNull(loginForm.getMm()));// 登陆密码
    // 以下是准备条件 开始 =======================================
    ParProperty ppproUser = new ParProperty();// 
    ppproUser.setBh(sDlm);// 帐号
    RetProperty prproUser = new RetProperty();
    prproUser = uload.getOne(ppproUser);//执行到这步就停住了,tomcat没有报错
    String sOldMmUser = CB.clearNull(prproUser.getMm());// 用户表密码
    if (!sMm.equals(sOldMmUser)) {
    mpro.setMessage("对不起,密码不正确");
    httpSession.setAttribute("ReturnMpro", mpro);
    response.sendRedirect(sErrorUrl);
    return null;
    } else {
    // 以下是将需要的数据写入session,已供页面使用
    UserProperty sessionInfo = new UserProperty();
    sessionInfo.setDlm(CB.clearNull(prproUser.getXm()));
    httpSession.setAttribute("sessionLoginInfo", sessionInfo);
    mpro.setFlag(true);
    httpSession.setAttribute("ReturnMpro", mpro);
    response.sendRedirect(sReturnUrl);
    return null;
    }

    }
    public UserLoad getUload() {
    return uload;
    }
    public void setUload(UserLoad uload) {
    this.uload = uload;
    }
    }
    我跟踪了代码LoginAction执行后,在UserLoad里面 public RetProperty getOne(ParProperty ppro) {
    ExtTmsYhbDAO extTmsYhbDAO = new ExtTmsYhbDAO();
    extTmsYhbDAO = (ExtTmsYhbDAO) ub.getBean("ExtTmsYhbDAO");//在这一句停住了,还是没有报错 RetProperty rpro = extTmsYhbDAO.getOneInfoByCondition(ppro);
    return rpro;
    }我在UserLoad里面测试用getOne()读取数据时成功了,也就是说在LoginAction调用getOne()时就不能getBean了。
    而且当出现上面描述的卡住的情况后,用windows的任务管理器会发现tomcat占用的cpu和内存会不断增加,过了比较长的一段时间后,tomcat会报错说out of memory内存不足。补充一下,原来工程的开发环境是tomcat和apache整合的,现在的运行环境是单纯用tomcat,请问环境的不同会导致上面的问题吗?
      

  4.   

    从你的spring配置看,函数getOne中,属性extTmsYhbDAO已经由spring初始化了并注入到UserLoad里了,直接使用就可以了,没有必要进行初始化,还有就是你的UsedBean类,设计很不合理
      

  5.   

    谢谢楼上的关注
    我试过跳过初始化,但是action运行时tomcat会报错javax.servlet.ServletException: Error creating bean with name '/home/login' defined in ServletContext resource [/WEB-INF/classes/config-struts.xml]: Can't resolve reference to bean 'UserLoad' while setting property 'uload'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'UserLoad' defined in ServletContext resource [/WEB-INF/classes/config-struts.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.FatalBeanException: Could not instantiate class [myclass.user.UserLoad]; constructor threw exception; nested exception is java.lang.ExceptionInInitializerError: null
    org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)