Все говорят использовать isset () - что, вероятно, будет работать для вас.
Однако важно понимать разницу между
$_POST['x'] = NULL;
и $_POST['x'] = '';
isset($_POST['x'])
вернет false
в первом примере, но вернет true
на второй, даже если вы попытаетесь распечатать один из них, оба возвращают пустое значение.
Если ваш $_POST
поступает из введенного пользователем поля / формы и остается пустым, я ВЕРЮ (я не на 100% уверен в этом), что значение будет «", но NOT NULL.
Даже если это предположение неверно (кто-то, пожалуйста, поправьте меня, если я ошибаюсь!) выше все еще полезно знать для будущего использования.
Первое и самое важное - все компоненты Spring управляются - они «живут» внутри контейнера, называемого «контекстом приложения».
Во-вторых, каждое приложение имеет точку входа в этот контекст. У веб-приложений есть сервлет, JSF использует el-resolver и т. Д. Также есть место, где контекст приложения загружается, а все bean-компоненты - автоматически подключаются. В веб-приложениях это может быть прослушиватель запуска.
Автоматическое подключение происходит путем помещения экземпляра одного компонента в желаемое поле в экземпляре другого компонента. Оба класса должны быть bean-компонентами, т.е. они должны быть определены для работы в контексте приложения.
Что «живет» в контексте приложения? Это означает, что объект контекст создает экземпляры, а не вы. Т.е. - вы никогда не делаете new UserServiceImpl ()
- контейнер находит каждую точку инъекции и устанавливает там экземпляр.
В ваших контроллерах у вас есть только следующее:
@Controller // Defines that this class is a spring bean
@RequestMapping("/users")
public class SomeController {
// Tells the application context to inject an instance of UserService here
@Autowired
private UserService userService;
@RequestMapping("/login")
public void login(@RequestParam("username") String username,
@RequestParam("password") String password) {
// The UserServiceImpl is already injected and you can use it
userService.login(username, password);
}
}
Несколько примечаний:
applicationContext.xml
вы должны включить
, чтобы классы сканировались на предмет аннотаций @Controller
, @Service
и т. д. UserServiceImpl
также должен быть определен как bean - либо с использованием
, либо с использованием аннотации @Service
. Поскольку это будет единственный разработчик UserService
, он будет внедрен. @Autowired
, Spring может использовать конфигурируемое XML автосоединение. В этом случае во все поля, которые имеют имя или тип, совпадающие с существующим bean-компонентом, автоматически внедряется bean-компонент. Фактически, это была первоначальная идея автосоединения - вводить в поля зависимости без какой-либо конфигурации. Также можно использовать другие аннотации, такие как @Inject
, @Resource
. Зависит от того, пошли ли вы по маршруту аннотаций или по маршруту определения XML-компонента.
Допустим, у вас есть bean-компоненты, определенные в вашем applicationContext.xml
:
<beans ...>
<bean id="userService" class="com.foo.UserServiceImpl"/>
<bean id="fooController" class="com.foo.FooController"/>
</beans>
Автоматическое подключение происходит при запуске приложения. Итак, в fooController
, который ради аргументов хочет использовать класс UserServiceImpl
, вы должны аннотировать его следующим образом:
public class FooController {
// You could also annotate the setUserService method instead of this
@Autowired
private UserService userService;
// rest of class goes here
}
Когда он видит @Autowired
, Spring будет искать класс, соответствующий свойству в applicationContext
, и автоматически вводить его. Если у вас более одного bean-компонента UserService
, вам необходимо указать, какой из них он должен использовать.
Если вы сделаете следующее:
UserService service = new UserServiceImpl();
Он не подберет @Autowired
, если вы не установите его самостоятельно.