I have Use Cases that require the User to be show a Warning message as opposed to an Error message. The user will be shown once and then they can proceed. My problem is since it's not a Validation error the flow goes thru and the operation is performed without displaying the message. Therefore the user performs an action, he is warned once and then let thru.
Am I missing something? I looked around but there doesn't seem to be the concept of a warning message in Spring. Thanks for your help or suggestion.
In my ignorance of Spring and Spring-MVC, I created a Messages class that contains lists of errors and messages. I store an object of this type in the request scope and reference it in my JSP somewhat like this:
<c:if test="${Messages.hasMessages}">
<c:forEach items="${Messages.messages}" var="message">
${message}<br/>
</c:forEach>
</c:if>
<c:if test="${Messages.hasErrors}">
<c:forEach items="${Messages.errors}" var="error">
${error}<br/>
</c:forEach>
</c:if>
In my actual JSP, I style it as needed and generally dump messages and errors in a <ul> list.
Related
On the website a ajax post request is send to a jsp file, that reads the body and sends back a response that is used to refresh a part of the page. In the Ajax request I can see that the data with identical names is send. However, I can not read the data. With unique names I can retrieve the data in jsp. Changing the way the data is send is not an option, because there is too much code build around it.
This code reads the form data and prints it back on the website.
<h1>Facet <c:out value="${pageContext.request.getParameter('facet')}" /></h1>
<h1>Minprice <c:out value="${pageContext.request.getParameter('minPrice')}" /></h1>
"Minprice" is printed to the screen, but "Facet" isn't.
I found it! The request class has a different method for handling multiple identical parameter names, like which is often the case with the <select> and <option> tags. It is the "getParameterValues()" method. The following code gives me the result I was looking for.
<c:forEach items="${pageContext.request.getParameterValues('facet')}" var="item">
<h1>Facet ${item}</h1>
</c:forEach>
I'm trying to get an example of passing a list from JSP to the Controller to work:
http://viralpatel.net/blogs/spring-mvc-multi-row-submit-java-list/
the problem I have with this example is that I do not get the JSP /WebContent/WEB-INF/jsp/add_contact.jsp to work. He has the line:
<c:foreach items="${contactForm.contacts}" var="contact" varstatus="status">
and i'm getting errors with the varstatus variable. From where is he getting the values for this variable? He is using it as a list row index, but from where should the values come? I get the warning in eclipse that it is a not defined variable varstatus and if i still deploy it to tomcat, then i get the error that jstl foreach tag does not support more than one variable (as i already have the contact there).
The forEach tag and attributes are case sensitive.
<c:forEach items="${contactForm.contacts}" var="contact" varStatus="status">
<c:out value="${status.index}" />: <c:out value="${contact}" />
</c:forEach>
It's possible the error messages generated by Eclipse are misleading. It's also possible the error is originating from somewhere else on the page. If this does not resolve the problem, post the full JSP and stacktrace for better understanding.
In a JSP I'm listing all the binding/validation errors together:
<ul>
<c:forEach items="${status.errorMessages}" var="error">
<li><c:out value="${error}"/></li>
</c:forEach>
</ul>
However, I have some custom behavior and would like to ignore all the "typeMismatch" errors. Is there a way to do something like the following?
<c:if test="${not error.isTypeMismatch}">
<li><c:out value="${error}"/></li>
</c:if>
Since ${error} is just a plain old String, I don't know how I could determine something like this.
Thanks for your ideas!
Since errors are just strings, I don't see a way to separate type mismatch errors from others other then checking if the error actually contains some text expected to be in type mismatch errors.
${not error.contains('[some type mismatch text]')}
I had a JSP file with a c:redirect tag that would forward along a user to another page.
<!-- Yes, I know this loop is probably unnecessary, but I'm not fluent in jsp and have determined it is not the problem. :) -->
<c:if test="${cmd.numberOfResults == 1}">
<c:forEach items="${cmd.matches}" var="someVar">
<c:redirect url="/loadThatResultInfo.html"/>
</c:forEach>
</c:if>
The old implementation of the command object is needs updating (where I come in). The way I'm doing so is by creating a generic "search result" object which contains an instance of that old object (for now). I get that instance through a property in that generic class, so my code is now this:
<c:if test="${cmd.genericSearchObject.numberOfResults == 1}">
<c:forEach items="${cmd.genericSearchObject.matches}" var="acct">
<jsp:forward page="/loadThatResultInfo.html"/> <!-- new try! -->
<c:redirect url="/loadThatResultInfo.html"/> <!-- old try... -->
<% response.sendRedirect("/loadThatResultInfo.html"); %> <! new try! -->
</c:forEach>
</c:if>
Each of those three tries all result in IllegalStateExceptions of some sort. Why does this change cause the exception, especially considering that the lines involved -- the redirect, not the changed/bound class instances -- are causing the problem?
Back-end changes were made accordingly, referencing the property within my new encompassing "generic" class to satisfy the old functionality. I know this works because all related functionality, beside what I'm writing about, works.
Research online indicates:
- I can't redirect/forward after a submission has already been submitted. Then how was I able to do it before?
- Attempt to flush an already-cleared buffer causes this. What changed that makes it cleared now as opposed to the older (first) implementation?
- The size of the page's buffer needs to be bigger. THIS is one I don't understand and would really love for the stackoverflow community to address; I can see my new class causing size changes that would need changes to be dealt with.
------- ANOTHER ANSWER! -------
First and foremost, ALWAYS SET UP THE SITUATION IN THE CODE as described by the marked answer. However... if you're stuck and don't want to do that, here's a quick fix: javascript!
<script type="text/javascript">
location='./yourPageToGoTo.html'
</script>
JSP is part of the response. You're attempting to change the response destination in a JSP instead of in a controller. If you do this halfway in a JSP, then it's too late, because the HTTP response headers may already have been sent (the response is then in committed state). This is a point of no return and an illegal state for changing the response. It's too late then. Any attempt will result in the servletcontainer to throw IllegalStateException: response already committed.
To fix this, you need to put this piece code in the very top of JSP file and pray that the response hasn't already been committed at that point (which will usually happen after writing about 2KB of data to the response, depending on the servletcontainer config). However, JSP is still the wrong place for the job, you should rather do this in the controller, before forwarding the response to the JSP (or to instruct from within the model the controller somehow to do the job, when you're using a MVC framework).
I'm trying to use OGNL to evaluate if the session is valid, in order to show some information. For that I've the following JSP
[...]
<s:if test="request.isRequestedSessionValid()">
[...] (show user name, etc)
</s:if>
But it doesn't work. I've also tried "#request.isRequestedSessionValid()","%{request.isRequestedSessionValid()}" and "{request.isRequestedSessionValid()}", but I always get an error message target java.lang.NullPointerException: target is null for method isRequestedSessionValid or [OgnlValueStack] Could not find method [#request.isRequestedSessionValid()]. What am I doing wrong?
Thanks!
Okay, now that I've had a chance to look deeper into this I am tossing out my old answer. #request won't work because that is basically the equivalent of the JSP EL expression ${requestScope.requestedSessionIdValid}, but that property isn't a request scope property, its an actual property of the HttpServletRequest.
You can do this easily with JSP EL using:
<c:if test="${pageContext.request.requestedSessionIdValid}">
...
</c:if>
I don't know that there is an equally concise way to get at this with OGNL.