2017-11-22 9 views
1

Maven、Spring、およびMySQLを使用してJava MVCプロジェクトを行っています。Spring MVC JSPビューでAjax呼び出しを実装する方法

実際、「選択」フォームで値を選択したときや、カレンダーで日付を選択したときに、テキストメッセージを表示したいとします。

私はこのようになります私のJSPビューに次のコード(これは質問のコアのみである)

 <div class="well lead">Formulario De Registro De Tarea</div> 
    <form:form method="POST" modelAttribute="task" class="form-horizontal"> 
     <form:input type="hidden" path="id" id="id"/> 

     <div class="row"> 
      <div class="form-group col-md-12"> 
       <label class="col-md-3 control-lable" for="type">Tipo de tarea</label> 
       <div class="col-md-7"> 
        <select id="type" name="type"> 
         <c:forEach var="item" items="${typesList}"> 
          <option value="${item.type}">${item.type}</option> 
         </c:forEach> 
        </select> 
       </div> 
      </div> 
     </div> 


     <div class="row"> 
      <div class="form-group col-md-12"> 
       <label class="col-md-3 control-lable" for="date">Fecha</label> 
       <div class="col-md-7"> 
        <form:input type="text" path="date" id="datepicker" style="width:100px" class="form-control input-sm"/> 
        <div class="has-error"> 
         <c:if test="${fechaFestivo != null}"> 
          <p> ${fechaFestivo}</p> 
         </c:if> 
         <form:errors path="date" class="help-inline"/> 
        </div> 
       </div> 
      </div> 
     </div> 

     <div class="row"> 
      <div class="form-group col-md-12"> 
       <label class="col-md-3 control-lable" for="duration">Duración (horas)</label> 
       <div class="col-md-7"> 
        <form:input type="text" path="duration" id="duration" style="width:60px" class="form-control input-sm" /> 
        <div class="has-error"> 
         <c:if test="${duracionMaxima != null}"> 
          <p> ${duracionMaxima}</p> 
         </c:if> 
         <form:errors path="duration" class="help-inline"/> 
        </div> 
       </div> 
      </div> 
     </div> 

あります

enter image description here

enter image description here

何を私はそれを選択してから選択するときにしたいと思います"Tipo de tarea"、選択の下にテキストを表示:"そのタイプのすべてのタスクの平均所要時間は...(平均数)"です。また

、私は言って「Duracion」フィールドの下にテキストを表示し、カレンダーから日付を選択:「あなたは実際にはこのためのX時間(時間の合計)(厳選された)日付を持っています」。より多くの情報を

EDITING

TaskController:

/** 
* This method will provide the medium to add a new task. 
*/ 
@RequestMapping(value = { "/newtask" }, method = RequestMethod.GET) 
public String newTask(ModelMap model) { 
    Task task = new Task(); 
    typesService.loadTypes(); 

    Collection<Types> typesList = typesService.findAllTypes(); 
    model.addAttribute("task", task); 
    model.addAttribute("typesList", typesList); 
    model.addAttribute("edit", false); 
    model.addAttribute("loggedinuser", getPrincipal()); 
    return "task/register"; 
} 

/** 
* This method will be called on form submission, handling POST request for 
* saving task in database. It also validates the task input 
*/ 
@RequestMapping(value = { "/newtask" }, method = RequestMethod.POST) 
public String saveTask(@Valid Task task, BindingResult result, 
     ModelMap model) { 

    Collection<Task> dayTasks = taskService.findTasksDateUserType(task.getDate(), task.getDate(), getPrincipalUser().getId(), null); 
    Double tasksDuration = taskService.getTasksDuration(dayTasks); 

    if(task.getDuration()+tasksDuration>12.0) { 
     ObjectError error = new ObjectError("duracionMaxima", "No se pueden incurrir más de 12 horas un mismo día"); 
     result.addError(error); 
    } 

    if(festivoService.isFestivo(task.getDate())) { 
     ObjectError error = new ObjectError("fechaFestivo", "La fecha de la tarea es un día festivo"); 
     result.addError(error); 
    } 

    if (result.hasErrors()) { 
     Collection<Types> typesList = typesService.findAllTypes(); 
     //List<TaskType> typesList = new ArrayList<TaskType>(Arrays.asList(TaskType.values())); 
     model.addAttribute("typesList", typesList); 
     model.addAttribute("loggedinuser", getPrincipal()); 
     for(ObjectError o: result.getAllErrors()) { 
      System.out.println(o.getObjectName()); 
      if(o.getObjectName().equals("fechaFestivo")) { 
       model.addAttribute("fechaFestivo", "La fecha de la tarea es un día festivo"); 
      } 
      if(o.getObjectName().equals("duracionMaxima")) { 
       model.addAttribute("duracionMaxima", "No se pueden incurrir más de 12 horas un mismo día"); 
      } 
     } 
     return "task/register"; 
    } 

    if(task.getDate().after(new Date())){ 
     FieldError dateError =new FieldError("task","date",messageSource.getMessage("date.before", new String[]{}, Locale.getDefault())); 
     result.addError(dateError); 

     Collection<Types> typesList = typesService.findAllTypes(); 
     model.addAttribute("typesList", typesList); 
     model.addAttribute("loggedinuser", getPrincipal()); 
     return "task/register"; 
    } 

    User user = getPrincipalUser(); 
    taskService.save(task,user); 

    model.addAttribute("success", user.getName() + " ha registrado la tarea"+ task.getId() + " correctamente"); 
    model.addAttribute("loggedinuser", getPrincipal()); 
    //return "success"; 
    return "task/registerSuccess"; 
} 

