Вы используете макет Bootstrap (fluidPage
, fluidRow
, column
), и вся идея такого макета заключается в отзывчивости.
Страница считается шириной 12, и превышение ее элементов приведет к переносу в новые строки. Это предполагаемое поведение Bootstrap.
Одним из способов решения вашей проблемы является использование flexbox .
Решение : (Отказ от ответственности: работает только на Chrome и Firefox)
Я внес два изменения в ваш код:
column
на div
с пользовательским классом CSS под названием custom-column
. column(4,x)
- div(class = "custom-column", x)})
flex-nowrap
в fluidRow
. fluidRow(class="flex-nowrap", lapply(alld$ui,function(x){div(class = "custom-column", x)}))
С этими изменениями макет работает, как вы и предполагали, в chrome и firefox , но не работает в IE или браузере в RStudio.
Полный код, включая классы CSS flex-nowrap
и custom-column
:
library(shiny)
ui <- fluidPage(
fluidRow(
tags$head(tags$style("
.flex-nowrap {
display: inline-flex;
-webkit-flex-wrap: nowrap !important;
-ms-flex-wrap: nowrap !important;
flex-wrap: nowrap !important;
flex-direction: row;
}
.custom-column {
width: 200px;
margin: 0px 10px;
}
"
)),
actionButton("addCol","Add New Column"),
div(style="overflow-x: auto;",
uiOutput("myUI")
)
)
)
server <- function(input, output, session) {
alld <- reactiveValues()
alld$ui <- list()
observeEvent(input$addCol,{
alld$ui[[length(alld$ui)+1]] <- verbatimTextOutput("aaa", placeholder = T)
output$myUI <- renderUI({
fluidRow(class="flex-nowrap", lapply(alld$ui,function(x){div(class = "custom-column", x)}))
})})
}
shinyApp(ui, server)
Выходные данные :
Можно создать сервлет, отображающийся как это:
<servlet-mapping>
<servlet-name>MappingServlet</servlet-name>
<url-pattern>path/*</url-pattern>
</servlet-mapping>
Шаблон URL должен быть отредактирован для удовлетворения потребностям. Необходимо, конечно, создать сервлет для отображения URL на фактический jsp. Эта техника используется большинством платформ MVC.
UrlRewrite является хорошим гибким основанным на Java независимым от платформы решением.
Это лучше, чем Сервлет, отображающийся в web.xml
, потому что это слишком ограничено в том, что можно сделать, и лучше, чем основанное на Apache решение, потому что это - часть веб-приложения, таким образом, Вы не должны помещать Apache перед своим сервером приложений.
Отобразите .jsp как сервлет, но используйте <jsp-файл> тег вместо <отображающего URL> тега.
<servlet>
<servlet-name>myjsp</servlet-name>
<jsp-file>/myjsp.jsp</jsp-file>
</servlet>
RewriteEngine On
RewriteRule ^([0-9a-zA-Z]+)$ $1.jsp
В Вашем .htaccess должен переписать все URL к .jsp. Таким образом, search.jsp просто будет поиском, как Вы описали.
Если Вы выбираете Apache, переписывают правило, а не отображение/фильтр сервера приложений (как я сделал), Вы могли бы также хотеть сделать, больше, чем просто ищут "^ ([0-9a-zA-Z] +) $"
Можно хотеть подтвердить, что URL не является каталогом или файлом, который действительно существует, если апач выходит и служит non-jsp ресурсам. И подтвердите, что JSP существует, и сделайте передачу через, а не перенаправьте и добавьте любую возможную строку запроса.
RewriteCond %{REQUEST_URI} !^/.*\.(jsp)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.jsp -f
RewriteRule ^(.+)$ /$1.jsp [PT,QSA,L]
И удостоверяться, что пользователи только видят это через поиск/, не/search.jsp затем, Вы хотите переписать реверс также
RewriteRule ^(.+)\.jsp$ $1 [R=301,QSA,L]
RewriteRule ^(.+)index$ $1 [R=301,QSA,L]
Это - хорошая идея в целях SEO так, чтобы поисковые системы не звенели Вы для дублирования содержания в нескольких URL.
Я не эксперт JSP, но я думаю, что можно определить отображения URL в web.xml для обеспечения псевдонимов для сервлетов и jsps.