【问题标题】:Avoiding html in servlet避免在 servlet 中使用 html
【发布时间】:2012-12-07 14:15:28
【问题描述】:

我在一个 jsp 页面上,我正在对一个 servlet 进行 ajax 调用,作为回报,它提供了要在页面上显示的完整 html 代码。它工作正常,但在 servlet 文件中看起来杂乱无章,有多个 printWriter.write(...) 行,其中包含 html 代码。由于我必须通过 servlet 创建大型 html 代码,因此很难维护。有没有其他合适/更好的方法来做到这一点?我在 servlet 中结合了编写 html 行和逻辑,很难将它们分开。

jsp页面中的ajax调用:

$.ajax({
    type: 'POST',
    url: 'myServlet',
    data: requestData,
    dataType: "text",
}).done(function(responseData) {
    $(divId).html(responseData);
});

servlet 类的一些代码:

.....
String username = user.getName();
if (username != null && !username.trim().isEmpty())
    username = username.substring(0, username.indexOf(" "));
else
    username = "";
printWriter.write("<span id=\"username_"+i+"\" style=\"display: none;\">"+ username +"</span>");
printWriter.write("<form action=\"\" method=\"post\" name=\"userClickForm_"+i +"\" id=\"userClickForm_"+i +"\">");
printWriter.write(" <input type=\"hidden\" name=\"userId\" value=\""+userId +"\"/>");
printWriter.write("</form>");
......

混合html代码和业务逻辑的主要原因是我必须根据条件和循环结构提供div id。

【问题讨论】:

  • 一个简单的解决方案是将html页面写入文件并使用InputStream循环检索它
  • @Bhavik:这是一个非常糟糕的建议。如果已经为此发明了 JSP,为什么还要重新发明轮子呢?它还允许更轻松地与 EL 的作用域属性和 JSTL 的输出流控制进行交织。
  • @BalusC :我对 ajax 和 JSTL 了解不多。我们如何访问由 ajax 响应发送的作用域变量?出于这个原因,我提出该建议的主要目的是 It becomes hard to maintain 的 OP。所以如果他从文件中读取,维护文件会很容易

标签: java html ajax jsp servlets


【解决方案1】:

您可以通过使用诸如 STRUTS 或 SPRING 之类的 MVC 框架来避免这种情况。

【讨论】:

    【解决方案2】:

    您应该使用 JSP。它将针对不同的 servlet/jsp 请求,而不是发起 ajax 调用的请求。

    【讨论】:

      【解决方案3】:

      在 servlet 和 jsp 上使用 xml 而不是 html 使用 jquery 的 ajax 调用的成功属性......在我的情况下,它的工作,bt 我使用类型作为'GET'。

        $.ajax({
                  url: ,
                  data: ,
                  type: ,
                  dataType: 'xml',
                  async: true,
                  success:function(xmlDoc) 
                  {   
                      var message = xmlDoc.getElementsByTagName("message");
                      message = message[0].firstChild.data;
      
                  }
          });
      

      在 Servlet 中使用::

               res.getWriter().write("<response><message>abcdefg</message></response>");
      

      【讨论】:

        【解决方案4】:

        您应该使用某种形式的模板或转换技术。由于您使用的是 jQuery 和 JSP,这可以是服务器端 JSP 或客户端 jQuery 模板插件。

        早期的 JSP MVC 模式采用这种形式:

        protected void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
            // read inputs
            String foo = request.getParameter("foo");
            // perform business logic
            SomeResults results = new SomeDataSource().lookupDatabase(foo);
            // place results into scope
            request.setAttribute("results", results);
            // dispatch to JSP to render results
            request.getRequestDispatcher("result.jsp")
                   .forward(request, response);
        }
        

        此方法可用于 AJAX 调用。

        或者,您可以使用 JSON 或 XML 数据进行响应并在 JavaScript 中对其进行解析,然后使用 JavaScript 模板引擎执行类似于 JSP 中执行的逻辑的操作。

        【讨论】:

        • 请注意,JSP 完全可以只返回部分 HTML 代码。 IE。您绝对不一定需要在 JSP 中放置一个完整的&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;body&gt; 等等。让 JSP 只生成 &lt;div&gt; 左右是完全合法的。显然已经熟悉 JSP 的 OP 可能因此没有立即看到 明显 解决方案。
        • @BalusC - 好点。我认为这很明显,但也许我假设太多了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-01
        相关资源
        最近更新 更多