UserAction类@SuppressWarnings("serial")
@Component("u")
@Scope("prototype")
public class UserAction extends SuperAction{
private String username;
private String password;
private String password2;
private UserService userService;

@Override
public String execute() throws Exception {
User u=new User();
u.setUsername(username);
u.setPassword(password);
System.out.println(u);
boolean flag=userService.query(u);
if(flag){
userService.save(u);
return "success";
}
else
return "fail";

}
public String queryAllUser(){
System.out.println(userService);
List<User> list=userService.queryAllUser();
if(list!=null && list.size()>0){
session.setAttribute("userList", list);
return "querySuccess";
}else{
return "queryFail";
}
}

public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getPassword2() {
return password2;
} public void setPassword2(String password2) {
this.password2 = password2;
}

public UserService getUserService() {
return userService;
}
@Resource(name="userServiceImpl")
public void setUserService(UserService userService) {
this.userService = userService;
}
}
service实现类
@Component("userServiceImpl")
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
public boolean query(User u) {
boolean flag=userDAO.query(u);
return flag;
}


public List<User> queryAllUser() {
System.out.println(userDAO);
List<User> list=userDAO.queryAllUser();
return list;
}

public void save(User u) {
userDAO.add(u);
} public UserDAO getUserDAO() {
return userDAO;
}
@Resource(name="userDAOImpl")
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
beans.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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd ">

<context:annotation-config/><!-- 表示使用注解 -->
<context:component-scan base-package="com.tanqil"/><!-- 表示扫描以com.tanqil开头的包下的类是否标注@Component,有表示spring容器自动生成该类的对象,同bean一样 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- sessionFactory中要配置DataSource,映射实体类,配置hibernate方言等属性 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan">
<list>
<value>com.tanqil.model</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 告知Struts2运行时使用spring来创建对象,不过在struts2-spring-plugin.jar的struts-plugin.xml中已配置,无需自己配置 -->
<!--  <constant name="struts.objectFactory" value="spring"></constant>-->
<package name="default" extends="struts-default">
<action name="u" class="com.tanqil.action.UserAction" >
<result name="success">/registerSuccess.jsp</result>
<result name="fail">/registerFail.jsp</result>
</action>
<action name="query" class="com.tanqil.action.UserAction" method="queryAllUser">
<result name="querySuccess">/querySuccess.jsp</result>
<result name="queryFail">/queryFail.jsp</result>
</action>
</package>
</struts>
测试类:
@Test
public void testExecute() throws Exception{
ApplicationContext atx=new ClassPathXmlApplicationContext("beans.xml");

UserAction ua=(UserAction) atx.getBean("u");
ua.setUsername("x");
ua.setPassword("x");
String ret=ua.execute();
System.out.println(ret);
}
使用测试类测试时没错,但是部署到tomcat上之后再网页中打开就报空指针异常,
jsp:
 <form action="u.action" method="post"> 
     用户名:<input type="text" name="username"/><br>
     密码:<input type="password" name="password"/><br>
     确认密码:<input type="password" name="password2"/><br>
     <input type="submit" value="提交"/>
    </form>
    <br>
问题:
java.lang.NullPointerException
com.tanqil.action.UserAction.execute(UserAction.java:31)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:871)
ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1294)
ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68)
com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethodWithDebugInfo(XWorkMethodAccessor.java:117)
com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethod(XWorkMethodAccessor.java:108)
ognl.OgnlRuntime.callMethod(OgnlRuntime.java:1370)
ognl.ASTMethod.getValueBody(ASTMethod.java:91)
ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
ognl.SimpleNode.getValue(SimpleNode.java:258)
ognl.Ognl.getValue(Ognl.java:467)。。

解决方案 »

  1.   

    action中的service没有注入,上边打个注解标记
      

  2.   

    UserAction.java:31  这行是什么内容
      

  3.   


    他配在set方法上的
      

  4.   

    <constant name="struts.objectFactory" value="spring"></constant>这个要放开。
      

  5.   


    他配在set方法上的的确是,怪不得下边的报错有些诡异,难道是页面中的值没有传过去?
      

  6.   


    他配在set方法上的的确是,怪不得下边的报错有些诡异,难道是页面中的值没有传过去?嗯嗯,或许可以在31行打个断点,看看各个属性的状态。