3

我想将下拉列表的选定值保存到数据库中。

首先index.jsp是加载。从,点击 的 注册 URL 的index.jsp话 可以 去。register.jspindex.jsp

struts.xml

<action name="registerAction" class="action.RegisterAction" method="populateSelect">
        <result name="success" >register.jsp</result>
     
    </action>
    <action name="register" class="action.RegisterAction" method="execute">
        <result name="success" >login.jsp</result>

    </action>

index.jsp

  <s:url id="url" action="registerAction">
</s:url>
  <s:a href="%{url}">Register</s:a>

register.jsp

   <s:form action="registerAction" method="execute">
     <s:select label="Select Date of Month" key="Month List" name="months" headerKey="0" headerValue="--Select--" list="allMonths" listKey="id" listValue="name"/>
 <s:submit value="Register"/>
 </s:form>

动作类是:

public class RegisterAction extends ActionSupport {

    String name, pwd, email, address, months;

    int phno;

    
    List<Month> allMonths = new ArrayList<Month>();
    List<User> users = new ArrayList<User>();
    UserDao udao = new UserDao();


public List<Month> getAllMonths() {
    return allMonths;
}

public void setAllMonths(List<Month> allMonths) {
    this.allMonths = allMonths;
}

public String getMonths() {
    return months;
}

public void setMonths(String months) {
    this.months = months;
}

public List<User> getUsers() {
    return users;
}

public void setUsers(List<User> users) {
    this.users = users;
}


public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getPhno() {
    return phno;
}

public void setPhno(int phno) {
    this.phno = phno;
}

public String getPwd() {
    return pwd;
}

public void setPwd(String pwd) {
    this.pwd = pwd;
}

    public RegisterAction() {
    }
    

    public String execute() throws Exception {
        User u = new User();
        u.setName(name);
        u.setEmail(email);
        u.setAddress(address);
        u.setPhno(phno);
        u.setPwd(pwd);
        System.out.println("Hi der "+months);

        u.setMonths(months);
        udao.addUser(u);
        return "success";
    }

    public String listAllUsers() {
        users = udao.getUsers();
        System.out.println("In Action, " + users);
        return "success";
    }


    public String populateSelect() {
        allMonths = udao.getMonths();
        System.out.println("In constructor " + allMonths);
        return "success";
    }
}

下拉列表实际上只是表单字段之一。表格中还有其他字段。

除月份字段外的所有值都可以输入数据库。对于月份字段,输入的值为null

我认为下拉的价值没有被采用。

4

2 回答 2

2

index.jsp只使用重定向到注册页面的代码

<% response.sendRedirect("registerAction.action"); %>

在表单中通过表单属性register.jsp映射到。动作映射应该是registerActionaction

<action name="registerAction" class="action.RegisterAction" >
  <result name="success">register.jsp</result>
</action>

<action name="register" class="action.RegisterAction" method="register">
  <result name="input">register.jsp</result>
  <result name="success">login.jsp</result>
</action>

此映射更改为register操作类的方法,该方法在您的代码中用于插入一个新的使用提供的months值,该值应在执行操作之前填充。结果input用于JSP 中的form 标记。未知,login.jsp但它将作为register操作的结果使用。表格也应该重命名

<s:form action="register">
  <s:select label="Select Date of Month" key="Month List" name="months" headerKey="0" headerValue="--Select--" list="allMonths" listKey="id" listValue="name"/>
  <s:submit value="Register"/>
</s:form>

动作代码改变

private String months;
//public getter and setter of months

public String register() throws Exception {
    User u = new User();
    u.setName(name);
    u.setEmail(email);
    u.setAddress(address);
    u.setPhno(phno);
    u.setPwd(pwd);
    System.out.println(months);

    u.setMonths(months);
    udao.addUser(u);
    return "success";
}

private List<Month> allMonths;
//public getter and setter of allMonths

假设动作类实现Preparable,最好在此处立即执行,因为如果验证(如果有)失败,则可以使用该列表。

public void prepare() throws Exception {
   //populate allMonths 
   //and set the value of months if you want it to be preselected.
}

并且该操作应扩展已实现ActionSupportexecute方法的操作。

于 2013-09-24T21:05:21.257 回答
1

我建议将months成员变量更改为Map这样的:

private Map<Integer, String> months = new HashMap<Integer, String>();

然后,Preparable在您的操作中实现接口,并使用以下内容初始化地图:

public void prepare() throws Exception {
    String[] monthNames = new DateFormatSymbols().getMonths();
    int i = 1;
    for (String monthName : monthNames) {
        months.put(i++, monthName);
    }
}

当然,你需要为months

此外,private Integer month在您的操作中添加一个成员变量,它将保存用户选择的月份(同样,使用 getter 和 setter)

然后,在您的 JSP 中使用以下s:select标记:

<s:select label="Select Date of Month" name="month" headerKey="0"
          headerValue="--Select--" list="months"/>

所以现在在你的execute方法中,月份成员变量应该保存选定的月份。0 应该是没有选择,1 应该是一月,等等。

于 2013-09-25T15:26:15.583 回答