Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在使用struts2从动态创建的下拉列表中选择值后调用操作_Java_Jsp_Struts2 - Fatal编程技术网

Java 如何在使用struts2从动态创建的下拉列表中选择值后调用操作

Java 如何在使用struts2从动态创建的下拉列表中选择值后调用操作,java,jsp,struts2,Java,Jsp,Struts2,在这里,我使用这个创建了动态下拉列表,但当我从可用列表中选择一些值时,应该在action类中调用它。 可以在图像中看到的下拉列表,这里的值是从数据库动态加载的,现在我想要的是当我从两个下拉列表中选择任何值时,这些值(我是指文本值)应该发送到action类,在那里我将根据这两个值执行一个JDBC select查询,并显示在图中所示的表中,但所有内容都应该加载。操作应该是从下拉列表中选择值,而不是单击任何按钮。使用静态值,我可以将下拉列表中的值调用到具有name属性的操作类。但在这种情况下,我不能:

在这里,我使用这个创建了动态下拉列表,但当我从可用列表中选择一些值时,应该在action类中调用它。 可以在图像中看到的下拉列表,这里的值是从数据库动态加载的,现在我想要的是当我从两个下拉列表中选择任何值时,这些值(我是指文本值)应该发送到action类,在那里我将根据这两个值执行一个JDBC select查询,并显示在图中所示的表中,但所有内容都应该加载。操作应该是从下拉列表中选择值,而不是单击任何按钮。使用静态值,我可以将下拉列表中的值调用到具有
name
属性的操作类。但在这种情况下,我不能:(
我希望我现在明白了

我曾尝试使用listkey、name和id调用select标记,但均无效。
下面是我的JSP代码:


事件名称:
公司名称:
用于加载动态下拉列表的操作类:

package com.ca.actions;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ca.database.Database;
import com.ca.pojo.Event;
import java.sql.PreparedStatement;
import com.opensymphony.xwork2.ActionSupport;

public class RetrieveEvNaCoNaAction extends ActionSupport {

    private static final long serialVersionUID = -5418233715172672477L;
    List<Event> dataForBillsJspList;
    private List state = new ArrayList();
    private List status = new ArrayList();
    String eventName;


    public String getEventName() {
        return eventName;
    }

    public void setEventName(String eventName) {
        this.eventName = eventName;
    }

    public RetrieveEvNaCoNaAction() {
        // TODO Auto-generated constructor stub
    }

    public List<Event> getDataForBillsJspList() {
        return dataForBillsJspList;
    }

    public void setDataForBillsJspList(List<Event> dataForBillsJspList) {
        this.dataForBillsJspList = dataForBillsJspList;
    }


    public List getStatus() {
        return status;
    }

    public void setStatus(List status) {
        try {
            Database database = new Database();
            Connection con = database.Get_Connection();

            PreparedStatement ps = con
                    .prepareStatement("SELECT EVENT_NAME,COMPANY_NAME,date_format(FROM_DATE,'%d/%m/%Y') as dateAsFrom,date_format(TO_DATE,'%d/%m/%Y') as dateAsTo FROM EVENT");
            ResultSet rs = ps.executeQuery();
            //dataForBillsJspList = new ArrayList<Event>();
            while (rs.next()) {
                /*dataForBillsJspList.add(new Event(rs.getString("EVENT_NAME"),
                        rs.getString("COMPANY_NAME"), rs
                                .getString("dateAsFrom"), rs
                                .getString("dateAsTo")));
                System.out.println(rs.getString("EVENT_NAME"));*/
                status.add(rs.getString("COMPANY_NAME")); 

            }
            System.out.println("Data Collected ...");
        }catch(Exception e)
        {
            e.printStackTrace();
        }

    }

    public List getState() {
        return state;
    }

    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
                    setState(this.state);
                    setStatus(this.status);
        return "success";
    }
    public String showEventDetails(){
        System.out.println("Hi.."+eventName);
        return SUCCESS;
    }
    public void setState(List state) {
        //implement the application specific logic to 
        try {
            Database database = new Database();
            Connection con = database.Get_Connection();

            PreparedStatement ps = con
                    .prepareStatement("SELECT EVENT_ID,EVENT_NAME,COMPANY_NAME,CONTACT_PERSON,CONTACT_NO,EMAIL_ID,EVENT_VENUE,date_format(FROM_DATE,'%d/%m/%Y') as dateAsFrom,date_format(TO_DATE,'%d/%m/%Y') as dateAsTo ,EVENT_TIME FROM EVENT");
            ResultSet rs = ps.executeQuery();
            dataForBillsJspList = new ArrayList<Event>();
            while (rs.next()) {
                dataForBillsJspList.add(new Event(rs.getString("EVENT_ID"),rs.getString("EVENT_NAME"),
                        rs.getString("COMPANY_NAME"),rs.getString("CONTACT_PERSON"),rs.getString("CONTACT_NO"),rs.getString("EMAIL_ID"),rs.getString("EVENT_VENUE"), rs
                                .getString("dateAsFrom"), rs
                                .getString("dateAsTo"),rs.getString("EVENT_TIME")));
                //System.out.println(rs.getString("EVENT_NAME"));
                state.add(rs.getString("EVENT_NAME")); 
                System.out.println(rs.getString("EVENT_ID"));
            }
            System.out.println("Data Collected ...");
        }catch(Exception e)
        {
            e.printStackTrace();
        }
        //Here for displaying the data on UI, we are using few hardcoded values//
                }
}
下面是action类,我试图使用name属性调用该选定值:

