Struts2如何为移动和桌面创建多个视图

Struts2如何为移动和桌面创建多个视图,struts2,Struts2,我正在创建一个可以通过移动和桌面设备访问的网站。因此,我想为我的应用程序创建两个视图。我的操作代码和后端(managers,DAOs)中的所有其他内容都是相同的。只需对两者进行JSP更改 我如何通过Struts 2实现这一点?不确定是否有用于为Struts 2自动化此类任务的库。但如果有的话,使用这样的库可能会更好 不管怎样,理论是这样的。每个浏览器在请求头中都有自己的“签名”,称为“用户代理”。不同的浏览器(假定)具有不同的用户代理。例如,我的firefox用户代理如下所示: Mozilla/

我正在创建一个可以通过移动和桌面设备访问的网站。因此,我想为我的应用程序创建两个视图。我的操作代码和后端(managers,DAOs)中的所有其他内容都是相同的。只需对两者进行JSP更改


我如何通过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();
}