为什么jsp页面中的多个表单导致spring混淆

时间:2017-03-20 04:53:24

标签: java spring jsp spring-mvc

我是Spring MVC的新手,我找到了让我做基本的教程的教程。但是,当我尝试在一个jsp页面中的多个表单上执行它时,它不起作用。每当我点击人体测量数据表单上的“保存”按钮时,它会显示“vitalsigns”模型属性的illegalstateexception错误。每当我点击生命体征表单上的“保存”按钮时,它会显示“anthropometricdata”模型属性的非法状态异常错误。当我有正确的请求映射时,我不明白为什么Spring会感到困惑。

我尝试在我的所有ModelAttributes中添加(“nameofmodelattribute”),但它仍然没有帮助。

虽然当我删除其他表格并仅留下人体测量数据表单时,它仍然有效。我似乎无法弄清楚这是怎么回事。

这是显示的完整错误:

HTTP Status 500 - An exception occurred processing JSP page /WEB-INF/view/itr.jsp at line 10

type Exception report

message An exception occurred processing JSP page /WEB-INF/view/itr.jsp at line 10

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/view/itr.jsp at line 10

7:  <table>
8:      <tr>
9:          <td>Height</td>
10:             <td><form:input path="height" /></td>
11:         </tr>
12:         <tr>
13:             <td>Weight</td>


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:579)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:471)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.openmrs.web.filter.JspClassLoaderFilter.doFilter(JspClassLoaderFilter.java:47)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.openmrs.module.web.filter.ForcePasswordChangeFilter.doFilter(ForcePasswordChangeFilter.java:60)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.openmrs.module.web.filter.ModuleFilterChain.doFilter(ModuleFilterChain.java:72)
    org.openmrs.module.owa.filter.OwaFilter.doFilter(OwaFilter.java:64)
    org.openmrs.module.web.filter.ModuleFilterChain.doFilter(ModuleFilterChain.java:70)
    org.openmrs.module.web.filter.ModuleFilter.doFilter(ModuleFilter.java:54)
    org.openmrs.web.filter.OpenmrsFilter.doFilterInternal(OpenmrsFilter.java:108)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:150)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:105)
    org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:105)
    org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:105)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
root cause

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'anthropometricdata' available as request attribute
    org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:168)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:188)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:154)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:141)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:132)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:116)
    org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:422)
    org.springframework.web.servlet.tags.form.InputTag.writeTagContent(InputTag.java:142)
    org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:84)
    org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:80)
    org.apache.jsp.WEB_002dINF.view.itr_jsp._jspx_meth_form_005finput_005f0(itr_jsp.java:566)
    org.apache.jsp.WEB_002dINF.view.itr_jsp._jspx_meth_form_005fform_005f0(itr_jsp.java:478)
    org.apache.jsp.WEB_002dINF.view.itr_jsp._jspService(itr_jsp.java:181)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.openmrs.web.filter.JspClassLoaderFilter.doFilter(JspClassLoaderFilter.java:47)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)
    org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.openmrs.module.web.filter.ForcePasswordChangeFilter.doFilter(ForcePasswordChangeFilter.java:60)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.openmrs.module.web.filter.ModuleFilterChain.doFilter(ModuleFilterChain.java:72)
    org.openmrs.module.owa.filter.OwaFilter.doFilter(OwaFilter.java:64)
    org.openmrs.module.web.filter.ModuleFilterChain.doFilter(ModuleFilterChain.java:70)
    org.openmrs.module.web.filter.ModuleFilter.doFilter(ModuleFilter.java:54)
    org.openmrs.web.filter.OpenmrsFilter.doFilterInternal(OpenmrsFilter.java:108)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:150)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:105)
    org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:105)
    org.openmrs.web.filter.StartupFilter.doFilter(StartupFilter.java:105)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

我的JSP文件:

<h1>Individual Treatment Record</h1>

