功能描述:两个页面Login.jsp和Index.jsp。验真用户名和密码正确后进入Index.jsp,否则回到Login.jsp
问题:点击登录后,出现以下错误原因。不知道错在哪里了。
description The server encountered an internal error () that prevented it from fulfilling this request.
root cause
java.lang.NullPointerException
vo.TuserDAO.findByExample(TuserDAO.java:68)
com.webapp.struts.action.LoginAction.execute(LoginAction.java:48)
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
以下是部分代码:
LoginAction.java:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
Tuser tuser=new Tuser();
tuser.setLoginName(loginForm.getUsername());
tuser.setLoginPassword(loginForm.getUserpass());
TuserDAO tuserDao=new TuserDAO();
List result= (List) tuserDao.findByExample(tuser);
if (result.size()>0){
return mapping.findForward("success");
}
else{
return mapping.findForward("fail");
}
}TuserDAO.java:
public List findByExample(Tuser instance) {
log.debug("finding Tuser instance by example");
try {
List results = getHibernateTemplate().findByExample(instance);
log.debug("find by example successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}applicationContext.xml:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property name="url"
value="jdbc:sqlserver://127.0.0.1:1433">
</property>
<property name="username" value="sa"></property>
<property name="password" value="sa"></property>
</bean>
问题:点击登录后,出现以下错误原因。不知道错在哪里了。
description The server encountered an internal error () that prevented it from fulfilling this request.
root cause
java.lang.NullPointerException
vo.TuserDAO.findByExample(TuserDAO.java:68)
com.webapp.struts.action.LoginAction.execute(LoginAction.java:48)
org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
以下是部分代码:
LoginAction.java:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
Tuser tuser=new Tuser();
tuser.setLoginName(loginForm.getUsername());
tuser.setLoginPassword(loginForm.getUserpass());
TuserDAO tuserDao=new TuserDAO();
List result= (List) tuserDao.findByExample(tuser);
if (result.size()>0){
return mapping.findForward("success");
}
else{
return mapping.findForward("fail");
}
}TuserDAO.java:
public List findByExample(Tuser instance) {
log.debug("finding Tuser instance by example");
try {
List results = getHibernateTemplate().findByExample(instance);
log.debug("find by example successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}applicationContext.xml:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property name="url"
value="jdbc:sqlserver://127.0.0.1:1433">
</property>
<property name="username" value="sa"></property>
<property name="password" value="sa"></property>
</bean>
if (result.size()>0){
return mapping.findForward("success");
}
else{
return mapping.findForward("fail");
} 改为if (result!=null && result.size()>0){
return mapping.findForward("success");
}
else{
return mapping.findForward("fail");
}
vo.TuserDAO.findByExample(TuserDAO.java:68)
com.webapp.struts.action.LoginAction.execute(LoginAction.java:48)
空指针呀。是不是List results = getHibernateTemplate().findByExample(instance); log.debug("find by example successful, result size: "
+ results.size()); 里面 results为空啦。查不到任何东西。这样这句就会出错。所以如果用户名和密码错误。你系统就会报空指针错误。如果用户名密码对,就能取到 所以就没错。
TuserDAO.java 的68行是
List results = getHibernateTemplate().findByExample(instance);
那就是getHibernateTemplate()为空,这个是DAO写的不标准,没继承
package vo;import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;/**
* A data access object (DAO) providing persistence and search support for Tuser
* entities. Transaction control of the save(), update() and delete() operations
* can directly support Spring container-managed transactions or they can be
* augmented to handle user-managed Spring transactions. Each of these methods
* provides additional information for how to configure it for the desired type
* of transaction control.
*
* @see vo.Tuser
* @author MyEclipse Persistence Tools
*/public class TuserDAO extends HibernateDaoSupport {
private static final Log log = LogFactory.getLog(TuserDAO.class);
// property constants
public static final String LOGIN_NAME = "Login_Name";
public static final String LOGIN_PASSWORD = "Login_Password"; protected void initDao() {
// do nothing
} public void save(Tuser transientInstance) {
log.debug("saving Tuser instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
} public void delete(Tuser persistentInstance) {
log.debug("deleting Tuser instance");
try {
getHibernateTemplate().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
} public Tuser findById(java.lang.String id) {
log.debug("getting Tuser instance with id: " + id);
try {
Tuser instance = (Tuser) getHibernateTemplate().get("vo.Tuser", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
} public List findByExample(Tuser instance) {
log.debug("finding Tuser instance by example");
try {
List results = getHibernateTemplate().findByExample(instance);
log.debug("find by example successful, result size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
} public List findByProperty(String propertyName, Object value) {
log.debug("finding Tuser instance with property: " + propertyName
+ ", value: " + value);
try {
String queryString = "from Tuser as model where model."
+ propertyName + "= ?";
return getHibernateTemplate().find(queryString, value);
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
} public List findByUserName(Object loginName) {
return findByProperty(LOGIN_NAME, loginName);
}
public List findByUserPass(Object loginPassword) {
return findByProperty(LOGIN_PASSWORD, loginPassword);
} public List findAll() {
log.debug("finding all Tuser instances");
try {
String queryString = "from Tuser";
return getHibernateTemplate().find(queryString);
} catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
} public Tuser merge(Tuser detachedInstance) {
log.debug("merging Tuser instance");
try {
Tuser result = (Tuser) getHibernateTemplate().merge(
detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
} public void attachDirty(Tuser instance) {
log.debug("attaching dirty Tuser instance");
try {
getHibernateTemplate().saveOrUpdate(instance);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
} public void attachClean(Tuser instance) {
log.debug("attaching clean Tuser instance");
try {
getHibernateTemplate().lock(instance, LockMode.NONE);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
} public static TuserDAO getFromApplicationContext(ApplicationContext ctx) {
return (TuserDAO) ctx.getBean("TuserDAO");
}
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="vo.Tuser" table="TUser" schema="dbo" catalog="CAMAR">
<id name="loginName" type="java.lang.String">
<column name="Login_Name" length="20" />
<generator class="assigned" />
</id>
<property name="loginPassword" type="java.lang.String">
<column name="Login_Password" length="60" not-null="true" />
</property>
</class>
</hibernate-mapping>
即使getHibernateTemplate().findByExample(instance);
得不到结果,它最终还是会返回一个List,只不过这个List中只有空值,所以
用result.size()>0也不会出错。出现这种错误没准是session为空了,
要不你就看看你的配置文件,有没有把连接数据源的文件配置好。
TuserDAO.java就是从数据库中Tuser表反射生成的。
applicationContext.xml内容也是自动生成的。
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver">
</property>
<property name="url"
value="jdbc:sqlserver://127.0.0.1:1433">
</property>
<property name="username" value="sa"></property>
<property name="password" value="sa"></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.SQLServerDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>vo/Tuser.hbm.xml</value></list>
</property></bean>
<bean id="TuserDAO" class="vo.TuserDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean></beans>
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml" />
</plug-in>
确实struts-config.xml里面没有加这一句话,这个应该在哪个节点加?
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"><struts-config>
<form-beans >
<form-bean name="loginForm" type="struts.form.LoginForm" /> </form-beans>
<global-exceptions />
<global-forwards />
<action-mappings >
<action
attribute="loginForm"
input="/login.jsp"
name="loginForm"
path="/login"
scope="request"
type="struts.action.LoginAction">
<forward name="fail" path="/login.jsp" />
<forward name="success" path="/index.jsp" />
</action> </action-mappings> <message-resources parameter="struts.ApplicationResources" />
</struts-config>