Struts2如何为移动和桌面创建多个视图
我正在创建一个可以通过移动和桌面设备访问的网站。因此,我想为我的应用程序创建两个视图。我的操作代码和后端(managers,DAOs)中的所有其他内容都是相同的。只需对两者进行JSP更改Struts2如何为移动和桌面创建多个视图,struts2,Struts2,我正在创建一个可以通过移动和桌面设备访问的网站。因此,我想为我的应用程序创建两个视图。我的操作代码和后端(managers,DAOs)中的所有其他内容都是相同的。只需对两者进行JSP更改 我如何通过Struts 2实现这一点?不确定是否有用于为Struts 2自动化此类任务的库。但如果有的话,使用这样的库可能会更好 不管怎样,理论是这样的。每个浏览器在请求头中都有自己的“签名”,称为“用户代理”。不同的浏览器(假定)具有不同的用户代理。例如,我的firefox用户代理如下所示: Mozilla/
我如何通过Struts 2实现这一点?不确定是否有用于为Struts 2自动化此类任务的库。但如果有的话,使用这样的库可能会更好 不管怎样,理论是这样的。每个浏览器在请求头中都有自己的“签名”,称为“用户代理”。不同的浏览器(假定)具有不同的用户代理。例如,我的firefox用户代理如下所示: Mozilla/5.0(Windows NT 6.0;rv:5.0)Gecko/20100101 Firefox/5.0 FireHP/0.5 基本上,通过检测用户代理,您可以知道使用什么浏览器访问您的站点。可以在中找到移动浏览器用户代理的列表 如果我没有错,您可以通过httpServletRequest.getHeader(“用户代理”)检索服务器中的用户代理;(如果我错了,请纠正我) 然后,您可以创建一个拦截器,该拦截器将决定客户端是来自移动还是来自桌面。该拦截器可以为不同的客户端类型返回不同的结果。例如,如果客户端是桌面,则可以返回“successDesktop”;如果客户端是移动的,则可以返回“successMobile”
嗯,希望其他人能想出(远)更简单的解决方案,在struts中,有很多方法可以获得相同的结果。 在这种情况下,我更喜欢: 您可以编写基于的用户代理更改返回代码的 客户端,这样每个jsp都有PC和mobile版本。 在配置中,您需要拥有所有jsp的所有结果代码(或者您可以通过通配符映射简单地定义结果)。 例如:将结果代码从“success”更改为“mobile_success”。如果您想在同一个jsp中映射这两个结果,您可以这样映射,正如我前面所说的
我目前正试图解决同样的问题。一个框架会很好,如果有人已经测试并批准了,我会洗耳恭听。也就是说,我找不到任何成熟到足以让我从Struts转向mobile视图的东西
目前,我最好的解决方案是为我的整个页面的每个部分创建操作,这些部分将显示在完整的浏览器上。然后重用这些操作在移动端显示页面段
我发现,试图让桌面浏览器和移动浏览器同时使用一个页面是不可持续的
jquerymobile看起来是一个非常有前途的库,用于设置struts检索到的元素的样式
因此,虽然可以将两个版本的站点塞进一个操作中,但我认为花时间创建可重用的小操作,从而产生jsp snippits,这将随着应用程序的扩展而得到回报
以下是近期的一些可能性:
(我不能添加这些链接,因为我没有足够的声誉…你必须添加'http://www.")
Struts2 jQuery移动项目主页:
Struts2 jQuery移动项目:code.google.com/p/Struts2 jQuery/downloads/detail?name=Struts2-jQuery-Mobile-showcase-3.1.1.war
struts2 jQuery Mobile的一个示例:weinfreund.de/struts2-jQuery-Mobile-showcase/index.action
@fajrian—随着越来越多的移动和桌面浏览器的发布,使用“用户代理”来确定浏览器类型可能会成为一个真正的难题。更好的方法是根据窗口的尺寸确定是显示移动版本还是完整版本
编辑-查看CSS3媒体查询。正如Maurizio所说,您可以使用拦截器。这是我发现的 这对我很有效,基本上可以解决这个问题。不过,您至少需要知道部分用户代理字符串:
public class MobileInterceptor extends AbstractInterceptor {
private static final String RESULT_CODE_SUFFIX_MOBILE = "mobile";
private static final String REQUEST_HEADER_ACCEPT = "Accept";
private static final String[] MOBILE_BROWSER_UAS = {"iPhone OS","Android","BlackBerry","Windows Phone"};
public String intercept(ActionInvocation invocation) throws Exception {
invocation.addPreResultListener(new PreResultListener() {
public void beforeResult(ActionInvocation invocation, String resultCode) {
// check if a wireless version of the page exists
// by looking for a wireless action mapping in the struts.xml
Map results = invocation.getProxy().getConfig().getResults();
System.out.println("Results:"+results.toString());
if(!results.containsKey(resultCode + RESULT_CODE_SUFFIX_MOBILE)) {
return;
}
// send to mobile version if mobile browser is used
final String acceptHeader = ServletActionContext.getRequest().getHeader(REQUEST_HEADER_ACCEPT);
//Get User Agent String
String userAgent = ServletActionContext.getRequest().getHeader("User-Agent");
System.out.println("UA: "+userAgent);
//Boolean to indicate whether to show mobile version
boolean showMobileVersion = false;
//Run through each entry in the list of browsers
for(String ua : MOBILE_BROWSER_UAS){
if(userAgent.toLowerCase().matches(".*"+ua.toLowerCase()+".*")){
showMobileVersion = true;
}
}
if(showMobileVersion) {
invocation.setResultCode(resultCode + RESULT_CODE_SUFFIX_MOBILE);
}
}
});
return invocation.invoke();
}