应用程序实例
在这个简单的实例情景中,应用程序中的第一个JSP页面显示一个包含超链接的页面。 当用户点击一个连接时,应用程序作出响应,连接到一个特殊的页面。 为了接受选择,另一个页面将成为结果页。 正如你看见的,例程中的内容是极其地简单,所以你可以专心于应用程序怎样产生适当的语言与针对设备的不同的响应。这个应用程序的完整的请求/响应部分是由四个主要组分组成的:
· 一个提供处理请求和驱动应答序列的代码逻辑的JSP页面。
· 一个XML生成程序,负责生成一个XML页面。
· 一个XSL样式表,针对提出请求的客户端有不同格式的应答。 XSLT用于服务器端转化。
· 一个Resource Bundle文件,提供I18N支持。
 图3显示了顶级应用程序配置结构,并解释了组件之间的配置顺序和相互关系。 | JSP文件的结构和处理
在示例应用程序中,JSP页面负责:
· 识别客户端。
· 创建应答MIME设置。
· 确定页面中将生成什么样的语言。
· 产生一个请求来生成XML页面
· 应用适当的XSLT样式表来产生XML页面。
比如,假定一个客户端对Options.jsp文件(示例应用程序的第一个页面)提出了一个请求。 客户端把所使用的语言和国家名作为一个参数(URL参数)传入服务器。 如果服务器上的JSP页面不能接受(或者不能识别)客户端的语言和国家设置,那么应用程序就使用美国英语来显示响应。 下面的程序代码段说明一个JSP页面怎样从请求中取得语言和国家信息。
/*检查应答中将显示的语言 默认情况下,将使用美国英语来显示应答 */
if((language = request.getParameter("language"))==null) language="en";
if((country = request.getParameter("country"))==null) country="US";
country = country.toUpperCase(); | 基于客户端程序,JSP页面设置应答的MIME类型,识别用于产生的XML的XSLT样式表,并且设置适当的pageType值,XML生成程序使用这个值来在XML生成程序中找到适当的Resource Bundle文件。
另外,应用程序将足够智能化以识别相应的应答格式。 比如,下列代码片断检查一个浏览器客户端,如果发现的话,执行某些具体的处理过程。
String userAgent = request.getHeader("User-Agent");
/* 识别用户设备∶ | 1. 设置为产生XML的pageType变量。 在这个时候,应用程序随语言、国家和页面类型设置来从资源包中取得相应的条目。
2.设置contentType变量。 应用程序根据识别的用户设备来设置MIME头。
3. 设置xslName变量。 这是用于把XML转换为页面的XSLT文件的文件名。
*/
if(userAgent.startsWith("Mozilla"))
{
pageType="Web"; contentType="text/html;charset=UTF-8";
xslName="articles-html-form.xsl";
}
| 其他的用户设备发送不同的Header。例如,你可以使用下面的程序代码识别iMode用户设备(可以在 wapprofit.com模拟器中验证)∶
| userAgent.startsWith("Microsoft URL") | 而且你也可以使用下面的代码来识别WAP(Nokia工具包)用户设备:
| userAgent.startsWith("Nokia") | 你必须使用UTF-8字符集来支持I18N。
此时,应用程序已经识别用户设备和语言,所以应用程序可以产生一个XML页面。 为了初始化XML的生成,JSP调用一个XML生成程序类方法,例如OptionsXML类的getOptionXML()方法,来根据请求返回一个包含数据的XML字符串。
/* 调用JSP的一个私有方法来根据用户设备产生XML和应用一个XSL样式表来产生输出。 */
showPage(pageType, language, country, response, contentType, xslName); | showPage()方法根据pageType、语言和国家设置来产生XML页面。 它应用特定的XSLT样式表来生成XML然后把格式化了的应答发回用户设备。
try
{
response.setContentType(contentType);
response.getOutputStream().flush();
TransformerFactory tFactory = TransformerFactory.newInstance();
String str = OptionsXML.getOptionsXML(pageType, language, country,response);
StringReader sReader = new StringReader(str);
StreamSource xml = new StreamSource(sReader) ;
StreamSource xsl = new StreamSource(xslName) ;
Transformer transformer = tFactory.newTransformer(xsl);
StreamResult result = new StreamResult(response.getOutputStream()) ;
transformer.transform(xml, result);
}
catch(Exception e)
{}
Option.jsp 代码
<%@ page import="java.util.*" %>
<%@ page import="java.net.*" %>
<%@ page import="import org.xml.sax.*" %>
<%@ page import="javax.xml.transform.TransformerFactory" %>
<%@ page import="javax.xml.transform.Transformer" %>
<%@ page import="javax.xml.transform.stream.StreamSource" %>
<%@ page import="javax.xml.transform.stream.StreamResult" %>
<%@ page import="javax.xml.transform.TransformerException" %>
<%@ page import="javax.xml.transform.TransformerConfigurationException" %>
<%@ page import="wayne.articles.xmlgen.*"%>
<% String pageType="Web";
String userAgent = request.getHeader("User-Agent");
String contentType="text/html;charset=UTF-8";
String xslName="articles-html-form.xsl";
String language="en";
String country="US";
if((language = request.getParameter("language"))==null)
language="en";
if((country = request.getParameter("country"))==null)
country="US";
country = country.toUpperCase();
if(userAgent.startsWith("Mozilla")) {
pageType="Web";
contentType="text/html;charset=UTF-8";
xslName="articles-html-form.xsl";
}
else if(userAgent.startsWith("Microsoft URL")) {
pageType="IMode";
contentType="text/html;charset=UTF-8";
xslName="articles-imode-form.xsl";
}
else if(userAgent.startsWith("Nokia"))
{
pageType="Wap";
contentType="text/vnd.wap.wml";
xslName="articles-wml-form.xsl";
}
showPage(pageType,language,country, response, contentType, xslName);
%>
<%
private void showPage(String pageType, String language, String country, HttpServletResponse response,String contentType, String xslName)
{
try
{
response.setContentType(contentType);
response.getOutputStream().flush();
TransformerFactory tFactory = TransformerFactory.newInstance();
String str = OptionsXML.getOptionsXML(pageType, language, country,response);
StringReader sReader = new StringReader(str);
StreamSource xml = new StreamSource(sReader) ;
StreamSource xsl = new StreamSource(xslName) ;
Transformer transformer = tFactory.newTransformer(xsl);
StreamResult result = new StreamResult(response.getOutputStream()) ;
transformer.transform(xml, result);
}
catch(Exception e)
{}
}
%>
YourResponse.jsp 代码:
<%@ page import="java.util.*" %>
<%@ page import="java.net.*" %>
<%@ page import="import org.xml.sax.*" %>
<%@ page import="javax.xml.transform.TransformerFactory" %>
<%@ page import="javax.xml.transform.Transformer" %>
<%@ page import="javax.xml.transform.stream.StreamSource" %>
<%@ page import="javax.xml.transform.stream.StreamResult" %>
<%@ page import="javax.xml.transform.TransformerException" %>
<%@ page import="javax.xml.transform.TransformerConfigurationException" %>
<%@ page import="wayne.articles.xmlgen.*"%>
<%
String pageType="Web";
String userAgent = request.getHeader("User-Agent");
String contentType="text/html;charset=UTF-8";
String xslName="articles-html-form.xsl";
String language="en";
String country="US";
if((language = request.getParameter("language"))==null)
language="en";
if((country = request.getParameter("country"))==null)
country="US";
country = country.toUpperCase();
int optionid = 1;
try
{
optionid = Integer.parseInt(request.getParameter("optionType"));
}
catch(Exception e)
{
optionid = 1;
}
System.out.println("user Agent = " + userAgent);
if(userAgent.startsWith("Mozilla"))
{
pageType="Web";
contentType="text/html;charset=UTF-8";
xslName="articles-html-form.xsl";
}
else if(userAgent.startsWith("Microsoft URL"))
{
System.out.println("entered");
pageType="IMode";
contentType="text/html;charset=UTF-8";
xslName="articles-imode-form.xsl";
}
else if(userAgent.startsWith("Nokia"))
{
pageType="Wap";
contentType="text/vnd.wap.wml";
xslName="articles-wml-form.xsl";
}
showPage(pageType,language,country, response, optionid, contentType, xslName);
%>
<%
private void showPage(String pageType,String language,String country, HttpServletResponse response, int optionid,String contentType, String xslName)
{
try
{
response.setContentType(contentType);
response.getOutputStream().flush();
TransformerFactory tFactory = TransformerFactory.newInstance();
String str = YourResponseXML.getYourResponseXML(pageType,language,country,response, optionid);
StringReader sReader = new StringReader(str);
StreamSource xml = new StreamSource(sReader) ;
StreamSource xsl = new StreamSource(xslName) ;
Transformer transformer = tFactory.newTransformer(xsl);
StreamResult result = new StreamResult(response.getOutputStream()) ;
transformer.transform(xml, result); } catch(Exception e){}
}
%>
|
|
|