What is the best-practice for developing web-pages for both non-JS-enabled and JS-enabled pages? I am developing a Spring MVC web-application using JSP/JSTL as the view technology.
The way I work is to create a full web-page (with “html”, “head”, etc) tags in it. This will work on all browsers. My entire app works (however ugly-bugly) with JS disabled.
Also included in each page is some jQuery script that prettifies the page, typically turning top-level “divs” into tabs, other divs into dialogs, etc. The JS “hijacks” the underlying HTML. My JS hijacks the links and buttons, using AJAX calls to load the content into the correct dialog or tab div.
This all works nicely and I like the architecture, but I have added an optimisation such that the AJAX requests appends a “contentOnly” parameter; this is picked up by the Spring MVC view which conditionally ignores the “head”, etc – i.e. it only renders the real content that the AJAX version wants. It just feels clunky.
I know I could load the entire page and discard the outer bits but this seems inefficient to load all the associated CSS and JS files which are not strictly necessary.
My question is: is there a nicer way to write this conditional formatting, should I be using a different view technology or something else, something like Velocity or FreeMarker or whatever Grails uses?
An example of my conditional: –
<%@ 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>
You need to include the files the other way round.
/WEB-INF/template.jspleads.jspAnd create a controller which sets
leadsas${page}variable based on a specific request URL and forward totemplate.jspinstead. Since I don’t do Spring, I can’t answer in detail how to achieve it with Spring. But the following basic JSP/Servlet kickoff example should give the general idea:Invoke it as http://example.com/contextname/pages/leads to get the template displayed with
leads.jspincluded. Finally you should be able to invoke http://example.com/contextname/leads.jsp independently to get the sole template content.