我设置一个变量: % String userAgent = request.getHeader("user-agent");% 如何使用针对userAgent测试不同的方案 c:choose/c:choose 我不知道如何设置它? 您不希望将scriptlet与taglibs / EL混合使用.它们不在
<% String userAgent = request.getHeader("user-agent");%>
如何使用针对userAgent测试不同的方案
<c:choose></c:choose>
我不知道如何设置它?
您不希望将scriptlet与taglibs / EL混合使用.它们不在同一范围内运行.所有请求标头都由EL隐式映射对象${header}提供.由于user-agent头名称包含一个特殊字符 – 因此${header.user-agent}无法按预期工作,因此您需要使用引号括号[]来引用它.
${header['user-agent']}
所以,这应该做:
<c:choose> <c:when test="${fn:contains(header['user-agent'], 'Gecko')}"> You're pretending to use a Gecko based browser. </c:when> <c:when test="${fn:contains(header['user-agent'], 'MSIE')}"> You're pretending to use a MSIE based browser. </c:when> <c:when test="${fn:contains(header['user-agent'], 'Webkit')}"> You're pretending to use a Webkit based browser. </c:when> <c:otherwise> It's not clear which browser you're pretending to use. </c:otherwise> </c:choose>
与问题无关:以这种方式检查用户代理标头是一种代码味道.用户代理标头完全由客户端控制,很容易被欺骗成完全不同的值(这就是我在上面的代码示例中使用术语“假装”的原因).如何正确解决实际功能需求,您需要详细说明实际功能需求.
例如,在JavaScript中,您应该优先选择feature detection而不是浏览器检测.
或者,当您想根据媒体类型加载特定样式表时,您应该使用media
attribute.例如.
<link rel="stylesheet" href="screen.css" media="screen,projection,tv" /> <link rel="stylesheet" href="smartphone.css" media="only screen and (max-device-width:480px)"/> <link rel="stylesheet" href="handheld.css" media="handheld" /> <link rel="stylesheet" href="print.css" media="print" />
或者,当您希望向最终用户提供用户代理标头中的信息的用户友好摘要时,您希望使用单独的服务,例如http://user-agent-string.info/.它们还提供Java API example.