Вы можете попробовать этот код. Я нашел его раньше, когда у меня возникла проблема, похожая на вашу.
if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
$Q1mrks = $_GET['q1mrks'];
$marks = $_GET['marks'];
$qt1 = $_GET['qt1'];
$qtype_qry = mysql_query("
SELECT *
FROM s_questiontypes
WHERE quetype_id = '$qt1'
");
$row = mysql_fetch_assoc($qtype_qry);
$qcode = $row['quetype_code'];
$sq_qry = "
SELECT *
FROM s_question
WHERE quetype_code = '$qcode'
ORDER BY RAND() LIMIT $Q1mrks
";
$sq_qry = mysql_query("
SELECT *
FROM s_question
WHERE quetype_code = '$qcode'
LIMIT $Q1mrks
");
while ($qrow = mysql_fetch_array($sq_qry)) {
$qm = $qrow['marks'] . "<br />";
$total += $qm . "<br />";
}
echo $total . "/" . $marks;
}
Использование Spring EL:
@Value("#{'${my.list.of.strings}'.split(',')}")
private List<String> myList;
Предполагая, что ваш файл свойств загружен правильно со следующим:
my.list.of.strings=ABC,CDE,EFG
Рассмотрите возможность использования Commons Configuration. Он имеет встроенную функцию для разбиения записи в файле свойств на массив / список. G0>
В соответствии с запросом, вот что вам нужно (на самом деле я не пробовал код, может получить некоторые типографии, пожалуйста, не стесняйтесь):
В конфигурации Apache Commons есть свойство PropertiesConfiguration. Он поддерживает функцию преобразования разделительной строки в массив / список.
Например, если у вас есть файл свойств
#Foo.properties
foo=bar1, bar2, bar3
С приведенным ниже кодом:
PropertiesConfiguration config = new PropertiesConfiguration("Foo.properties");
String[] values = config.getStringArray("foo");
предоставит вам строковый массив из ["bar1", "bar2", "bar3"]
. Для использования с Spring используйте это в своем контексте приложения xml:
<bean id="fooConfig" class="org.apache.commons.configuration.PropertiesConfiguration">
<constructor-arg type="java.lang.String" value="classpath:/Foo.properties"/>
</bean>
и получите это весной bean:
public class SomeBean {
@Value("fooConfig.getStringArray('foo')")
private String[] fooArray;
}
Я считаю, что это должно работать: P
, если использовать заполнители свойств, тогда пример ser1702544 станет
@Value("#{myConfigProperties['myproperty'].trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}")
С помощью заполнителя xml:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="properties" ref="myConfigProperties" />
<property name="placeholderPrefix"><value>$myConfigProperties{</value></property>
</bean>
<bean id="myConfigProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:myprops.properties</value>
</list>
</property>
</bean>
Начиная с Spring 3.0, вы можете добавить строку, как
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean" />
, к вашему applicationContext.xml
(или где вы настраиваете вещи). Как отмечает Дмитрий Чорный в комментарии, конфигурация на основе Java выглядит так:
@Bean public ConversionService conversionService() {
return new DefaultConversionService();
}
Это активирует новую службу конфигурации, которая поддерживает преобразование типов String
в Collection
. Если вы не активируете эту конфигурационную службу, Spring отказывается от своих устаревших редакторов свойств в качестве служб конфигурации, которые не поддерживают такой тип преобразования.
Также работает преобразование в коллекции других типов:
@Value("${my.list.of.ints}")
private List<Integer> myList
будет работать с линией, подобной
my.list.of.ints= 1, 2, 3, 4
Нет проблем с пробелом там, ConversionServiceFactoryBean
позаботится об этом.
В приложении Spring, вы обычно настраиваете экземпляр ConversionService на контейнер Spring (или ApplicationContext). Этот ConversionService будет выбран весной, а затем использоваться всякий раз, когда преобразование типа должно выполняться каркасом. [...] Если ConversionService не зарегистрирована в Spring, используется исходная система на основе PropertyEditor.
blockquote>
Задав файл my.list.of.strings=ABC,CDE,EFG
в файле .properties и используя
@Value("${my.list.of.strings}")
private String[] myString;
Вы можете получить массивы строк. И используя CollectionUtils.addAll(myList, myString)
, вы можете получить список строк.
Остерегайтесь пробелов в значениях. Я мог ошибаться, но я думаю, что пробелы в списке, разделенном запятыми, не усекаются с помощью @Value и Spel. Список
foobar=a, b, c
будет считан как список строк
"a", " b", " c"
. В большинстве случаев вам, вероятно, не нужны пробелы!
выражение
@Value("#{'${foobar}'.trim().replaceAll(\"\\s*(?=,)|(?<=,)\\s*\", \"\").split(',')}")
private List<String> foobarList;
предоставит вам список строк:
"a", "b", "c".
Регулярное выражение удаляет все пробелы непосредственно перед и сразу после запятой. Пробелы внутри значений не удаляются. Поэтому
foobar = AA, B B, CCC
должно приводить к значениям
"AA", "B B", "CCC".
Все приведенные выше ответы верны. Но вы можете добиться этого только в одной строке. Попробуйте выполнить декларацию, и вы получите все значения, разделенные запятыми, в списке String.
private @Value("#{T(java.util.Arrays).asList(projectProperties['my.list.of.strings'])}") List<String> myList;
А также вам нужно иметь следующую строку, определенную в вашей конфигурации xml.
<util:properties id="projectProperties" location="/project.properties"/>
просто замените путь и имя файла вашего файла свойств. И тебе хорошо идти. :)
Надеюсь, это вам поможет. Приветствия.
Если вы читаете это, и используете Spring Boot, у вас есть еще один вариант для этой функции
. Обычно список с запятой очень неуклюжий для случая использования в реальном мире (и иногда даже невозможно, если вы хотите использовать запятые в своей конфигурации):
email.sendTo=somebody@example.com,somebody2@example.com,somebody3@example.com,.....
С помощью Spring Boot вы можете записать его так (начало индекса в 0):
email.sendTo[0]=somebody@example.com
email.sendTo[1]=somebody2@example.com
email.sendTo[2]=somebody3@example.com
И использовать его например:
@Component
@ConfigurationProperties("email")
public class EmailProperties {
private List<String> sendTo;
public List<String> getSendTo() {
return sendTo;
}
public void setSendTo(List<String> sendTo) {
this.sendTo = sendTo;
}
}
@Component
public class EmailModel {
@Autowired
private EmailProperties emailProperties;
//Use the sendTo List by
//emailProperties.getSendTo()
}
@Configuration
public class YourConfiguration {
@Bean
public EmailProperties emailProperties(){
return new EmailProperties();
}
}
#Put this in src/main/resource/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=example.compackage.YourConfiguration
Считаете ли вы @Autowired
конструктором или установщиком и String.split()
в теле?
class MyClass {
private List<String> myList;
@Autowired
public MyClass(@Value("${my.list.of.strings}") final String strs) {
myList = Arrays.asList(strs.split(","));
}
//or
@Autowired
public void setMyList(@Value("${my.list.of.strings}") final String strs) {
myList = Arrays.asList(strs.split(","));
}
}
Я предпочитаю делать свое автоувеличивание одним из этих способов, чтобы повысить проверяемость моего кода.
вы можете сделать это с помощью аннотаций, подобных этому
@Value("#{T(java.util.Arrays).asList('${my.list.of.strings:a,b,c}')}")
private List<String> mylist;
. Здесь my.list.of.strings будут выбраны из файла свойств, если его там нет, то по умолчанию a, b, c будет использоваться
и в вашем файле свойств вы можете иметь что-то вроде этого
my.list.of.strings = d, e, f