我是wicket的新手。我有一个名为students2modules的表,有2个字段:Stud_Username,Module_Code,它将学生链接到模块。我想注册一名学生参加一个特定的模块。当用户选择学生时,只有学生尚未注册的模块才会出现:
package myapp.project;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.Model;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
public class AddStud2Mod extends BasePage {
private List students =new ArrayList();
private List modules=new ArrayList();
private ModalWindow message;
private InformationPanel panel;
private DropDownChoice studChoice;
private DropDownChoice moduleChoice;
public AddStud2Mod(){
super();
Form stud2mod = new Form("addstud2mod");
add(stud2mod);
try{
DB db=new DB();
String query="select Stud_Username from students;";
System.out.println(query);
db.connect();
ResultSet rs=db.execSQL(query);
while(rs.next()){
String studentUname=rs.getString("Stud_Username");
students.add(studentUname);
}
db.close();
}
catch(Exception e){
e.printStackTrace();
}
studChoice = new DropDownChoice("studentChoice",new Model(),students);
moduleChoice = new DropDownChoice("modChoice",new Model(),modules);
studChoice.add(new AjaxFormComponentUpdatingBehavior("onchange")
{
@Override
protected void onUpdate(AjaxRequestTarget target)
{
try{
DB db=new DB();
db.connect();
String query="select distinct Module_Code from modules where Module_Code NOT IN(Select Module_Code from students2modules where Stud_Username="+"'"+getUserName()+"');";
System.out.println(query);
ResultSet rs=db.execSQL(query);
while(rs.next()){
String moduleNotRegistered =rs.getString("Module_Code");
modules.add(moduleNotRegistered);
}
moduleChoice.setChoices(modules);
}
catch(Exception e){
e.printStackTrace();
}
target.addComponent(moduleChoice);
}
});
final FeedbackPanel feedback=new FeedbackPanel("msgs");
feedback.setOutputMarkupId(true);
add(feedback);
final InvalidInputIndicator codeLabel = new InvalidInputIndicator("codeLabel",moduleChoice);
codeLabel.setOutputMarkupId(true);
stud2mod.add(codeLabel);
final InvalidInputIndicator studLabel = new InvalidInputIndicator("usernameLabel",studChoice);
studLabel.setOutputMarkupId(true);
stud2mod.add(studLabel);
AjaxButton ok=new AjaxButton("confirm"){
public void onSubmit(AjaxRequestTarget target,Form form){
try{
DB db=new DB();
db.connect();
String query= "Insert into students2modules Values('"+getUserName()+"'"+",'"+moduleChoice.getDefaultModelObjectAsString()+"')";
System.out.println(query);
db.updateSQL(query);
modules.clear();
db.close();
}
catch(Exception e){
e.printStackTrace();
}
InformationPanel.add2ModuleMessage();
message.show(target);
}
protected void onError(AjaxRequestTarget target,Form form){
target.addComponent(feedback);
target.addComponent(studLabel);
target.addComponent(codeLabel);
}
};
stud2mod.add(ok);
Button cancel=new Button("cancel"){
public void onSubmit(){
AddStud2Mod lecturer=new AddStud2Mod();
setResponsePage(lecturer);
}
};
stud2mod.add(cancel);
studChoice.setRequired(false);
studChoice.setOutputMarkupId(true);
moduleChoice.setRequired(false);
moduleChoice.setOutputMarkupId(true);
stud2mod.add(moduleChoice);
stud2mod.add(studChoice);
message=new ModalWindow("InformationDialog");
add(message);
panel=new InformationPanel(message.getContentId(),message);
message.setContent(panel);
message.setCssClassName(ModalWindow.CSS_CLASS_BLUE);
message.setTitle("Important Information");
message.setResizable(false);
message.setInitialHeight(150);
message.setInitialWidth(150);
message.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
public void onClose(AjaxRequestTarget target) {
AddStud2Mod as2mod =new AddStud2Mod();
setResponsePage(as2mod);
}
});
}
private String getUserName(){
return studChoice.getDefaultModelObjectAsString();
}
}
这就是问题 - onSubmit-''中的insert语句似乎是为Module_Code插入的,无论选择了什么模块代码,我都不知道为什么。学生用户名插入正常但不是模块代码。非常感谢你的帮助和对不起的大块代码(包括在内,所以你可以阅读我所有的课程代码)。
答案 0 :(得分:3)
一些一般性的评论:你有UI逻辑(Ajax,..)和'商务'逻辑('为学生获取模块')都混淆了。考虑通过引入“服务”层来分离它们。另外,我不会像在数据模型中那样使用学生姓名。如果学生更改姓名怎么办?或模块重命名?请改用生成的ID。
使用jdbc的方式打开你的应用程序进行sql注入。 永远不会构建您的查询,从而简化用户提供的输入。为此使用预准备语句(数据库的查询缓存也会这样;)
您的实际问题:您使用的是ajax。使用Ajax,UI中的更改不会被推送到模型中。您可以将学生姓名设置为ok,因为您已将AjaxFormComponentUpdatingBehavior添加到DDC。
希望有所帮助
编辑:看看你的个人资料,我看到你在这里问了几个问题,但从未接受任何这些问题的答案。 我强烈建议您这样做,否则人们会忽略您的问题。