2011-07-15 9 views

Odpowiedz

1

nie wiem, czy istnieje biblioteka do automatyzacji takiego zadanie 2. rozpórkami, ale jeśli tak, to za pomocą takich bibliotek może być lepiej

tak, tutaj jest teoria. każda przeglądarka ma własny "podpis" napisany w nagłówku żądania, zwany "User-Agent". inna przeglądarka (podobno) ma innego agenta użytkownika. na przykład mój klient użytkownika Firefoxa jest następujący: Mozilla/5.0 (Windows NT 6.0; rv: 5.0) Gecko/20100101 Firefox/5.0 FirePHP/0.5

zasadniczo, po wykryciu klienta użytkownika, możesz dowiedzieć się, która przeglądarka służy do uzyskania dostępu do Twojej witryny. lista agentów użytkownika przeglądarki mobilnej znajduje się pod adresem http://www.zytrax.com/tech/web/mobile_ids.html

jeśli się nie mylę, można pobrać agenta użytkownika na serwerze za pomocą httpServletRequest.getHeader ("User-Agent"); (popraw mnie, jeśli się mylę)

możesz następnie utworzyć przechwytujący, który zdecyduje, czy klient pochodzi z komórki, czy z komputera. ten przechwytujący może zwrócić inny wynik dla innego typu klienta. na przykład, jeśli klient jest na pulpicie, możesz zwrócić "successDesktop", a jeśli klient jest mobilny, możesz zwrócić "successMobile".

dobrze, mam nadzieję, że ktoś inny może wymyślić (FAR) łatwiejszego rozwiązania

3

W rozporek istnieje wiele sposobów, aby uzyskać to samo. W tym przypadku preferuję: Można napisać kod interceptor, który zmienia kod powrotu na podstawie klienta użytkownika o numerze klienta, tak aby były wersje dla komputerów PC i telefonów komórkowych z każdego jsp. W swojej konfiguracji musisz mieć wszystkie kody wyników dla wszystkich jsp (lub możesz po prostu zdefiniować wynik poprzez mapowanie wieloznaczne). Na przykład: zmień kod wyniku z "success" na "mobile_success". W przypadku, gdy chcesz odwzorować oba wyniki w tym samym jsp, możesz mapować, tak jak powiedziałem wcześniej, w ten sposób <result name="*success">

0

Obecnie próbuję rozwiązać ten sam problem. Struktura byłaby miła, a ja mam tylko uszy, jeśli ktoś ją przetestował i zatwierdził. Powiedział, że nie mogę znaleźć czegoś wystarczająco dojrzałego, aby usprawiedliwiać przejście z Struts do widoku mobilnego.

Moim najlepszym rozwiązaniem jest obecnie tworzenie akcji dla każdej części mojej pełnej strony, która będzie wyświetlana w pełnych przeglądarkach. Następnie ponownie użyj tych działań, aby wyświetlać segmenty stron po stronie mobilnej.

Stwierdziłem, że próba stworzenia jednej strony dla przeglądarki komputerowej i przeglądarki mobilnej jednocześnie nie była zrównoważonym podejściem.

jQuery mobile wygląda jak bardzo obiecująca biblioteka do stylizacji elementów pozyskanych przez rozpórki.

Tak więc, chociaż z pewnością możliwe jest wpychanie obu wersji witryny do jednego działania, uważam, że poświęcenie czasu na stworzenie małych operacji wielokrotnego użytku, które doprowadzą do wycinków jsp, spłaci się w miarę skalowania aplikacji.

Oto kilka możliwości niedalekiej przyszłości:

(nie mogę dodać je jako linki jak ja nie mają wystarczającej reputacji ... będziesz musiał dodać „http: // www . ')

Struts2 jQuery Komórka projekt stronę: http://code.google.com/p/struts2-jquery/

Struts2 jQuery komórkowy projekt: code.google.com/p/struts2-jquery/downloads/detail?name=struts2-jquery-mobile-showcase-3.1 .1.war

przykład struts2 jQuery Mobile: weinfreund .de/struts2-jquery-mobile-showcase/index.action

@fajrian - użycie "agenta użytkownika" do określenia typu przeglądarki może stać się prawdziwym problemem, ponieważ coraz więcej przeglądarek mobilnych i stacjonarnych jest udostępnianych. Lepszym rozwiązaniem byłoby określenie, czy wyświetlić wersję mobilną, czy pełną wersję na podstawie wymiarów okna. A perfect example.

edycja - Sprawdź zapytania o media CSS3.

0

To działa dla mnie i powinien zasadniczo rozwiązać problem. Musisz jednak znać przynajmniej część ciągów agenta użytkownika:

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(); 
} 
Powiązane problemy