当前位置: 首页 > 知识库问答 >
问题:

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

易和怡
2023-03-14

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

我曾尝试使用listkey、name和id调用select标记,但都不起作用。下面是我的JSP代码:

<div>
    <div class="invoicetext1">Event Name :</div>
        &nbsp;&nbsp;
        <s:select name="dp.eventState" 
                  list="%{state}" 
                 class="billlistbox1" 
                    id="eventName" />   
        <div>
            <s:select name="dp.companyState" 
                     class="billlistbox2"
                   listKey="companyState" 
                      list="%{status}">
            </s:select>
        </div>
        <div class="invoicetext2">Company Name :</div>
        <div class="clear"></div>
    </div>
    <s:form action="ActionSelect">
        <s:submit value=" Click Here"/>
    </s:form>
<div>

用于加载动态下拉列表的操作类:

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//
                }
}

加载动态下拉列表后,现在我试图通过S.O.P调用action类中的选定值,但它给出了空指针异常。以下是我的POJO课程:

package com.ca.pojo;

public class Dropdown 
{
    private String eventState;
    private String companyState;
    public Dropdown() {
        // TODO Auto-generated constructor stub
    }
    public String getEventState() {
        return eventState;
    }
    public void setEventState(String eventState) {
        this.eventState = eventState;
    }
    public String getCompanyState() {
        return companyState;
    }
    public void setCompanyState(String companyState) {
        this.companyState = companyState;
    }


}  

下面是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类中获得所选值,但实际上我想要它而无需单击任何按钮。

共有2个答案

郭胤
2023-03-14

使用Javascript/jQuery您可以做到这一点,这取决于您在达到操作类后想要做什么。

如果您想导航到另一个页面,请使用下面的代码。

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

onchange="customFunction(this.value)"

在标题部分创建CustFunction

function customFunction(selectedValue){
     window.location="Action_URL?myValue="+selectedValue;
}

或者如果您想返回相同的页面,请使用jQuery ajax,

$("#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);
        }
    });
});

希望这有帮助。

卫逸春
2023-03-14

嗯,这里一团糟:D

首先,引发NullPointerException是因为没有发送值,而没有发送值是因为它们不在表单中。

您应该将它们包含在这样的表单中,以便将它们发送到ActionSelect操作:

<s:form action="ActionSelect">
    <div class="invoicetext1">Event Name :</div>
        &nbsp;&nbsp;
        <s:select name="dp.eventState" 
                  list="%{state}" 
                 class="billlistbox1" 
                    id="eventName" />   
        <div>
            <s:select name="dp.companyState" 
                     class="billlistbox2"
                   listKey="companyState" 
                      list="%{status}">
            </s:select>
        </div>
        <div class="invoicetext2">Company Name :</div>
        <div class="clear"></div>
    </div>
    <s:submit value=" Click Here"/>
</s:form>

解决了谜团,但这并不能解决你的问题。

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

>

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

使用AJAX:

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

然后,您可以选择如何处理返回的数据,例如将其加载到<代码>

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

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

也就是说,

  1. 避免在getter和setter中加入逻辑

以下是对代码的重构,以使其达到目标。我将使用Getter和Setter仅用于语法糖(它们是龙目注释,但您一直在使用Getter和Setter,这只是为了清楚起见):

<head>
    <script>
        $(function(){
            $("#event, #company").on('change',function(){
                $("#myForm").submit();
            });
        });
    </script>
</head>
<body>
    <form id="myForm">
        <div>
        ...
            <s:select id="event"   name="event"   list="events"    />   
        ...
            <s:select id="company" name="company" list="companies" />   
        ...
        </div>
    </form>

    <div> 
        ...
        Table - iterate **dataForBillsJspList** here    
        ...
    </div>

</body>
public class RetrieveEvNaCoNaAction extends ActionSupport {

    private static final long serialVersionUID = -5418233715172672477L;

    @Getter         private List<Event>     dataForBillsJspList     = new ArrayList<Event>();

    @Getter         private List<String>    events                  = new ArrayList<String>();
    @Getter         private List<String>    companies               = new ArrayList<String>();

    @Getter @Setter private String          event                   = null;
    @Getter @Setter private String          company                 = null;