AJAX RequestMappingを取得し、作成したタスクのjspのポスト:AJAXは

を呼び出すためは は、私はちょうどそれらの方法を行っています
@RequestMapping(value= {"/ajax/type-{id}"}) 
public Double ajaxType(@PathVariable Integer typeId) { 
    return typesService.getAvgDailyEffort(typeId); 
} 

@RequestMapping(value= {"/ajax/date-{date}"}) 
public Double ajaxDate(@PathVariable String date) { 
    Double result = 0.; 
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
    try { 
     Date dateF = formatter.parse(date); 
     Collection<Task> tasks = taskService.findTasksDateUserType(dateF, dateF, getPrincipalUser().getId(), null); 
     result = taskService.getTasksDuration(tasks); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 

また、私は今私のJSPビューは次のようになります私のJSPビュー

 <div class="row"> 
      <div class="form-group col-md-12"> 
       <label class="col-md-3 control-lable"></label> 
       <div class="col-md-7"> 
        <p id="avg"> Media de horas del tipo de tarea</p> 
       </div> 
      </div> 
     </div> 


     <div class="row"> 
      <div class="form-group col-md-12"> 
      <label class="col-md-3 control-lable"></label> 
       <div class="col-md-7"> 
        <p id="durationday">Horas incurridas en la fecha</p> 
       </div> 
      </div> 
     </div> 

にこれを追加しました:

enter image description here

それが値を取得することですjQueryの約読んだ後、私がやりたい何か「タイプ」(Tipo de tarea)と「日付」(Fecha)が変更された場合は、先に説明したものを計算し、対応するテキストを計算結果に置き換えます。

EDIT AGAIN はちょうど私のjspヘッド(jqueryのスクリプト)

$(document).ready(function(){ 
    $("#type").change(function(){ 
     $('#avg').load('/ajax-type', 
       "type="+$('#type').find('option').val()) 
    }); 
    $("#datepicker").change(function(){ 
     $('#durationday').load('/ajax-date', 
       "date="+$('#datepicker').val()) 
    }); 
}); 

にこのコードを追加したとする私のコントローラメソッドを変更:

@RequestMapping(value= {"/ajax-type"}) 
public @ResponseBody String ajaxType(@RequestParam("type") String type) { 
    Collection<Types> types = typesService.findAllTypes(); 
    int typeId = 0; 
    for(Types t: types) { 
     if(t.getType().equals(type)) { 
      typeId = t.getId(); 
     } 
    } 
    double avgDailyEffort = typesService.getAvgDailyEffort(typeId); 
    return "Media de horas del tipo de tarea: " + avgDailyEffort; 
} 

@RequestMapping(value= {"/ajax-date"}) 
public @ResponseBody String ajaxDate(@RequestParam("date") String date) { 
    Double tasksDuration = 0.; 
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
    try { 
     Date dateF = formatter.parse(date); 
     Collection<Task> tasks = taskService.findTasksDateUserType(dateF, dateF, getPrincipalUser().getId(), null); 
     tasksDuration = taskService.getTasksDuration(tasks); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    return "Horas incurridas en la fecha: " + tasksDuration; 
} 

しかし、私はGET 404を取得しています私が両方のフィールドに変更を加えると、(見つからない)

答えて

0

javascriptなどのクライアント側のテクノロジを使用する必要があります。 JQueryと呼ばれる優れたjavascriptライブラリには、ajax呼び出しを行うための優れた事前構築関数がありますが、いくつかの研究を行い、試してみる必要があります。あなたが立ち往生した場合、私はあなたがそれを使用することに決めた場合、Javascript(JQuery)に関する特定の質問をする必要があると思います。以下は助けることがあります。 Getting started with JQueryJQuery ajax api

余分な情報では、まず@RequestMapping(value= {"/ajax/type/{id}"})@RequestMapping(value= {"/ajax/type-{id}"})を変更、これは(日付のための同じを)あなたはパス変数を使用できるようになります。リクエストマッピングの後でメソッド宣言の前に直接@ResponseBodyを追加する必要があります。したがって、springは値を返すことを知っています。

+0

私はそれを見て、その答えに感謝します! –

+0

あなたの答えに書いたすべての情報を読んだら、私は自分が望むものを知っていると思うが、私はそれを自分でやることはできない(またはチュートリアルに従う。 PHPでオブジェクトを削除または変更すること)。私はちょうどMySQL DBに挿入された値でクエリを作成し、jQueryを使用して入力の下に結果を出力したいと思います。 –

+0

必要な値/オブジェクトを返すajaxの呼び出しのために、コントローラにいくつかの特定のマッピングを設定する必要があります。 '@RequestMapping(" ajax ")'などあなたの現在のコントローラを投稿することができれば、あなたのサーバ側のコードを見ておくと便利かもしれません。 – craigwor

関連する問題