
Ajax utan x, med Prototype och Spring
Författare: Jesper Hammarbäck | PNEHM! #1 2007 | 2007-05-06
Det har skrivits mycket i ämnet AJAX. Det finns webbsidor, how-to:s och en ansenlig mängd ramverk som skapats för att underlätta utveckling av AJAX-applikationer. AJAX är ingen teknik i sig, utan ett samlingsnamn för en mängd tekniker som används för att uppnå mer dynamik på webben. Jesper Hammarbäck visar hur man på enklaste sätt, utan att vare sig behöva traversera DOM-träd eller använda JSON, kan använda AJAX i en webbapplikation.
Prototype är en fin samling JavaScript-funktioner samlade i en fil på 73kb. Den innehåller alla möjliga tänkbara hjälpmedel för webbutvecklare, exempelvis möjligheten att referera till ett id med $() istället för det vanliga document.getElementById(). Så klart finns också AJAX-stöd vilket vi skall titta närmare på. Prototype är välanvänt, vältestat och fungerar med de flesta webbläsare. I det här exemplet använder jag också Spring Framework som vid det här laget knappast behöver en närmare presentation.
Målet är att bygga en JSP-sida som visar aktuell tid. Inte helt oväntat finns ett krav att tiden ska uppdateras varje sekund, utan att hela webbsidan måste laddas om. Så passande för oss! Så här kommer det gå till: En gång per sekund anropar vi, med hjälp av Prototype, en Spring-Controller som beräknar aktuell tid och vidarebefordrar värdet till en JSP-vy. Vyn består av några rader JSTL/EL och där har vi möjlighet att göra formateringar genom att bädda in vår data i vanlig HTML-kod. På det sättet får vi en behaglig separation av data och presentation även för våra AJAX-anrop, och en Controller som är lätt att enhetstesta. Resultatet blir en snutt HTML som skrivs in i en av oss definierad DIV-tag i en JSP-sida och vips så är vi i mål. Vi börjar alltså med att skapa en JSP-sida och en DIV som markerar var vi vill att tiden ska visas. Genom att referera till DIV-taggens id kommer vi kunna ersätta innehållet med resultatet av vårt ajax-anrop. Eftersom anropet ska ske periodiskt enligt ett givet intervall använder vi Prototypes funktion PeriodicalUpdater. index.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <div id="timeDiv"></div> Lägg märke till hur enkelt själva AJAX-anropet är. Tack vare Prototype behöver vi inte pyssla med vare sig XMLHttpRequest eller ActiveXObject. GetTimeController.javapublic class GetTimeController extends AbstractController { protected ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) { Map<String, Object> model = new HashMap<String, Object>(); En Spring-context-fil med mappning måste vi också skapa: simpleajax-servlet.xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="urlMapping" <bean id="viewResolver" ... och så behöver vi en web.xml för att sparka igång Spring och mappa .ajax-ändelsen till Springs DispatcherServlet. web.xml<?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>simpleajax</display-name> <servlet> <servlet-mapping> <welcome-file-list> Sedan är det dags att skapa vyn som formaterar Date-objektet: time.jsp<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <span style="font-weight:bold;">${currentTime}</span> Klart! Paketera resultatet som en webbapplikation och starta den, t.ex. via http://localhost/simpleajax/. Om allt fungerar ska tiden visas och uppdateras varje sekund medan servlet-containerns accessloggar fylls med POST-anrop till /simpleajax/getTime.ajax. Det var väl inga svårigheter? Stora delar är uppsättningskod som inte behöver upprepas när man skapar och lägger till fler AJAX-anrop. Nedan inkluderas en länk till en körbar exempelapplikation
Lär dig mer om Ajax
![]()
Ordet PNEHM! bildas av de värdeord Citerus konsulter vill bli förknippade med; prestigelöshet, nyfikenhet, engagemang, helhetssyn och mod. Utropstecknet står för en vilja att agera professionellt i alla lägen.
|
Dragarbrunnsgatan 24 753 20 Uppsala Tel: 018-51 51 13 | Fax: 018-51 51 95 |
Barnhusgatan 16 | 111 23 Stockholm Tel: 08-56 29 53 00 |