    @Override
    public void prepare() throws Exception {        
        Connection con;
        try {           
            con = new Database().Get_Connection();

            // load companies
            PreparedStatement ps = con.prepareStatement("SELECT DISTINCT company_name FROM event");
            ResultSet rs = ps.executeQuery();
            while (rs.next()) { companies.add(rs.getString("company_name")); }

            // load events
            ps = con.prepareStatement("SELECT DISTINCT event_name FROM event");
            rs = ps.executeQuery();
            while (rs.next()) { events.add(rs.getString("event_name")); }

        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            con.close();
        }
    }

    @Override
    public String execute() {
        Connection con;
        try {           
            con = new Database().Get_Connection();

            // load the table. The first time the table is loaded completely
            String sql = "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";
            String where = "";

            // if instead this action has been called from the JSP page, 
            // the result is filtered on event and company:
            if (event!=null && company!=null) { 
                where = " WHERE event_name = ? AND company_name = ?"; 
            }

            // load companies
            PreparedStatement ps = con.prepareStatement(sql + where);
            if (where.length()>0) { 
                ps.setString(1,event); 
                ps.setString(2,company); 
            }
            ResultSet rs = ps.executeQuery();
            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")));
            }

        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            con.close();
        }

        return SUCCESS;
    }

}

这是一个启动示例,但应该有效。

接下来的步骤是:

  1. 创建一个带有id和描述的POJO,在选择框中显示描述,但发送id
  2. 使用标头值(“请选择一个事件”...)并在操作中处理条件WHERE(仅限公司,仅限事件,两者)
  3. 激情

祝你好运

 类似资料:
  • 下面给出了一段表示下拉列表的代码。我需要在此下拉列表中选择日期值,由<代码> 以下方法无效 1。)使用“按导入组织选择”选择此值。openqa。硒。支持用户界面。选择 控制台显示: 元素应该是“选择”,但应该是“选项” 2.)首先单击下拉列表以显示要选择的选项,然后单击该选项。 控制台显示: 调试元素缺少可访问的名称:id:类型,标记名:选择,类名:文本输入ng原始ng未触及ng有效ng范围 3.

  • 问题内容: 下面给出的是一段代码,表示下拉列表。我需要在此下拉列表中选择 日期 值,表示为 遵循方法无效。 1.)使用“ 选择” 通过导入 org.openqa.selenium.support.ui.Select* 选择此值 * 控制台显示: 元素应该是“选择”但是“选项” 2.)首先单击下拉菜单以显示要选择的选项,然后单击该选项。 控制台显示: DEBUG元素缺少可访问的名称:id:类型,ta

  • 我想使用硒从选择字段中选择一个选项 HTML格式如下: 我尝试了以下方法: 我收到了这个错误: 硒。常见的例外情况。NoSuchElementException:消息:没有这样的元素:无法定位元素:{“方法”:“xpath”,“选择器”:”//*[@id=“Enable”]/option[value=“0”]}

  • 问题内容: react-bootstrap站点中的示例代码显示以下内容。我需要使用数组来驱动选项,但是在查找将要编译的示例时遇到了麻烦。 问题答案: 您可以从这两个功能开始。第一个将基于传递到页面的道具动态创建您的选择选项。如果将它们映射到状态,则选择将自行重新创建。 然后,您将在render内部拥有此代码块。您将传递一个对onChange道具的函数引用,每次调用onChange时,所选对象将自动

  • 主要内容:1. Java List 示例,2. OGNL List 实例在Struts2中,HTML下拉框可以通过<s:select>标签呈现。要自动选择一个下拉框的默认值,只是声明<s:select>值”属性标记,并设置相应的默认值。 这里创建一个Web工程:strut2autoselectdropdown,来演示在多个复选框如何设置的默认值,整个项目的结构如下图所示: 1. Java List 示例 Java列表生成选择选项的下拉框。 <s:select>标记呈现

  • 我创建了一个动态下拉列表。我想访问从动态创建的下拉列表中选择的值。我的超文本标记语言文件 我的js文件: 单击按钮,就会调用js文件中存在的doThis()函数。在该函数中,我想访问在第二个(城市列表)下拉列表中选择的值。