package com.ca.actions;

import com.ca.pojo.Dropdown;
import com.opensymphony.xwork2.ActionSupport;

public class DropdownAction extends ActionSupport 
{
    Dropdown dp;
    public DropdownAction() {
        // TODO Auto-generated constructor stub
    }
    public Dropdown getDp() {
        return dp;
    }
    public void setDp(Dropdown dp) {
        this.dp = dp;
    }
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        System.out.println(dp.getEventState());
        return "success";
    }


}  

struts.xml已正确配置。现在,在选择两个值后,我希望在下表中相应地显示数据,而无需单击任何按钮,但在jsp中,我创建了一个按钮,以查看我是否在action类中获取所选值,但实际上,我希望它无需单击任何按钮。

使用Javascript/jQuery可以做到这一点取决于你到达动作类后想做什么

如果要导航到其他页面,请使用下面的代码

onchange
事件作为属性添加到下拉列表中

onchange="customFunction(this.value)"
在标题部分创建
customFunction

function customFunction(selectedValue){
     window.location="Action_URL?myValue="+selectedValue;
}
或者如果要返回相同的页面,请使用


希望这能有所帮助。

嗯,这里一团糟:D

首先,抛出NullPointerException是因为值未发送,而值未发送是因为它们不在表单中

您应该将它们以如下形式封装起来,以便将它们发送到
ActionSelect
操作:


事件名称:
公司名称:
解决了迷雾,但这并不能解决你的问题

有两种主要方式可以从页面联系操作:

  • 使用标准提交(正如您所做的那样):

    您可以提交一个表单及其内容,或者通过最终在querystring中传递参数来调用链接。这将创建一个请求,该请求将联系一个操作,该操作将返回一个完整的JSP,该JSP将被加载到当前页面的位置

  • 使用AJAX:

    您可以在不更改当前页面的情况下发布或获取某个操作,该操作可以返回任何内容,如JSP代码段、JSON结果、二进制结果(通过Struts2流结果)等

    然后,您可以选择如何处理返回的数据,例如,将其加载到以前为空或具有不同内容的

现在,您的问题是,您正在联系一个不是您来自的操作(无法重新呈现您所使用的整个JSP),并且您在不使用AJAX的情况下调用它,那么无论映射到
“success”
结果的对象是什么(整个JSP或JSP片段),它将被加载到您所在的JSP的位置,并且它将失败

由于您对这一点似乎很陌生,我建议您从简单的解决方案(不使用AJAX)开始,在熟悉它之后,下次尝试使用AJAX

也就是说

  • 避免在getter和setter中使用逻辑
  • 避免将非setter的方法调用为setter(
    setState
    setStatus
  • 永远把你的属性保密
  • 试着给变量命名:事件状态和公司状态的状态和状态真的很混乱;那么“状态”而不是“名称”呢(在jsp和DB中是“名称”)
  • 考虑在
    prepare()
    方法中加载selectbox内容等信息,以便在出现错误时也可以使用这些信息
  • 您并没有关闭连接(顺便说一句,最好使用更进化的东西,比如SpringJDBC,或者更好的Hibernate,或者更好的JPA,但是现在继续使用原始查询)
  • 以下是对代码的重构,以使其达到目标。我将使用
    @Getter
    @Setter
    仅用于语法糖分(它们是Lombok注释,但为了清晰起见,您会继续使用Getter和Setter):

    
    $(函数(){
    $(“#事件,#公司”)。关于('change',function(){
    $(“#我的表格”).submit();
    });
    });
    ...
    ...
    ...
    ...
    表-在此处迭代**dataForBillsJspList**
    ...
    
    public class RetrieveEvNaCoNaAction扩展了ActionSupport{
    私有静态最终长serialVersionUID=-5418233715172672477L;
    @Getter private List dataForBillsJspList=new ArrayList();
    @Getter private List events=new ArrayList();
    @Getter private List companies=new ArrayList();
    @Getter@Setter私有字符串事件=null;
    @Getter@Setter私有字符串company=null;
    @凌驾
    public void prepare()引发异常{
    连接con;
    试试{
    con=新建数据库()。获取_连接();
    //货运公司
    
    function customFunction(selectedValue){
         window.location="Action_URL?myValue="+selectedValue;
    }
    
    $("#eventName").change(function(e){
        var selectedValue = $(this).val();
        $.ajax({
            type : 'post',
            url : 'Action_URL',
            data: { myValue: selectedValue},
            success : function(data) {
               alert(data);
               console.log(data);
            }
        });
    });