【问题标题】:The best way for Servlet and JSP communicationServlet与JSP通信的最佳方式
【发布时间】:2015-11-26 14:41:45
【问题描述】:

以下场景:

我的Servlet 中有一个java.sql.ResultSet rs。现在我想做一个图表(使用纪元https://fastly.github.io/epoch/getting-started/)。

图表js需要数据格式如下:

var data = [ { label: 'Layer 1', values: [ {x: 0, y: 0}, {x: 1, y: 1}, {x: 2, y: 2} ] }, { label: 'Layer 2', values: [ {x: 0, y: 0}, {x: 1, y: 1}, {x: 2, y: 4} ] } ];

现在,我的ResultSet 看起来像这样:

x,y

x,y

...

ServletJSP之间的通信应该如何?我应该只是将ResultSetobejct 发送到JSP 并在那里转换它还是应该在Servlet 中转换它?

【问题讨论】:

    标签: java html jsp servlets epoch.js


    【解决方案1】:

    我至少会将ResultSet 中的数据提取到Collection(例如List)并在JSP 中使用(使用JSTL)。

    但如果这是一个选项,我会认真考虑完全放弃 JSP 并将 servlet 重新实现为您从客户端上的 Javascript 调用的 REST 服务(并直接从 servlet 以 JSON 的形式返回数据)。

    编辑:要扩展第二个选项,您可以将数据转换为 JSON 字符串(手动或使用 Jackson 之类的库 - see here for an example),然后将该字符串放入 servlet 响应中。

    然后您可以从 Javascript 调用 servlet。我不知道您使用的是什么框架,但您可以使用几行 jquery 来完成(请参阅 jquery.get()

    【讨论】:

    • 你能多解释一下第二个选项吗?
    【解决方案2】:

    在我看来,Servlet 永远不应该引用 ResultSet。您应该将此逻辑封装到可以测试、模拟、拦截等的服务中。

    例如

    public class Series {
        private String label;
        private List<Point> points;
    
        // getters and setters
    }
    
    public class Point {
        private double x;
        private double y;
    
        // getters and setters
    }
    
    public interface ChartService {
        List<Series> getAverageRainfall(Date from, Date to);
    }
    
    public class ChartServiceImpl implements ChartService {
        public List<Series> getAverageRainfall(Date from, Date to) {
            // here is where you might reference java.sql.ResultSet
        }
    }
    

    这可以很容易地变成一个 http 端点,它使用 spring 或类似的方法返回 json,这意味着您实际上不需要自定义 servlet。

    【讨论】:

      猜你喜欢
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 2017-09-02
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多