Java Struts2:正在访问超出其范围的列表

Java Struts2:正在访问超出其范围的列表,java,jakarta-ee,struts2,struts,Java,Jakarta Ee,Struts2,Struts,我有一个struts2动作类,看起来像这样: //import relevant packages public class Product implements SessionAware, ServletRequestAware, ServletResponseAware, ServletContextAware { private String productName; private String description; private Str

我有一个struts2动作类,看起来像这样:

//import relevant packages

public class Product implements SessionAware, ServletRequestAware,
        ServletResponseAware, ServletContextAware {

    private String productName;
    private String description;
    private String price;

    private ServletContext servletContext; 
    private HttpServletRequest servletRequest; 
    private HttpServletResponse servletResponse; 
    private Map sessionMap;

    //getters and setters here

    public void setServletRequest(HttpServletRequest servletRequest) {
        this.servletRequest = servletRequest;
    }

    public void setSession(Map map) {
        this.sessionMap = map;
    }

    public void setServletResponse(HttpServletResponse servletResponse) {
        this.servletResponse = servletResponse;
    }

    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    public String execute() {


       //  do something here
        return "success";
    }

    public List<String> getCountries() {
        List<String> countries = new ArrayList<String>();
        countries.add("Australia");
        countries.add("Fiji");
        countries.add("New Zealand");
        countries.add("Vanuatu");
        return countries;
    }

}
//导入相关包
公共类产品实现SessionAware、ServletRequestAware、,
ServletResponseAware,ServletContextAware{
私有字符串产品名称;
私有字符串描述;
私人字符串价格;
私有ServletContext ServletContext;
私有HttpServletRequest-servletRequest;
私有HttpServletResponse-servletResponse;
私有地图会话地图;
//这里有接球手和接球手
公共无效setServletRequest(HttpServletRequest-servletRequest){
this.servletRequest=servletRequest;
}
公共无效设置会话(映射){
this.sessionMap=map;
}
公共无效设置servletResponse(HttpServletResponse-servletResponse){
this.servletResponse=servletResponse;
}
公共void setServletContext(ServletContext ServletContext){
this.servletContext=servletContext;
}
公共字符串execute(){
//在这里做点什么
返回“成功”;
}
国家/地区公共列表(){
列表国家=新的ArrayList();
国家。添加(“澳大利亚”);
添加(“斐济”);
国家。添加(“新西兰”);
添加(“瓦努阿图”);
返回国;
}
}
sruts.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.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <package name="package.name" namespace="/" extends="struts-default">
        <action name="Product_input">
            <result>/jsp/Product.jsp</result>
        </action>
        <action name="Product_save" class="package.name.Product" method="execute">
            <result>/jsp/Details.jsp</result>
        </action>       
    </package>
</struts>

/jsp/Product.jsp
/jsp/Details.jsp
Product.jsp由一个简单的表单组成:

<s:form action="Product_save">
        <s:textfield label="Product Name" key="productName"/>
        <s:textfield label="Description" key="description"/>
        <s:textfield label="Price" key="price"/>
        <s:submit/>
</s:form>

Details.jsp显示表单中输入的内容:

<h5>Details:</h5>
Product Name:
<s:property value="productName" />
<br /> Description:
<s:property value="description" />
<br /> Price: $
<s:property value="price" /> </br>
<s:property value="countries[0]" /> </br>
详细信息:
产品名称:

说明:
价格:$

jsp中的最后一行尝试访问action类中getCountries()中声明的国家列表,理想情况下,它不应该打印任何内容,因为该方法从未被访问,国家列表也不是action类属性的一部分(因此,在值堆栈中创建Product类型的对象时,它不应该有国家)


但是它会打印澳大利亚(列表的索引值)以及其他表单属性。这是如何发生的/为什么发生的?

当您在

countries[0]
它调用
getCountries()
方法。现在,正如您将
[0]
放在它旁边,并且
国家
是一个列表

也就是说

getCountries().get(0)

您可以通过在
getCountries()
方法中放入
sysout
来验证这一点。

当您在中写入
countries

countries[0]
它调用
getCountries()
方法。现在,正如您将
[0]
放在它旁边,并且
国家
是一个列表

也就是说

getCountries().get(0)

您可以通过在
getCountries()
方法中放置一个
sysout
来验证这一点。

在struts中,我们使用“property”属性来访问bean的值,当我们使用property属性时,它的getter方法将被调用,因此在上面的代码中,getCountries()方法被调用。

在struts中,我们使用“property”属性来访问bean的值,当我们使用property属性时,会调用它的getter方法,因此在上面的代码中会调用getCountries()方法。

countries[0]
最终会转到
getCountries()。get(0)
,所以这个getter方法在您的action类中,OGNL可以访问它,而且在您的方法中,您正在创建一个列表并填充它,所以S2和OGNL所做的非常好在我看来,您的评论是这个问题的完美答案=)@Umeshawashi好的,所以在action类中任何带有get prefix的方法都是getter方法,因为我已经在这个方法本身中创建了一个列表,所以它也成为action类属性?对吗?
countries[0]
最终将转到
getCountries().get(0)
,所以这个getter方法在您的action类中,OGNL可以访问它,而且在您的方法中,您正在创建一个列表并填充它,所以S2和OGNL所做的在我看来是完美的,您的评论这是这个问题的完美答案=)@umeshawashi好的,所以在action类中任何带有get前缀的方法都是getter方法,因为我在这个方法本身中创建了一个列表,所以它也成为action类属性?对吗?我想我基本上明白了,通过在getCountries(local)中创建一个列表,它成为action类属性的一部分,因此可以访问。任何带有get prefix的方法都可以充当getter方法。我想我基本上得到了它,通过在getCountries(本地)中创建一个列表,它成为action类属性的一部分,因此可以访问。任何带有get前缀的方法都充当getter方法。