2013-09-24 82 views
3

我想將下拉列表的選定值保存到數據庫中。將下拉列表值保存到帶有Hibernate的Struts 2中的數據庫

首先加載了index.jsp。從index.jsp,點擊登錄URL index.jsp的話可以去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> 

Action類是:

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"; 
    } 
} 

下拉列表其實只是形式的領域之一。還有其他領域的形式。 除月份字段以外的所有值都可以輸入到數據庫中。對於月份字段,輸入的值爲空。

我認爲下拉的價值沒有被採取。

+1

什麼的日誌? User.months的映射是什麼?它是否正確地在'println'中打印了值?有沒有驗證? –

+0

沒有驗證。正在打印控制檯中的nthng。我已經如上所述更改了代碼。上面的代碼值正在輸入到數據庫中,但月份的值爲空。 –

+1

在行動中是否有一個公共二傳手?您是否已驗證請求中是否發送了「月」值,例如在您的JS /網絡控制檯中?不顯示與所述的System.out.println沿被印刷在console..But個月的值提到 –

回答

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

添加一個吸氣器和一個setter另外,所以,現在

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

:DD在動作的private Integer month成員變量,將由用戶按住所選的月份(同樣,與getter和setter)

然後,使用下面的s:select標籤在你的JSP在execute方法中,月份成員變量應該包含所選的月份。 0應該是沒有選擇,1應該是一月,等

+0

這種方法工作..我可以問,是否有可能通過使用列表做同樣的事情?不使用地圖? –

+0

我想,如果它包含自定義對象,你可以使用一個列表,你應該設置'listKey'和'listValue'在單曲屬性:select'標籤。但爲什麼你應該創建一個單獨的對象幾個月?這不是那個月的名字會很快改變:-) – mavroprovato

+0

我使用了幾個月的對象,因爲我想從數據庫中的tbl_mnth中檢索月份名稱&ID並填充s:select with months name ..但是我想要選擇的月份ID被保存到數據庫..不是所選的月份名稱..我能夠通過使用您指定的方法保存ID到數據庫..但我的問題是我可以做同樣的使用列表。 –

1

index.jsp只是使用經由形式action屬性重定向到寄存器頁

<% response.sendRedirect("registerAction.action"); %> 
register.jsp形式被映射到 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> 

該映射被改變到在代碼用於插入一個新的用於與供給months值執行動作之前應該被填充的動作類的register方法。 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

+0

我正在使用populateSelect填充下拉列表。 我還沒有使用可以準備的接口。 我haveupdated問題我目前的代碼.. –

+1

結果'「無」'是'Action.NONE'保留名稱。這意味着不應該執行任何行動結果。例如,使用其他名稱'「success」或「Action.SUCCESS」。 –

+0

ok..i如上製成的sturts.xml&Action類的變化.. –

相關問題