【发布时间】:2014-04-05 11:54:53
【问题描述】:
我有一个使用 Struts2 框架的网站。它在我的本地计算机上运行良好,但是当我将它上传到远程服务器(托管)时,一些 getter 和 setter 变得没有调用。 例如:
动作:ForecastAction.java
JSP:forecast.jsp
这是forecast.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
...
<span><s:property value="day" /></span>
<span><s:property value="month" /></span>
<span class="week_day"><s:property value="weekday" /></span>
...
这是ForecastAction.java
public class ForecastAction extends ActionSupport {
private String day, month, weekday;
... (other variables)
public String getDay() {
System.out.println("Ask for day");
return day;
}
public void setDay(String day) {
this.day = day;
}
public String getMonth() {
System.out.println("Ask for month");
return month;
}
public void setMonth(String month) {
this.month = month;
}
public String getWeekday() {
return weekday;
}
public void setWeekday(String weekday) {
this.weekday = weekday;
}
... (other setters and getters)
public String execute(){
... (calculcating parameters)
return SUCCESS;
}
}
在我的本地计算机上,我可以看到所有值(日、月和工作日),但远程服务器仅返回到 jsp 日值。在我看来,这些属性之间没有区别,但struts只显示一天。我检查过,该操作(在远程服务器上)计算所有值,因此变量不为空。问题是 getter 不是由 struts 调用的。
在我的应用程序的其他操作中观察到相同的问题:setter setPassword() 不起作用,但 setLogin() 在授权操作中可以正常工作。 (它只有两个 setter)。
更新:
当我像这样在 jsp 中更改日期和月份时:
<span><s:property value="%{#day}"/></span>
<span><s:property value="%{#month}"/></span>
我开始正确地看到工作日。看来,struts 只显示了他喜欢的第一个属性:) 仅此而已。
JSP Debug:
Struts has detected an unhandled exception:
1.permission can't be null
2.actionErrors
3.Caught an exception while getting the property values of Weather.Action.Public.ForecastAction@749f6da7
4.An exception occurred processing JSP page /forecast.jsp at line 3 1: <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2: <%@ taglib prefix="s" uri="/struts-tags" %> 3: 4: 5: 6: Stacktrace:
Stacktraces
org.apache.jasper.JasperException: An exception occurred processing JSP page /forecast.jsp at line 3 1: <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2: <%@ taglib prefix="s" uri="/struts-tags" %> 3: 4: 5: 6: Stacktrace:
1)Caught an exception while getting the property values of Weather.Action.Public.ForecastAction@30aa119a - Class: ognl.ObjectPropertyAccessor File: ObjectPropertyAccessor.java Method: getPossibleProperty Line: 69 - ognl/ObjectPropertyAccessor.java:69:-1
2)actionErrors - Class: ognl.ObjectPropertyAccessor File: ObjectPropertyAccessor.java Method: getPossibleProperty Line: 69 - ognl/ObjectPropertyAccessor.java:69:-1
3)ognl.OgnlException: actionErrors [java.lang.NullPointerException: permission can't be null]
4)java.lang.NullPointerException: permission can't be null
/UDP
你能帮我吗,有什么问题吗?
也许需要下一个文件:
这是我的struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.multipart.maxSize" value="30000000" />
<package name="public" namespace="/" extends="struts-default">
... (other actions)
<action name="forecast" class="Weather.Action.Public.ForecastAction" method="execute">
<result name="success">/forecast.jsp</result>
<result name="error">/Error.jsp</result>
</action>
... (other actions)
</package>
...(other package)
</struts>
还有 web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Weather</display-name>
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter- class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>StartTimerServlet</servlet-name>
<display-name>StartTimerServlet</display-name>
<servlet-class>Weather.Service.StartTimerServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
</web-app>
【问题讨论】:
-
在您的操作中将 getMonth 更改为 System.out.println("询问月份 "+month);您将在输出中看到什么。你会在那里看到正确的月份吗?!
-
谢谢大家的关注,当我改成"System.out.println("求月"+month);"没有什么变化。方法 getMonth 没有被调用。
-
当我像这样在 jsp 中更改日期和月份时:
<s:property value="%{#day}"/> <s:property value="%{#month}"/>我开始正确地看到工作日。看来,struts 只显示了他喜欢的第一个属性:) 仅此而已。 -
这看起来很奇怪!!如果你先切换 s:properties
<span><s:property value="month" /></span>和第二个<span><s:property value="day" /></span>会发生什么 -
很奇怪!我只会看一个月。我已将 StackTrace 添加到第一条消息中。
标签: java jsp tomcat struts2 getter