20.3. How to Match WCSS Cascading Style Sheets to Different User Agents?

Before we talk about how to match WCSS cascading style sheets to different user agents, let's go back to the request-response cycle between a server and a client browser that we mentioned earlier. We copy and paste it here for your convenience.

  1. The WAP browser requests an XHTML MP page from the server.

  2. The server receives the request and delivers the XHTML MP document to the WAP browser.

  3. The WAP browser receives the XHTML MP document and finds that it contains a <link> tag that references to an external cascading style sheet.

  4. The WAP browser sends another request to the server in order to obtain the WAP CSS cascading style sheet.

  5. The server receives the request and delivers the WAP CSS cascading style sheet to the WAP browser.

  6. The WAP browser receives the WAP CSS file and displays the XHTML MP page according to the style information contained in the WAP CSS file.

  7. The steps repeat when the user selects an anchor link or types a new URL in the WAP browser.

As you can see from above, the server receives a HTTP request at step 2 and step 5. This means to match the appropriate WCSS cascading style sheet to a client browser, you can either:

Or

Let's see an XHTML MP/WCSS example that can help you understand how to use JSP and the user-agent header to match cascading style sheets to different user agents.

In this XHTML MP/WCSS example, we define three cascading style sheets. The first one is for Nokia's mobile phone browsers, the next one is for Sony Ericsson's mobile phone browsers and the last one is for desktop web browsers.

Below is the WAP CSS style sheet for Nokia's mobile phone browsers. It specifies that level-1 headings should be displayed with the marquee effect. (In case you forget how to use the marquee extension, you can go back to "WCSS Marquee Extension" and have a look.)


(nokia.css)

h1 {
  display: -wap-marquee;
  -wap-marquee-loop: infinite
}


Here is the WAP CSS style sheet for Sony Ericsson's mobile phone browsers. It specifies that level-1 headings should be displayed in bold type and aligned to the center horizontally.


(sonyericsson.css)

h1 {
  font-weight: bold;
  text-align: center
}


Here is the WAP CSS style sheet for desktop web browsers. As desktop computers have large screens, we want the text to be displayed in extra large size.


(webbrowser.css)

body {
  font-size: x-large
}


Below is the JSP file that contains the XHTML MP markup. The JSP code demonstrates how to match WCSS cascading style sheets to different client browsers using Way 1 (detecting the user agent when the XHTML MP document is requested).


(diffUserAgentEg1.jsp)

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
<%
String uaheader = request.getHeader("user-agent");

if (uaheader.indexOf("Nokia") != -1){
%>
    <link href="nokia.css" rel="stylesheet" type="text/css"/>
<%
}
else if (uaheader.indexOf("SonyEricsson") != -1){
%>
    <link href="sonyericsson.css" rel="stylesheet" type="text/css"/>
<%
}
else if (uaheader.indexOf("Mozilla") != -1){
%>
    <link href="webbrowser.css" rel="stylesheet" type="text/css"/>
<%
}
%>

    <title>WCSS Tutorial</title>
  </head>

  <body>
    <h1>Hello, welcome to our WCSS tutorial.</h1>
    <hr/>
    <p>
      Table of Contents:<br/>
      WCSS Tutorial Chapter 1<br/>
      WCSS Tutorial Chapter 2<br/>
      WCSS Tutorial Chapter 3<br/>
    </p>
  </body>
</html>


What the JSP code does is very simple. Here are some descriptions:

1. The user-agent HTTP header value is obtained and is assigned to the variable uaheader.


String uaheader = request.getHeader("user-agent");


2. The variable uaheader is checked to see if it contains the words "Nokia", "SonyEricsson" or "Mozilla". The indexOf(String str) method of the String object returns the index of the first occurrence of the str substring. If str is not found, -1 is returned by the indexOf(String str) method. In other words, if str is found, the return value will not be -1.

If the variable uaheader contains "Nokia", it means the user agent is a Nokia mobile phone browser and we change the URL of the external cascading style sheet to nokia.css.


<%
if (uaheader.indexOf("Nokia") != -1){
%>
    <link href="nokia.css" rel="stylesheet" type="text/css"/>
<%
}


Otherwise if the variable uaheader contains "SonyEricsson", it means the user agent is a Sony Ericsson mobile phone browser and we change the URL of the external cascading style sheet to sonyericsson.css.


