Список файлов в каталоге текущего файла JAR

Если вы используете одну и ту же ViewModel для обеих вкладок, я рекомендую не использовать ajax, так как вам не нужно больше запросов, если у вас есть достаточно данных для отображения.

       <ul class="nav nav-tabs in" id="your_id">
        <li><a data-toggle="tab" href="#timeline">Time Line</a></li>
        <li><a data-toggle="tab" href="#settings">Time Line</a></li>
       </ul>
     <div id="tab-content" class="tab-content">
      <div class="tab-pane" id="timeline">@{ Html.RenderPartial("ViewName", Model)}</div>
      <div class="tab-pane" id="timeline">@{ Html.RenderAction("ActionName", "ControllerName", new { routeParams})}</div>
    </div>

Таким образом, вы можете выбрать, использовать частичную визуализацию и передать модель в качестве параметра и имени представления, или вы можете выполнить Render Action, он будет выполнять запрос и возвращать представление.

14
задан VonC 6 December 2008 в 21:57
поделиться

4 ответа

Старый код java1.4, но это дало бы Вам идею:

private static List getClassesFromJARFile(String jar, String packageName) throws Error
{
    final List classes = new ArrayList();
    JarInputStream jarFile = null;
    try
    {
        jarFile = new JarInputStream(new FileInputStream(jar));
        JarEntry jarEntry;
        do 
        {       
            try
            {
                jarEntry = jarFile.getNextJarEntry();
            }
            catch(IOException ioe)
            {
                throw new CCException.Error("Unable to get next jar entry from jar file '"+jar+"'", ioe);
            }
            if (jarEntry != null) 
            {
                extractClassFromJar(jar, packageName, classes, jarEntry);
            }
        } while (jarEntry != null);
        closeJarFile(jarFile);
    }
    catch(IOException ioe)
    {
        throw new CCException.Error("Unable to get Jar input stream from '"+jar+"'", ioe);
    }
    finally
    {
        closeJarFile(jarFile);
    }
   return classes;
}
private static void extractClassFromJar(final String jar, final String packageName, final List classes, JarEntry jarEntry) throws Error
{
    String className = jarEntry.getName();
    if (className.endsWith(".class")) 
    {
        className = className.substring(0, className.length() - ".class".length());
        if (className.startsWith(packageName))
        {
            try
            {
                classes.add(Class.forName(className.replace('/', '.')));
            } catch (ClassNotFoundException cnfe)
            {
                throw new CCException.Error("unable to find class named " + className.replace('/', '.') + "' within jar '" + jar + "'", cnfe);
            }
        }
    }
}
private static void closeJarFile(final JarInputStream jarFile)
{
    if(jarFile != null) 
    { 
        try
        {
            jarFile.close(); 
        }
        catch(IOException ioe)
        {
            mockAction();
        }
    }
}
7
ответ дан 1 December 2019 в 16:15
поделиться

Вероятно, лучший подход должен перечислить классы во время компиляции.

Существует хрупкий подход во время выполнения. Возьмите Вас Class (MyClass.class из this.getClass()). Звонить getProtectionDomain. Звонить getCodeSource. Звонить getLocation. Звонить openConnection. (Кроме того, откройте ресурс.) Бросок к JarURLConnection. Звонить getJarFile. Звонить entries. Выполните итерации посредством проверки getName. Я действительно не рекомендую этот подход.

1
ответ дан 1 December 2019 в 16:15
поделиться

Помните, что файлы JAR являются просто zip-файлами, переименованными, и очень легко считать содержание zip-файлов в Java:

    File jarName = null;
    try
    {
        jarName = new File (Dir.class.getProtectionDomain().getCodeSource().getLocation().toURI());
    }
    catch (Exception e)
    {
        e.printStackTrace();    
    }

    try 
    {
      ZipFile zf=new ZipFile(jarName.getAbsoluteFile());
      Enumeration e=zf.entries();
      while (e.hasMoreElements()) 
      {
          ZipEntry ze=(ZipEntry)e.nextElement();
          System.out.println(ze.getName());
      }
      zf.close();
   } catch (IOException e) 
   {
      e.printStackTrace();
   }
0
ответ дан 1 December 2019 в 16:15
поделиться

Это не возможно, поскольку Java не обеспечивает прямой доступ к файлу банки, классы загружаются из. Вы могли попытаться проанализировать java.class.path системное свойство для нахождения его, но это не будет работать при всех обстоятельствах. Или Вы могли ограничить на том, где файл банки должен находиться или предоставить список классов по-другому (например, через файл манифеста).

-1
ответ дан 1 December 2019 в 16:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: