Каков наилучший способ доставки как статического, так и AJAX-содержимого страницы? - PullRequest
0 голосов
/ 18 июля 2011

Какова наилучшая практика разработки веб-страниц для страниц без JS и JS?Я занимаюсь разработкой веб-приложения Spring MVC с использованием JSP / JSTL в качестве технологии просмотра.

То, как я работаю, заключается в создании полной веб-страницы (с тегами "html", "head" и т. Д.).Это будет работать во всех браузерах.Все мое приложение работает (хотя и уродливо) с отключенным JS.

Также на каждой странице есть некоторый скрипт jQuery, который предварительно настраивает страницу, обычно превращая «div» верхнего уровня в вкладки, другие div в диалоги,и т.д. JS «захватывает» базовый HTML.Мой JS перехватывает ссылки и кнопки, используя вызовы AJAX для загрузки содержимого в правильный диалог или раздел вкладок.

Это все работает хорошо, и мне нравится архитектура, но я добавил оптимизацию, такую, что AJAX запрашиваетдобавляет параметр "contentOnly";это выбирается представлением Spring MVC, которое условно игнорирует «голову» и т. д., т. е. оно отображает только реальный контент, который хочет версия AJAX.Это просто кажется неуклюжим.

Я знаю, что мог бы загрузить всю страницу и удалить внешние биты, но это кажется неэффективным для загрузки всех связанных файлов CSS и JS, которые не являются строго необходимыми.

Мой вопрос: есть лилучший способ написать это условное форматирование, если я использую другую технологию представления или что-то еще, что-то вроде Velocity или FreeMarker или что-то еще, что использует Grails?

Пример моего условного: -

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<c:if test="${param.contentOnly == null}">
<!DOCTYPE html>
<html>
<head>
    <%@ include file="_stylesAndScripts.jsp"%>
    <title>My App Title</title>
</head>

<body>
    <%@ include file="_header.jsp"%>
    <%@ include file="_menu.jsp"%>
</c:if>
    <div id="leadListPanel" class="contentPanel">
        <h1>My App Title</h1>
        <p>The time on the server is ${serverTime}.</p>

        <table id="leadTable" class="list">
                    ... rest of content...

<c:if test="${param.contentOnly == null}">

    <%@ include file="_footer.jsp"%>
</body>
</html>
</c:if>

Ответы [ 2 ]

0 голосов
/ 21 июля 2011

Вам нужно включить файлы наоборот.

/WEB-INF/template.jsp

<!DOCTYPE html>
<html>
    <head>
        <%@ include file="_stylesAndScripts.jsp"%>
        <title>My App Title</title>
    </head>
    <body>
        <%@ include file="_header.jsp"%>
        <%@ include file="_menu.jsp"%>
        <jsp:include page="${page}.jsp" />
        <%@ include file="_footer.jsp"%>
    </body>
</html>

leads.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<div id="leadListPanel" class="contentPanel">
    <h1>My App Title</h1>
    <p>The time on the server is ${serverTime}.</p>

    <table id="leadTable" class="list">
                ... rest of content...

И создать контроллер, который устанавливаетleads как ${page} переменная на основе определенного URL-адреса запроса и переадресация на template.jsp.Поскольку я не делаю Spring, я не могу подробно ответить, как этого добиться с помощью Spring.Но следующий базовый пример запуска JSP / Servlet должен дать общую идею:

@WebServlet(urlPatterns={"/pages/*"})
public class TemplateServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String page = request.getPathInfo();
        // .. Do some other preprocessing if necessary .. and then:
        request.setAttribute("page", page);
        request.getRequestDispatcher("/WEB-INF/template.jsp").forward(request, response);
    }

}

Вызвать его как http://example.com/contextname/pages/leads, чтобы получить шаблон, отображаемый с включенным leads.jspНаконец, вы сможете самостоятельно вызывать http://example.com/contextname/leads.jsp, чтобы получить единственный шаблонный контент.

0 голосов
/ 20 июля 2011

Я использовал такой подход несколько лет назад с Freemarker, и я не знаю лучшего способа сделать это.

Что вы можете сделать, это создать JSP-теги для этих условий, чтобы они выглядели лучше и скрывали фактическую реализацию. Примерно так:

<t:NonAjax>
  <!DOCTYPE html>
  <html>
  <head>
    <%@ include file="_stylesAndScripts.jsp"%>
    <title>My App Title</title>
  </head>
  <body>
    <%@ include file="_header.jsp"%>
    <%@ include file="_menu.jsp"%>
</t:NonAjax>
<div id="leadListPanel" class="contentPanel">
    <h1>My App Title</h1>
    <p>The time on the server is ${serverTime}.</p>

    <table id="leadTable" class="list">
                ... rest of content...

<t:NonAjax>
  <%@ include file="_footer.jsp"%>
  </body>
  </html>
</t:NonAjax>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...