此查询似乎在下拉选项中为Module_Code而不是值插入null

时间:2010-12-19 21:48:12

标签: java jdbc wicket

我是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插入的,无论选择了什么模块代码,我都不知道为什么。学生用户名插入正常但不是模块代码。非常感谢你的帮助和对不起的大块代码(包括在内,所以你可以阅读我所有的课程代码)。

1 个答案:

答案 0 :(得分:3)

一些一般性的评论:你有UI逻辑(Ajax,..)和'商务'逻辑('为学生获取模块')都混淆了。考虑通过引入“服务”层来分离它们。另外,我不会像在数据模型中那样使用学生姓名。如果学生更改姓名怎么办?或模块重命名?请改用生成的ID。

使用jdbc的方式打开你的应用程序进行sql注入。 永远不会构建您的查询,从而简化用户提供的输入。为此使用预准备语句(数据库的查询缓存也会这样;)

您的实际问题:您使用的是ajax。使用Ajax,UI中的更改不会被推送到模型中。您可以将学生姓名设置为ok,因为您已将AjaxFormComponentUpdatingBehavior添加到DDC。

希望有所帮助

编辑:看看你的个人资料,我看到你在这里问了几个问题,但从未接受任何这些问题的答案。 我强烈建议您这样做,否则人们会忽略您的问题。