2010-12-19 1 views
0

나는 개찰구를 처음 사용합니다. 나는 2 개의 필드를 가진 students2modules라는 테이블을 가지고 있습니다 : Stud_Username, 학생들을 모듈들과 연결시키는 Module_Code. 특정 모듈을 선택하여 학생을 등록하고 싶습니다. 사용자가 학생을 마련한다 위해 학생이 아직 등록되지 않은 모듈 만 선택하면 다음과 같습니다 이 쿼리는 드롭 다운 메뉴에서 값 대신 Module_Code에 null을 삽입하는 것으로 보입니다.

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-에 삽입 문입니다'더 Module_Code 위해 삽입받을 것으로 보인다 어떤 모듈 코드가 선택되었는지와 나는 이유를 모른다. 학생 이름은 ok이지만 모듈 코드는 삽입되지 않았습니다. 많은 도움을 주셔서 감사 드리며 큰 코드 덩어리를 유감스럽게 생각합니다 (클래스에 대한 모든 코드를 읽을 수 있도록 포함되어 있습니다).

+0

안녕하세요. 측면 질문 : 당신은 timtabling 관리 시스템을 만들기 위해 노력하고 있습니까? yahoo dot에서 peathal에 연락하여 기존 소프트웨어 또는 Java 프레임 워크 (wicket 대 vaadin)를 선택하는 등의 경험과 정보를 공유하십시오. – Karussell

답변

3

몇 가지 일반적인 발언 : UI 로직 (Ajax, ..)과 'bussiness'로직 ('학생용 모듈 확보')이 모두 섞여 있습니다. '서비스'계층을 도입하여 그들을 분리하는 것을 고려하십시오. 또한, 나는 데이터 모델에서와 같이 학생 이름을 사용하지 않을 것입니다. 학생이 이름을 변경하면 어떻게됩니까? 또는 모듈 이름이 바뀌 었습니까? 생성 된 ID를 대신 사용하십시오.

jdbc를 사용하는 방법은 SQL 인젝션을위한 앱을 엽니 다. 절대 사용자 제공 입력을 concatinating 쿼리를 빌드하십시오. 준비된 문을 사용하십시오 (DB의 쿼리 캐시도 이와 같습니다;)

실제 문제 : ajax를 사용합니다. Ajax를 사용하면 UI의 변경 사항이 모델에 적용되지 않습니다. DjD에 AjaxFormComponentUpdatingBehavior가 추가되어 학생 이름을 알게되었습니다.

편집하는 데 도움이

희망 : 프로필을보고, 난 당신이 여기에 몇 가지 질문을하지만, 이들의 대한 대답을 받아 본 적이없는 것을 알 수있다. 을 강력히 추천합니다. 그렇지 않으면 사람들이 귀하의 질문을 무시할 것입니다.

+0

3 개의 upvotes를 제공하고 싶습니다. 세 단락), 아아, 나는 할 수 없다. OP가 이것을 알지 못하는 경우를 대비하여 SQL 주입에 관해서는 http://xkcd.com/327/ 및 http://bobby-tables.com/ –

+0

+2 @ user277846 중요 : 나는 강력히 권하고 싶습니다. " – Karussell

+0

바보 같은 질문이지만 받아들이는 버튼은 어디입니까 ..... –

관련 문제