目前在写一个项目由于需要兼顾多浏览器(主要还是IE6、IE7和FF),和同学讨论使用了两套CSS来达到这一目的。这就遇到了一个问题,怎样根据不同的浏览器来加载不同的CSS文件?最开始是使用jQuery来在前台进行判断,后来否定了这个方法;之后是使用IE浏览器的条件注释来进判断,这种方法虽然可行,但总是有种剑走偏锋的感觉。于是最终方案定为在后台来根据request请求来判断,然后响应到前台页面。
使用后台判断是使用JSP的request对象,使用getHeader()方法可以获得客户端的请求头数据,然后进一步分析出浏览器的类型与版本,加载CSS。由于加载CSS几乎是每个JSP页面都要做的事情,所以如果单抽取出一个类来做这件事不是不可以,但每个Action类都要调用这个类进行一次判断,这显然是很笨拙的办法。于是决定使用Struts2的栏截器机制,把这段代码抽取到一个自定义栏截器中,是最好的方案。
首先创建一个自定义栏截器,这里叫做“BrowserInterceptor”,它继承自com.opensymphony.xwork2.interceptor.MethodFilterInterceptor,从这个类继承的好处是,不必把Action的所有方法全部栏截,只需配置我们想要栏截的方法,这比使用AbstractInterceptor类又更进了一步,具体此栏截器的讲解请参阅《Struts2权威指南》这本书。
package com.yue.interceptor;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.yue.action.AjaxAction;
public class BrowserInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {
AjaxAction action = (AjaxAction) arg0.getAction();
HttpServletRequest req = ServletActionContext.getRequest();
String browser = req.getHeader("User-Agent"); //取得浏览器信息串进行分析
if (browser.indexOf("Firefox") != -1) { //根据不同的浏览器来加载不同的样式文件
System.out.println("Mozilla Firefox");
req.setAttribute("Browser", "<link rel='stylesheet' href='Style/Site.css'>");
} else if (browser.indexOf("MSIE 6.0") != -1) {
System.out.println("MSIE 6.0");
req.setAttribute("Browser", "<link rel='stylesheet' href='Style/Site_IE6.css'>");
} else {
System.out.println("MSIE");
req.setAttribute("Browser", "<link rel='stylesheet' href='Style/Site.css'>");
}
return arg0.invoke();
}
}
上面的代码原理很简单,就是分析了getHeader("User-Agent")返回的字串进行分析,但这种分析方法感觉很笨拙,希望大家有更好的判断方法可以给出,在这里我也向大家多多学习。
然后将结果赋予到request对象中,进便于前台显示。
下面配置了这个栏截器:
<package name="default" extends="json-default">
<interceptors>
<interceptor name="browser"
class="com.yue.interceptor.BrowserInterceptor">
</interceptor>
</interceptors>
<action name="ajax" class="com.yue.action.AjaxAction">
<result name="success">/json.jsp</result>
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="browser">
<!-- 这里定义了栏截的方法名,我只需栏截execute方法,别的方法不要栏截 -->
<param name="includeMethods">execute</param>
</interceptor-ref>
</action>
</package>
上面对这个栏截器进行了配置,可以看到使用了includeMethods指定了哪些方法需要进行栏截处理,相当于白名单。
如果想指定哪些方法不被栏截,配置excludeMethods参数即可,多个方法名使用逗号分开。
JSP页面就简单了,只需在加载CSS的位置使用Struts2的标签进行输出即可:<s:property value="#request.Browser" escape="false"/>
需要注意的是,escape属性必须置为false,这是因为默认来说内容是转义的。
分享到:
相关推荐
拦截器是Struts2框架中用于处理请求前后的关键组件,但过度使用会显著拖慢性能。优化策略包括: 1. **去除不必要的拦截器**:审查`struts.xml`中的拦截器配置,移除不使用的拦截器,减少请求处理流程的复杂度。 ...
- 使用Struts提供的拦截器来处理请求,确保请求能够正确地路由到目标资源。 5. **其他建议**: - 对于大型项目,推荐使用构建工具(如Maven或Gradle)来管理静态资源的版本控制和依赖关系。 - 在开发过程中,...
- **设计模式**:Struts1采用传统的MVC设计模式,而Struts2则采用了更先进的拦截器模式,使得框架更加灵活且易于扩展。 #### 四、Struts2配置详解 - **namespace**:用于区分不同的应用上下文,避免不同模块间的...
1. Struts2框架的使用,包括Action、配置文件、拦截器等。 2. 数据库操作,尤其是与SQL Server的集成。 3. DAO和Service层的设计,实现CRUD操作。 4. DWR框架的应用,用于服务器到客户端的实时数据推送。 5. AJAX和...
它旨在简化创建用户交互层的复杂性,提供了强大的动作调度、结果映射、拦截器和插件架构。Struts2可以很好地与JSON结合,通过配置可以让Action的返回结果直接以JSON格式返回给前端。 在"jquery ajax json struts2最...
Struts2框架继承了Struts1的优点,并在此基础上进行了很多改进,例如更加灵活的配置机制、强大的拦截器实现、丰富的标签库等。 #### 二、Struts2的作用 1. **简化开发**: Struts2提供了一套完整的解决方案,帮助...
这通常通过在`struts.xml`配置文件中添加相关的拦截器配置来完成。 2. **返回JSON结果**:在Action类中,定义一个返回JSON的结果类型。例如,可以使用`@Result(name="json", type="json")`注解或在XML配置文件中...
然而,这只是基础,Struts2还有许多高级特性,如拦截器、插件、国际化、Ajax支持以及更复杂的Action配置等,这些都是构建大型企业级应用时必不可少的工具。在实际开发中,理解并熟练运用这些特性,将有助于提升应用...
1. **Struts2框架**:Struts2是Apache软件基金会的开源项目,它继承了Struts1的优点并引入了更多现代Web开发所需的特性,如拦截器、OGNL表达式语言等。在本项目中,Struts2负责处理HTTP请求,调用业务逻辑,然后将...
客户端分页是在浏览器端处理,所有数据一次性加载到客户端,然后通过JQGrid的API实现分页效果;而服务器端分页则是在每次用户切换页码时,向服务器发送请求获取对应页的数据,这样可以减少内存占用和提高页面加载...
Struts2的核心是一个拦截器栈,通过配置不同的拦截器来实现不同的业务逻辑处理。 #### 三、Hibernate概述 **Hibernate** 是一个全功能的ORM(对象关系映射)框架,它能够将Java对象自动映射到数据库表中,并且可以...
- 安全性:AJAX请求也可能受到跨站脚本攻击(XSS)和跨站请求伪造(CSRF)等威胁,需要在Struts2配置中添加相应的拦截器保护。 - 回调处理:确保在前端正确处理AJAX请求的失败情况,如网络错误或服务器异常。 - 兼容...
在实际项目中,开发者需要根据业务需求扩展这些基础元素,编写更多的Action、添加复杂的表单验证、实现自定义拦截器、调整布局和样式,以创建一个完整且功能完善的Web应用。同时,为了确保良好的性能和用户体验,还...
在Struts2中,配置静态资源是为了确保像CSS、JavaScript、图片等非Action处理的资源能够正常被浏览器访问。这些资源通常不涉及业务逻辑,而是用于页面展示和交互。配置静态资源对于优化应用性能和提升用户体验至关...
Struts2提供了一系列拦截器(Interceptor),用于处理如验证、异常处理等通用任务,使得开发者能够更专注于业务逻辑。此外,它还支持多种视图技术,如JSP、FreeMarker等,增强了灵活性。 3. Hibernate: Hibernate...
1. **Struts2**: 是一个基于Java的开源Web应用框架,它继承了Struts1的优点并引入了更多强大的特性,如拦截器、动态方法调用等。 2. **JSON (JavaScript Object Notation)**: 是一种轻量级的数据交换格式,易于人...
在这个项目中,Struts2可能被用来管理用户的登录注册、商品购买、新闻发布等业务逻辑,通过配置Action和拦截器实现流程控制和功能扩展。 **网站设计:** 一个完整的公司网站设计通常包括以下几个部分: 1. **首页**...
在Struts框架中,我们可以利用Action和Result来控制数据的获取和展示,同时结合拦截器(Interceptor)处理分页逻辑。在本项目中,可能有一个自定义的Interceptor来计算总页数和当前页,然后将这些信息传递给视图层。...
本文将详细介绍如何使用Struts2框架的拦截器机制来过滤XSS攻击。 **1. XSS攻击简介** XSS攻击通常通过在网页中插入恶意JavaScript代码实现,当用户访问这些被篡改的页面时,恶意脚本会在用户的浏览器环境中执行。...
**Struts2**是以WebWork为基础发展起来的一种开源框架,它采用了拦截器机制来处理用户的请求。相比于传统的Struts1,Struts2具有更好的灵活性和可扩展性。 - **Struts2的工作流程**: 1. **客户端发送请求**:...