【发布时间】:2017-11-22 11:53:54
【问题描述】:
我正在使用 Maven、Spring 和 MySQL 做一个 java MVC 项目。
事实上,当我在“选择”表单上选择一个值以及在日历上选择一个日期时,我想显示一条短信。
我的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>
看起来像这样:
我想做的是,当我从 “Tipo de tarea” 选项中选择一个选项时,在选项下方显示一条文字:“所有任务的平均持续时间那种类型是……(和平均数)”.
另外,当我从日历中选择一个日期时,会在 "Duracion" 字段下显示一个文本,上面写着:“您实际上有 X 小时(持续时间总和)用于 THIS(选择的) 日期".
编辑更多信息
TaskController:创建任务jsp的获取和发布
/**
* 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 请求映射: 我刚刚为 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 视图中
<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>
现在我的 JSP 视图如下所示:
在阅读 jQuery 之后我想做的是从 "type" (Tipo de tarea) 和 "date" (Fecha) 中获取值更改,计算我之前描述的内容并将相应的文本替换为计算结果。
再次编辑 刚刚将此代码添加到我的 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(未找到)。
【问题讨论】:
标签: spring jsp model-view-controller