<h3>Anthropometric Data</h3>
<form:form action="anthropometricdata.form" method="POST" modelAttribute="anthropometricdata">
    <table>
        <tr>
            <td>Height</td>
            <td><form:input path="height" /></td>
        </tr>
        <tr>
            <td>Weight</td>
            <td><form:input path="weight" /></td>
        </tr>
        <tr>
            <td>Body Mass Index</td>
            <td></td>
        </tr>
        <tr>
            <td>Waist Circumference</td>
            <td><form:input path="waistCircumference" /></td>
        </tr>
        <tr>
            <td>Hip Circumference</td>
            <td><form:input path="hipCircumference" /></td>
        </tr>
        <tr>
            <td>Waist-Hip Ratio</td>
            <td></td>
        </tr>
        <tr>
            <td>Head Circumference</td>
            <td><form:input path="headCircumference" /></td>
        </tr>
        <tr>
            <td>Chest Circumference</td>
            <td><form:input path="chestCircumference" /></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" name="action" value="Save" />
                <input type="submit" name="action" value="Cancel" />
            </td>
        </tr>
    </table>
</form:form>
<br>
<table border="1">
    <th>ID</th>
    <th>Height</th>
    <th>Weight</th>
    <th>Body Mass Index</th>
    <th>Waist Circumference</th>
    <th>Hip Circumference</th>
    <th>Waist-Hip Ratio</th>
    <th>Head Circumference</th>
    <th>Chest Circumference</th>
    <c:forEach items="${anthropometricdataList}" var="anthropometricdata">
        <tr>
            <td>${anthropometricdata.anthropometricDataId}</td>
            <td>${anthropometricdata.height}</td>
            <td>${anthropometricdata.weight}</td>
            <td>${anthropometricdata.bmi}</td>
            <td>${anthropometricdata.waistCircumference}</td>
            <td>${anthropometricdata.hipCircumference}</td>
            <td>${anthropometricdata.waistHipRatio}</td>
            <td>${anthropometricdata.headCircumference}</td>
            <td>${anthropometricdata.chestCircumference}</td>
        </tr>
    </c:forEach>
</table>

<h3>Vital Signs</h3>

<form:form action="vitalsigns.form" method="POST" modelAttribute="vitalsigns">
    <table>
        <tr>
            <td>Blood Pressure</td>
            <td><form:input path="bloodPressure" type="number"/></td>
        </tr>
        <tr>
            <td>Heart Rate</td>
            <td><form:input path="heartRate" type="number"/></td>
        </tr>
        <tr>
            <td>Respiratory Rate</td>
            <td><form:input path="respiratoryRate" type="number"/></td>
        </tr>
        <tr>
            <td>Body Temperature</td>
            <td><form:input path="bodyTemperature" type="number" /></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" name="action" value="Save" />
                <input type="submit" name="action" value="Cancel" />
            </td>
        </tr>
    </table>
</form:form>
<br>
<table border="1">
    <th>ID</th>
    <th>Blood Pressure</th>
    <th>Heart Rate</th>
    <th>Respiratory Rate</th>
    <th>Body Temperature</th>
    <c:forEach items="${vitalsignsList}" var="vitalsigns">
        <tr>
            <td>${vitalsigns.vitalSignsId}</td>
            <td>${vitalsigns.bloodPressure}</td>
            <td>${vitalsigns.heartRate}</td>
            <td>${vitalsigns.respiratoryRate}</td>
            <td>${vitalsigns.bodyTemperature}</td>
        </tr>
    </c:forEach>
</table>

<%@ include file="/WEB-INF/view/module/chitscore/template/footer.jsp" %>

