2013-12-18 3 views
1

Мне любопытно, как лучше справиться с этим, я хотел бросить вызов себе и посмотреть, могу ли я сломаться в HashMapkey,value (или String, String), строка который может вернуться практически в любом формате.Разбор строки с несколькими вариантами

строка в вопросе:

/user/2/update?updates=success

Вот так, запрос URL для сервера. Проблема - как мы все знаем, это может быть что угодно, она может вернуться в любой форме. Я хотел разбить его так, что он будет выглядеть следующим образом:

Controller => user 
action => update 
params => ??? (theres a 2, a update=success ...) 

Очевидно Выше не настоящий Java объект.

Но у вас есть идея.

Что вам нужно? что вы наделали? Что ты пытаешься сделать?

Что я хочу сделать, это сопоставить это с контроллером и действием при прохождении параметров по пути. Но мне нужно разделить это, убедившись, что каждый шаг определяет, что есть.

То, что я сделал это:

private Filter parseRoute(String route){ 
    String[] parsedRoute = route.split("[?:/=]"); 
    Filter filter = new Filter(parsedRoute); 
    return filter; 
} 

расколы на любую вещь, которая находится в URL (обратите внимание, : будет что-то вроде /user:id/update так: user/2/update ...)

Затем я попытался :

public class Filter { 

    private HashMap<String, String> filterInfo; 

    public Filter(String[] filteredRoute){ 
     if(filteredRoute.length > 0){ 
      filterInfo.put("Controller", filteredRoute[0]); 

     }else{ 
      throw new RoutingException("routes must not be empty."); 
     } 
    } 
} 

Но это не сработает, как я ожидал ... Поскольку слишком много переменных в игре. , включая параметры перед действием (они будут использоваться только для поиска этого пользователя), их могут быть вложенными маршрутами, поэтому несколько controller/action/controller/action ..

Как вы справитесь с этим? Что ты предлагаешь? Как вы могли обойти это? Если вы просто сделаете что-то вроде:

route(controller, action, params, template);? (template позволяет визуализировать jsp). если да, то как вы относитесь к ?update=success

Я использую HttpServer для настройки основ. Но теперь я потерян. Я пытаюсь сохранить маршрутизацию как общий и «сделай все, что захочешь, мы сопоставим ее с правильным контроллером, действием и передадим параметры», но я думаю, что я откусил больше, чем я могу пережевывать.

Я рассмотрел как искровой, так и пружинный каркас, и решил, что маршрут, который вы пройдете, мы сопоставим с XML-файлом, чтобы найти контроллер и действие, мне просто нужна структура данных, чтобы сделать это ...

Итак, я ищу, чтобы вернуться и по-прежнему идти «передам мне что-то, плохо отобразите это».

+0

Это собирается быть реальной проблемой, так как параметры HTTP фактически образуют 'Multiset' просто сами по себе. «/ user/2/update? updates = success & updates = success & updates = fail» –

+0

Я бы использовал существующий HTTP-парсер (возможно, Apache), потому что это классическая нетривиальная задача, которая была решена много раз. –

+0

Есть ли какие-либо примеры использования инструментов апачей? – TheWebs

ответ

0

я бы, вероятно, использовать URL от апача,

org.apache.tomcat.util.net.URL url = null; 
try { 
    url = new org.apache.tomcat.util.net.URL("/user/2/update?updates=success"); 
    // ... do some stuff with it... 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
0

java.net.URI может вам помочь.

вы можете получить свой путь по GetPath()

и получить все запроса на GetQuery(), то вы можете разделить запрос по = парам имя-значение.

URI uri = new URI("/user/2/update?updates=success"); 
    // /user/2/update 
    System.out.println("path is " + uri.getPath()); 
    // updates=success 
    System.out.println("query is " + uri.getQuery()); 
+0

несколько запросов, несколько путей, как это работает: '/ library/6/books/10/chapter/6/paragraph/2/update? Update = sucess? Someparam = fff? SomeOtherParam? = Fff' – TheWebs

+0

multiple запрос разделен на «&» не «?», вы можете сначала разделить на «&», а затем использовать «=» для разделения имени и значения – oxygen

Смежные вопросы