问题出在:
Action对象是在 ActionContext 容器对象之前创建的,ActionContext 作为成员变量,还没有轮到创建它哦,
所以NullPointerExcetion.
这个问题,烦扰了我很久:
同样的Action改了个名字,原来是JoinAction 后来 独立出来 MemberAction(由JoinAction 复制而来)
中间改过代码,把ActionContext作为了MemberAction成员变量了,之后,JoinAction可以访问,但MemberAction总是500错误。
一直怀疑是applicationContent.xml出错,共用了一个singleton的service,怎么改都不成功。
经过梳理,觉得,问题不是出在这里,因为 在Action里调用singleton 或prototype service 的代码,之前都写过,这个有问题就麻烦了。折腾了几次重启tomcat,才排除。这个原因。
改成之前错误代码,重现下给大家看看:
==========错误的代码:============================================如下:
public class MemberAction extends ActionSupport {
private static final long serialVersionUID = 1L;
Member member;
MemberService service;
HttpSession session = ServletActionContext
.getRequest().getSession();
/**
* ========== 初始化:mofidyMe.jsp ==========
*/
public String initModifyMe() {}
....
}
========== applicationContent.xml 配置: ============如下:
<!-- 以下注入是Member Table 开始于 55555 结束于55555 -->
<bean id="memberDao" class="db.dao.impl.MemberDaoImpl" scope="singleton">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="memberService" class="marego.service.impl.MemberServiceImpl" scope="singleton">
<property name="memberDao" ref="memberDao"></property>
</bean>
<bean id="joinAction" class="marego.action.JoinAction" scope="prototype">
<property name="service" ref="memberService"></property>
</bean>
<!-- 以下注入是Member Table 开始于 66666 结束于66666 -->
<bean id="memberAction" class="marego.action.MemberAction" scope="prototype">
<property name="service" ref="memberService"></property>
</bean>
重启,不报错,ok。
输入本地Url:http://127.0.0.1:8088/wyweb/marego/modifyMe
HTTP Status 500 -
Apache Tomcat/6.0.20 - Error report<!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}-->
type
Exception report
message
description
The server encountered an internal error () that
prevented it from fulfilling this request.
exception
Unable to instantiate Action, memberAction, defined for 'modifyMe' in namespace '/marego'Error creating bean with name 'memberAction' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [marego.action.MemberAction]: Constructor threw exception; nested exception is java.lang.NullPointerException
com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:306)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:387)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:186)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:458)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
root cause
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'memberAction' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [marego.action.MemberAction]: Constructor threw exception; nested exception is java.lang.NullPointerException
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:451)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:268)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:757)
com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:126)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:139)
com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:109)
com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:287)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:387)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:186)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:458)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
root cause
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [marego.action.MemberAction]: Constructor threw exception; nested exception is java.lang.NullPointerException
org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100)
org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:757)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:722)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:386)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:268)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:757)
com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:126)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:139)
com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:109)
com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:287)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:387)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:186)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:458)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
root cause
java.lang.NullPointerException
marego.action.MemberAction.<init>(MemberAction.java:36)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
java.lang.reflect.Constructor.newInstance(Constructor.java:513)
org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:85)
org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:757)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:722)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:386)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:268)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:160)
org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:757)
com.opensymphony.xwork2.spring.SpringObjectFactory.buildBean(SpringObjectFactory.java:126)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:139)
com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:109)
com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:287)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:387)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:186)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:61)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:47)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:458)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
note
The full stack trace of the root cause is available in the
Apache Tomcat/6.0.20 logs.
Apache Tomcat/6.0.20
错误出来了。
改正:
去掉 之后初始化的成员变量,再输入刚那个Url,OK,可以访问了。
分享到:
相关推荐
ActionContext是Struts2框架中一个关键的组件,它提供了当前请求上下文的信息,而OGNL(Object-Graph Navigation Language)则是Struts2中的表达式语言,用于在模型和视图之间进行数据传递。下面将详细探讨这两个...
如果我们在Action中设置`ActionContext`的值栈,然后将`User`对象压入栈中,那么在视图层的JSP或Freemarker模板中,可以直接使用`${name}`来显示用户名,因为`User`对象现在是栈顶的根对象。 总的来说,Struts2的...
总之,Struts2通过ActionContext类实现了对Servlet API的间接访问,使得在不破坏Action的独立性的同时,能够方便地处理Web相关的任务,如管理请求参数、会话状态和应用级别的数据。这种设计提高了代码的灵活性和可...
在Struts2框架中,ActionContext扮演着至关重要的角色,它是Action执行时的上下文环境,可以理解为一个存储Action执行过程中所需对象的容器。实际上,这个容器是一个Map,用于保存Action执行期间需要的各种信息。 ...
通过这个接口,Struts2框架会在执行execute方法前自动将HttpServletResponse对象注入到Action类的成员变量中。例如: ```java public class MyAction extends ActionSupport implements ServletResponseAware { ...
- ActionContext是Struts2框架中执行Action时的上下文环境,它是一个存储各种对象的容器,主要包含了请求(Request)、会话(Session)以及ActionContext本身的信息。 - 通常,我们可以通过`ActionContext context = ...
更值得注意的是,Struts2并不强制使用Action接口,任何包含`execute()`方法的Plain Old Java Object (POJO)都可以作为Action使用,这极大地提高了代码的可复用性和灵活性。 Action的生命周期在Struts2中由Struts和...
在Struts2中,Action类是处理用户请求的核心组件,它负责接收前端传递的参数并进行业务逻辑处理。本文将详细介绍Struts2中Action获取参数的三种主要方式,并通过实际代码示例来阐述每种方法的使用。 1. **通过...
6. **查看Action上下文**:Struts2的ActionContext封装了当前请求的所有上下文信息,如session、parameters等。在调试时,可以检查ActionContext中的内容来了解请求的状态。 7. **处理结果类型**:调试时,要留意...
2. **表单域(Form Fields)**:表单中的输入字段在Action类中通常表现为成员变量,通过getter和setter方法进行访问。Struts2会自动将请求参数绑定到这些字段,实现数据的映射。 3. **结果类型(Result Types)**:...
5. **ValueStack**:存储ActionContext中的所有对象,包括Action实例、OGNL表达式中的变量等。OGNL(Object-Graph Navigation Language)是Struts2中用于访问和操作这些对象的表达式语言。 现在,我们来看这个...
在“第九讲 ActionContext.docx”中,你将学习到ActionContext是Struts2中非常关键的一个组件,它提供了请求和响应之间的上下文信息。ActionContext封装了当前线程中的请求、响应、session以及application等对象,...
3. 在Action的成员变量中定义变量并生成getter方法,Struts2会自动将数据放入值栈。 在JSP中,可以通过以下方式获取数据: 1. 直接通过OGNL表达式访问。 2. 使用ActionContext获取值栈,然后从栈中弹出数据。 3. ...
但在Struts2的IoC场景下,`UserService`将被声明为`LoginAction`的成员变量,并通过注解或配置文件进行注入。 1. **注解注入**: 使用Struts2的注解`@Inject`或者Spring的`@Autowired`,可以直接在Action类的字段...
XWork提供了一套动作框架,包括Action、ActionContext、Interceptor等,是Struts2处理请求、执行业务逻辑的基础。 这五个核心包共同构成了Struts2的核心架构,使得开发者能够轻松地构建可扩展、可维护的Web应用程序...
3. **上下文感知**:OGNL能够根据当前上下文查找变量,例如在Struts2中,ActionContext可以作为默认上下文。 4. **动态性**:OGNL表达式可以动态改变,使得程序更具灵活性。 5. **简洁性**:OGNL的语法简洁,易于...
- 在Action类中,我们定义了各种属性(成员变量),这些属性可以用来接收从视图层传递过来的请求参数。例如,如果我们有一个名为`username`的参数,可以在Action类中声明对应的`private String username;`,然后...
8. **页面跳转与数据传递**:在Struts2中,Action类的方法返回的结果名对应一个视图,如jsp页面,同时可以通过ActionContext或ModelDriven接口将数据传递到视图。页面之间的跳转和数据传递是Struts2的一大特点,简化...