我的控制器类:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.openmrs.module.chitscore.model.AnthropometricData;
import org.openmrs.module.chitscore.model.VitalSigns;
import org.openmrs.module.chitscore.service.AnthropometricDataService;
import org.openmrs.module.chitscore.service.VitalSignsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class ITRController {
    @Autowired
    private AnthropometricDataService anthropometricDataService;
    @Autowired
    private VitalSignsService vitalSignsService;

    @RequestMapping(value="/patient/itr")
    public String setupForm(Map<String, Object> map){
        AnthropometricData anthropometricData = new AnthropometricData();
        VitalSigns vitalSigns = new VitalSigns();
        map.put("anthropometricdata", anthropometricData);
        map.put("anthropometricdataList", anthropometricDataService.getAllAnthropometricData());
        map.put("vitalsigns", vitalSigns);
        map.put("vitalsignsList", vitalSignsService.getAllVitalSigns());
        return "itr";
    }

    @RequestMapping(value="/patient/anthropometricdata.form", method=RequestMethod.POST)
    public String doActions(@ModelAttribute("anthropometricdata") AnthropometricData anthropometricData, BindingResult result, @RequestParam String action, Map<String, Object> map){
        AnthropometricData anthropometricDataResult = new AnthropometricData();
        switch(action.toLowerCase()){   //only in Java7 you can put String in switch
        case "save":
            Date timestamp = new Date();
            anthropometricData.setTimestamp(timestamp);
            anthropometricDataService.add(anthropometricData);
            anthropometricDataResult = anthropometricData;
            break;          
        }

        map.put("anthropometricdata", anthropometricDataResult);
        map.put("anthropometricdataList", anthropometricDataService.getAllAnthropometricData());
        return "itr";
    }

    @RequestMapping(value="/patient/vitalsigns.form", method=RequestMethod.POST)
    public String doActions(@ModelAttribute("vitalsigns") VitalSigns vitalSigns, BindingResult result, @RequestParam String action, Map<String, Object> map){
        VitalSigns vitalSignsResult = new VitalSigns();
        switch(action.toLowerCase()){   //only in Java7 you can put String in switch
        case "save":
            Date timestamp = new Date();
            vitalSigns.setTimestamp(timestamp);
            vitalSignsService.add(vitalSigns);
            vitalSignsResult = vitalSigns;
            break;          
        }

        map.put("vitalsigns", vitalSignsResult);
        map.put("vitalsignsList", vitalSignsService.getAllVitalSigns());
        return "itr";
    }

}

1 个答案:

答案 0 :(得分:0)

首先,我要感谢所有试图提供帮助的人,但我已经找到了问题。

当我点击&#34;保存&#34;在一种形式中,它进入doActions方法,而在doActions方法中,其他模型不再是map.put,就像在setupForm方法中看到的那样。这就是我的控制器类现在所看到的:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.openmrs.module.chitscore.model.AnthropometricData;
import org.openmrs.module.chitscore.model.VitalSigns;
import org.openmrs.module.chitscore.service.AnthropometricDataService;
import org.openmrs.module.chitscore.service.VitalSignsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class ITRController {
    @Autowired
    private AnthropometricDataService anthropometricDataService;
    @Autowired
    private VitalSignsService vitalSignsService;

    AnthropometricData anthropometricData = new AnthropometricData();
    VitalSigns vitalSigns = new VitalSigns();

    @RequestMapping(value="/patient/itr")
    public String setupForm(Map<String, Object> map){
        map.put("anthropometricdata", anthropometricData);
        map.put("anthropometricdataList", anthropometricDataService.getAllAnthropometricData());
        map.put("vitalsigns", vitalSigns);
        map.put("vitalsignsList", vitalSignsService.getAllVitalSigns());
    }

    @RequestMapping(value="/patient/anthropometricdata.form", method=RequestMethod.POST)
    public String doActions(@ModelAttribute("anthropometricdata") AnthropometricData anthropometricData, BindingResult result, @RequestParam String action, Map<String, Object> map){
        AnthropometricData anthropometricDataResult = new AnthropometricData();
        switch(action.toLowerCase()){   //only in Java7 you can put String in switch
        case "save":
            Date timestamp = new Date();
            anthropometricData.setTimestamp(timestamp);
            anthropometricDataService.add(anthropometricData);
            anthropometricDataResult = anthropometricData;
            break;          
        }

        map.put("anthropometricdata", anthropometricDataResult);
        map.put("anthropometricdataList", anthropometricDataService.getAllAnthropometricData());
        map.put("vitalsigns", vitalSigns);
        map.put("vitalsignsList", vitalSignsService.getAllVitalSigns());
    }

    @RequestMapping(value="/patient/vitalsigns.form", method=RequestMethod.POST)
    public String doActions(@ModelAttribute("vitalsigns") VitalSigns vitalSigns, BindingResult result, @RequestParam String action, Map<String, Object> map){
        VitalSigns vitalSignsResult = new VitalSigns();
        switch(action.toLowerCase()){   //only in Java7 you can put String in switch
        case "save":
            Date timestamp = new Date();
            vitalSigns.setTimestamp(timestamp);
            vitalSignsService.add(vitalSigns);
            vitalSignsResult = vitalSigns;
            break;          
        }

        map.put("vitalsigns", vitalSignsResult);
        map.put("vitalsignsList", vitalSignsService.getAllVitalSigns());
        map.put("anthropometricdata", anthropometricData);
        map.put("anthropometricdataList", anthropometricDataService.getAllAnthropometricData());
    }