I don't know how to fix it, but i would never use JSP for this. I would suggest you use FreeMarker or Velocity which will be very easy to get working and won't break across different containers/versions. For example, for FreeMarker (which will be in the classpath already), I use this:
public static void process(ServletContext context, String template, Map<String, Object> values, Writer writer) throws IOException, TemplateException { Configuration cfg = new Configuration(); cfg.setDirectoryForTemplateLoading(new File(context.getRealPath("/templates"))); cfg.setObjectWrapper(new DefaultObjectWrapper()); BeansWrapper wrapper = BeansWrapper.getDefaultInstance(); TemplateHashModel staticModels = wrapper.getStaticModels(); Template temp = cfg.getTemplate(template); temp.process(values, writer); writer.flush(); } //also JSP has not way to deal with empty spaces and such musachy On Thu, Feb 12, 2009 at 1:49 PM, Ignacio de Córdoba <icord...@skios.es> wrote: > > Hi there, > I had a working solution that was fine for struts1 and doesn't work with > struts2. > The scenario is evey time the application needs to send a mail from an > action (for example, when a user signs up, the system sends him a welcome > mail) > > My solution got the JSP the following way: > > public String getResourceAsString(String path) throws ServletException, > IOException > { > HttpServletRequest request = > org.apache.struts2.ServletActionContext.getRequest(); > HttpServletResponse response = > ServletActionContext.getResponse(); > try > { > ByteArrayOutputStream out = new > ByteArrayOutputStream(); > RequestDispatcher dispatcher = > request.getRequestDispatcher(path); > RedirectingServletResponse dummyResponse = new > RedirectingServletResponse(response, out); > dispatcher.include(request, dummyResponse); > return out.toString(); > } catch (NullPointerException e) > { > return "<p>No such template: " + path + "</p>"; > } > } > > (RedirectingServletResponse class just extends HttpServletResponseWrapper > and captures output to a ByteArrayOutputStream) > > > The JSP needs a small scriptlet at its end: > <% out.flush(); %> > > Without it, the mail is sent blank as the JSP is not rendered to HTML/text > as the request has not ended (I use the current thread request because: 1) I > don't know how to create a brand new request/response 2) This way I can use > all request parameters, attributes... in the mail sent and so not use just > plain HTML but real JSP. > > The problem now is that struts2 shows the following exception: > > java.io.IOException: Stream closed > > > org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:204) > > org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115) > org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:173) > > org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:956) > > org.apache.jasper.runtime.PageContextImpl.include(PageContextImpl.java:609) > > org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:123) > > org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) > > com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:361) > > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:265) > > com.servengine.struts2.InjectEJBInterceptor.intercept(InjectEJBInterceptor.java:89) > > com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) > > org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) > > org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468) > > org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395) > > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206 > > Any ideas on this... or better... any directions on how can I instanciate a > "fake" response not based on current struts2 Action ServletResponse object > (and so flush() or close() will not affect it). > > Thanks, > Ignacio > -- > View this message in context: > http://www.nabble.com/How-to-render-a-JSP-Struts2-action-to-send-it-%28mail%2C-...%29-tp21982445p21982445.html > Sent from the Struts - User mailing list archive at Nabble.com. > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: user-unsubscr...@struts.apache.org > For additional commands, e-mail: user-h...@struts.apache.org > > -- "Hey you! Would you help me to carry the stone?" Pink Floyd --------------------------------------------------------------------- To unsubscribe, e-mail: user-unsubscr...@struts.apache.org For additional commands, e-mail: user-h...@struts.apache.org