Intro
I am rendering a chart to the output stream. Instead of streaming it directly to the response.out, I create a ChartResult , and let webwork do the chaining for me.
I generate the chart in one class, and I render it out in another class, efftectively decoupling the view from the actions. You can easily render it out to file or some view other than a web response.out if you wish.
Configuration
xwork.xml -result-types definitions
<result-types>
<result-type name="chart" class="myapp.webwork.extensions.chartResult"/>
</result-types>
xwork.xml -action definitions
<action name="viewModerationChart" class="myapp.webwork.actions.ViewModerationChartAction">
<result name="success" type="chart">
<param name="width">400</param>
<param name="height">300</param>
</result>
</action>
Source Codes
My result class search for a "chart" in the ValueStack and renders it out...
public class ChartResult implements Result{
private int width;
private int height;
public void execute(ActionInvocation invocation)throws Exception{
JFreeChart chart = (JFreeChart)invocation.getStack().findValue("chart");
HttpServeletResponse response = ServeletActionContext.getResponse();
OutputStream os = response.getOutputStream();
ChartUtilities.writeChartAsPNG(os,chart,width,height);
os.flush();
}
public void setHeight(int height){
this.height=height;
}
public void setWidth(int width){
this.width=width;
}
}
public class ViewModerationChartAction extends ActionSupport{
private JFreeChart chart;
public String execute() throws Exception{
//chart creation logic ...
XYSeries dataSeries = new XYSeries(new Integer(1));
for(int i=0;i<=100;i++){
dataSeries.add(i,RandomUtils.nextInt());
}
XYSeriesCollection xyDataset = new XYSeriesCollection(dataSeries);
ValueAxis xAxis = new NumberAxis("Raw Marks");
ValueAxis yAxis = new NumberXxis("Moderated Marks");
chart = new JFreeChart(
"Moderation Function",
JFreeChart.DEFAULT_TITLE_FONT,
new XYPlot(
xyDataset,
xAxis,
yXis,
new
StandardXYItemRenderer(StandardXYItemRender.LINES),
false
);
...
)
}
public JFreeChart getChart(){
return chart;
}
}