昨天遇到一个问题:刚刚开始的时候我在Struts2里面配置Action并注入业务层类的时候是没有问题的。后来自己使用了Struts通配符问题就出来了!报的是空指针异常!搞不清楚为什么!业务层那边我自己写了个测试类是绝对没有问题的。就是Action那边出问题了!我也不知道问题出在哪里!
先来看看我的Struts2配置文件 <constant name="struts.devMode" value="true"></constant>
<!-- 设置Struts2的编码方式 -->
<constant name="struts.i18n.encoding" value="gbk" />
<package name="struts2" extends="struts-default" namespace="/zyw">
<action name="*_*" class="com.boxun.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<result name="input">/{1}_{2}_input.jsp</result>
<result name="error">/{1}_{2}_input.jsp</result>
</action>
</package>jsp页面名跟Action名:先是Action:
LogInAction.java
StudentAction.java在是jsp:
LogIn_select_input.jsp
LogIn_select_success.jsp
Student_select_input.jsp
Student_select_success.jsp我的Actionform:
LogIn_select_input.jsp的Actionform
<s:form action="zyw/LogIn_select">Student_select_input.jsp的Actionform
<s:form action="zyw/Student_select">
Spring配置文件: <!-- dao层注入SessFactory -->
<bean id="baseDao" class="com.boxun.dao.impl.BaseDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 业务层 -->
<bean id="empBiz" class="com.boxun.biz.impl.EmpBizImpl">
<property name="baseDao" ref="baseDao"></property>
</bean>
<bean id="stuBiz" class="com.boxun.biz.impl.StudentUserBizImpl">
<property name="baseDao">
<ref bean="baseDao" />
</property>
</bean> <!-- Action -->
<bean id="StudentAction" class="com.boxun.action.StudentAction">
<property name="studentView">
<ref bean="stuBiz"></ref>
</property>
</bean>
<bean id="LogInAction" class="com.boxun.action.LogInAction">
<property name="empView">
<ref bean="empBiz"></ref>
</property>
</bean>
Action中的Select方法代码: //这是StudentAction
private IStudentUserBiz studentView;
public void setStudentView(IStudentUserBiz studentView) {
this.studentView = studentView;
}
private String username;
private String userpass;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
public String select(){
String hql = "from Studentuser stu where stu.username=? and stu.userpass=? ";
Object[] obj = new Object[]{this.username,this.userpass};
List list = this.studentView.getAll(hql, obj);
if(null == list || list.size() <= 0){
ActionContext.getContext().put("msg", "用户名或密码错误!");
return INPUT;
}else{
ActionContext.getContext().getSession().put("user", (Studentuser)list.get(0));
ActionContext.getContext().put("msg", "登录成功!");
return SUCCESS;
}
} //这是LogInAction
private IEmpBiz empView;
public void setEmpView(IEmpBiz empView) {
this.empView = empView;
}
public String username;
public String userpass;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
public String select(){
List list = empView.getAll("from Emp mp where mp.ename=?", new Object[] {this.username});
if(null == list || list.size() <= 0){
super.addFieldError("username", "用户名或密码错误!");
return INPUT;
}
if (null!=list && list.size()>0) {
List<Emp> li = empView.getAll("from Emp", null);
ActionContext.getContext().put("list", li); //表示存放在Request范围中
}
return SUCCESS;
}注意:业务层跟数据层是没有问题的、所以代码我不贴出来了!我想可能就是Spring依赖注入的问题。但是就是不知道他妈问题出在哪里!!!希望高手们给看看!!!
先来看看我的Struts2配置文件 <constant name="struts.devMode" value="true"></constant>
<!-- 设置Struts2的编码方式 -->
<constant name="struts.i18n.encoding" value="gbk" />
<package name="struts2" extends="struts-default" namespace="/zyw">
<action name="*_*" class="com.boxun.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<result name="input">/{1}_{2}_input.jsp</result>
<result name="error">/{1}_{2}_input.jsp</result>
</action>
</package>jsp页面名跟Action名:先是Action:
LogInAction.java
StudentAction.java在是jsp:
LogIn_select_input.jsp
LogIn_select_success.jsp
Student_select_input.jsp
Student_select_success.jsp我的Actionform:
LogIn_select_input.jsp的Actionform
<s:form action="zyw/LogIn_select">Student_select_input.jsp的Actionform
<s:form action="zyw/Student_select">
Spring配置文件: <!-- dao层注入SessFactory -->
<bean id="baseDao" class="com.boxun.dao.impl.BaseDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 业务层 -->
<bean id="empBiz" class="com.boxun.biz.impl.EmpBizImpl">
<property name="baseDao" ref="baseDao"></property>
</bean>
<bean id="stuBiz" class="com.boxun.biz.impl.StudentUserBizImpl">
<property name="baseDao">
<ref bean="baseDao" />
</property>
</bean> <!-- Action -->
<bean id="StudentAction" class="com.boxun.action.StudentAction">
<property name="studentView">
<ref bean="stuBiz"></ref>
</property>
</bean>
<bean id="LogInAction" class="com.boxun.action.LogInAction">
<property name="empView">
<ref bean="empBiz"></ref>
</property>
</bean>
Action中的Select方法代码: //这是StudentAction
private IStudentUserBiz studentView;
public void setStudentView(IStudentUserBiz studentView) {
this.studentView = studentView;
}
private String username;
private String userpass;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
public String select(){
String hql = "from Studentuser stu where stu.username=? and stu.userpass=? ";
Object[] obj = new Object[]{this.username,this.userpass};
List list = this.studentView.getAll(hql, obj);
if(null == list || list.size() <= 0){
ActionContext.getContext().put("msg", "用户名或密码错误!");
return INPUT;
}else{
ActionContext.getContext().getSession().put("user", (Studentuser)list.get(0));
ActionContext.getContext().put("msg", "登录成功!");
return SUCCESS;
}
} //这是LogInAction
private IEmpBiz empView;
public void setEmpView(IEmpBiz empView) {
this.empView = empView;
}
public String username;
public String userpass;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
this.userpass = userpass;
}
public String select(){
List list = empView.getAll("from Emp mp where mp.ename=?", new Object[] {this.username});
if(null == list || list.size() <= 0){
super.addFieldError("username", "用户名或密码错误!");
return INPUT;
}
if (null!=list && list.size()>0) {
List<Emp> li = empView.getAll("from Emp", null);
ActionContext.getContext().put("list", li); //表示存放在Request范围中
}
return SUCCESS;
}注意:业务层跟数据层是没有问题的、所以代码我不贴出来了!我想可能就是Spring依赖注入的问题。但是就是不知道他妈问题出在哪里!!!希望高手们给看看!!!
这样的配置呢?改成这样子
<package name="struts2" extends="struts-default" namespace="/zyw">
<action name="*_*" class="{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<result name="input">/{1}_{2}_input.jsp</result>
<result name="error">/{1}_{2}_input.jsp</result>
</action>
</package>
class应该直接指向spring中定义的bean的id。以上匹配的请求示例:
Login_select 这个action 请求在spring中id为 LoginAction的bean中的select()方法,也就是
com.boxun.action.LogInAction中的select()Student_select 则请求id为StudentAction的bean中的select()方法,也就是com.boxun.action.com.boxun.action.StudentAction这个action中的对应的方法注意大小写!!!!
The problematic instruction:
----------
==> ${msg[0]} [on line 68, column 29 in org/apache/struts2/dispatcher/error.ftl]
----------Java backtrace for programmers:
----------
freeer.template.TemplateModelException: Method public java.lang.String org.hibernate.exception.NestableRuntimeException.getMessage(int) threw an exception when invoked on org.hibernate.exception.SQLGrammarException: could not execute query
at freeer.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:130)
at freeer.ext.beans.SimpleMethodModel.get(SimpleMethodModel.java:138)
at freeer.core.DynamicKeyName.dealWithNumericalKey(DynamicKeyName.java:111)
at freeer.core.DynamicKeyName._getAsTemplateModel(DynamicKeyName.java:90)
at freeer.core.Expression.getAsTemplateModel(Expression.java:89)
at freeer.core.Expression.getStringValue(Expression.java:93)
at freeer.core.DollarVariable.accept(DollarVariable.java:76)
at freeer.core.Environment.visit(Environment.java:209)
at freeer.core.MixedContent.accept(MixedContent.java:92)
at freeer.core.Environment.visit(Environment.java:209)
at freeer.core.IfBlock.accept(IfBlock.java:82)
at freeer.core.Environment.visit(Environment.java:209)
at freeer.core.IteratorBlock$Context.runLoop(IteratorBlock.java:179)
at freeer.core.Environment.visit(Environment.java:416)
at freeer.core.IteratorBlock.accept(IteratorBlock.java:102)
at freeer.core.Environment.visit(Environment.java:209)
at freeer.core.MixedContent.accept(MixedContent.java:92)
at freeer.core.Environment.visit(Environment.java:209)
at freeer.core.IfBlock.accept(IfBlock.java:82)
at freeer.core.Environment.visit(Environment.java:209)
at freeer.core.MixedContent.accept(MixedContent.java:92)
at freeer.core.Environment.visit(Environment.java:209)
at freeer.core.Environment.process(Environment.java:189)
at freeer.template.Template.process(Template.java:237)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:748)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
at freeer.ext.beans.SimpleMemberModel.unwrapArguments(SimpleMemberModel.java:85)
at freeer.ext.beans.SimpleMethodModel.exec(SimpleMethodModel.java:106)
... 39 more
2011-3-17 9:41:38 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:752)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:505)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
这里说明了问题...看样子果struts2和spring配置都没大问题,你先试试action的方法中不执行逻辑操作,仅仅打印语句看看能不能成功。按照上面的提示,自己仔细检查下你的映射文件配置和逻辑代码。 一步一步来排查吧...
现在终于想起来了!不过昨天确实存在我说的问题!等我把表给恢复回来!
在运行看看!哥们对Struts2、Spring、Hibernate整合有什么看法没有!我现在学这个框架的搭配!很多东西都不是很清楚。特别是Spring的依赖注入!