else if (uaheader.indexOf("SonyEricsson") != -1){
%>
    <link href="sonyericsson.css" rel="stylesheet" type="text/css"/>
<%
}


Otherwise if the variable uaheader contains "Mozilla", it means the user agent is a desktop web browser (like IE, Firefox and Mozilla) and we change the URL of the external cascading style sheet to webbrowser.css.


else if (uaheader.indexOf("Mozilla") != -1){
%>
    <link href="webbrowser.css" rel="stylesheet" type="text/css"/>
<%
}
%>


Note that we have to check for the word "Mozilla" in the last "else if" statement since the user-agent header value of some mobile phone browsers contains the word "Mozilla". For example, let's say the user-agent header value of a certain Nokia mobile phone browser contains that word "Mozilla". If we check for the word "Mozilla" in the first "if" statement, the JSP code will wrongly identify the Nokia mobile phone browser as a desktop web browser.

Now let's move on to another example that demonstrates how to match WCSS cascading style sheets to different client browsers using Way 2 (detecting the user agent when the cascading style sheet is requested). This example produces the same result as our first example.


(diffUserAgentEg2.xhtml)

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="diffUserAgentEg2CSS.jsp" rel="stylesheet" type="text/css"/>
    <title>WCSS Tutorial</title>
  </head>

  <body>
    <h1>Hello, welcome to our WCSS tutorial.</h1>
    <hr/>
    <p>
      Table of Contents:<br/>
      WCSS Tutorial Chapter 1<br/>
      WCSS Tutorial Chapter 2<br/>
      WCSS Tutorial Chapter 3<br/>
    </p>
  </body>
</html>


This JSP file is the WAP CSS style sheet:


(diffUserAgentEg2CSS.jsp)

<%
response.setContentType("text/css");
String uaheader = request.getHeader("user-agent");

if (uaheader.indexOf("Nokia") != -1){
%>
<%@ include file="nokia.css" %>
<%
}
else if (uaheader.indexOf("SonyEricsson") != -1){
%>
<%@ include file="sonyericsson.css" %>
<%
}
else if (uaheader.indexOf("Mozilla") != -1){
%>
<%@ include file="webbrowser.css" %>
<%
}
%>


What the above JSP code does is very similar to our first example. Here are some descriptions:

1. The MIME type of the document is set to text/css. It informs the client browser that this JSP file is a WAP CSS cascading style sheet.


response.setContentType("text/css");


2. The user-agent HTTP header is obtained and is assigned to the variable uaheader.


String uaheader = request.getHeader("user-agent");


3. The variable uaheader is checked to see if it contains the words "Nokia", "SonyEricsson" or "Mozilla".

If the variable uaheader contains "Nokia", it means the user agent is a Nokia mobile phone browser and we add the contents of the file nokia.css into the cascading style sheet.


if (uaheader.indexOf("Nokia") != -1){
%>
<%@ include file="nokia.css" %>
<%
}


Otherwise if the variable uaheader contains "SonyEricsson", it means the user agent is a Sony Ericsson mobile phone browser and we add the contents of the file sonyericsson.css into the cascading style sheet.


else if (uaheader.indexOf("SonyEricsson") != -1){
%>
<%@ include file="sonyericsson.css" %>
<%
}


Otherwise if the variable uaheader contains "Mozilla", it means the user agent is a desktop web browser (like IE, Firefox and Mozilla) and we add the contents of the file webbrowser.css into the cascading style sheet.


else if (uaheader.indexOf("Mozilla") != -1){
%>
<%@ include file="webbrowser.css" %>
<%
}
%>


Below shows the result of the above example in Nokia Mobile Browser 4.0, Sony Ericsson T610 and Microsoft Internet Explorer respectively:






Sony Ericsson T610











Nokia Mobile Browser 4.0



Microsoft Internet Explorer 6


Previous Page Page 39 of 39


Feedback Form (ExpandCollapse)

What do you think about this web page?






(Optional) Please provide us more details. For example, suppose you select option 2 above, can you tell us specifically what information is missing? You can also suggest anything that can help us improve this web page.

(Optional) Your name:

(Optional) Your email address:

Please enter again to confirm:

Due to the amount of messages we received, we may not be able to reply to all messages.

A button for going back to the top of this page