【问题标题】:Save drop-down list value to database in Struts 2 with Hibernate使用 Hibernate 将下拉列表值保存到 Struts 2 中的数据库
【发布时间】:2013-09-30 03:13:37
【问题描述】:

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

首先加载index.jsp。从index.jsp,点击index.jsp的注册URL的话可以到register.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。

我认为下拉的值没有被取走。

【问题讨论】:

  • 日志中有什么? User.months 的映射是什么?它是否在您的println 中正确打印值?是否有任何验证?
  • 没有验证。 nthng 正在控制台中打印。我已经按照上面的说明更改了代码。上面的代码值正在被输入到数据库中,但是月份的值是空的。
  • 动作中有months 的公共设置器吗?您是否验证了请求中发送了 months 值,例如,在您的 JS/网络控制台中?
  • "Hi der" 与 System.out.println 一起在控制台中打印..但不显示月份的值。
  • 您需要在 github 或类似网站上提供 [SSCCE](sscce.org) 才能查看。请同时验证请求中发送的内容。

标签: java hibernate jsp validation struts2


【解决方案1】:

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

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

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

<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 中的表单标记。 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.
}

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

【讨论】:

  • 我正在使用 populateSelect 来填充下拉列表。我没有使用可准备的界面。我已经用我当前的代码更新了这个问题..
  • 结果 "none" 是 Action.NONE 的保留名称。这意味着不应执行任何操作结果。例如,使用另一个名称 "success" 或 Action.SUCCESS。
  • 月份字段值仍然为空
  • 你被注释为 getter 和 setter,所以如果你有两者,它应该填充它。
  • 是的。应该检索值月份..不要不知道为什么不检索它..
【解决方案2】:

我建议将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添加一个getter和一个setter

另外,在您的操作中添加一个 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 应该是一月,等等。

【讨论】:

  • 这种方法有效..请问是否可以通过使用列表来做同样的事情?不使用地图?
  • 如果列表包含自定义对象,我认为您可以使用列表,并且您应该在s:select 标签中设置listKey 和listValue 属性。但是为什么要创建一个单独的对象几个月呢?并不是说月份名称很快就会改变:-)
  • 我使用了月份对象,因为我想从数据库中的 tbl_mnth 检索月份名称和 id 并使用月份名称填充 s:select ..但我希望将所选月份 id 保存到数据库中。 .不是选定的月份名称..我可以使用您指定的方法将ID保存到数据库中..但我的问题是我可以使用列表来做同样的事情。
  • 那么,哪些列表不能用来获取月份呢?
  • 你可以使用列表,s:select的初始标记中的错误是你不应该添加key属性。
猜你喜欢
  • 2013-09-26
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多