Web application development. Part 3
Сервер (Java)
Добавьте зависимости в pom.xml
<code class="xml">
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.jvm.version>1.7</project.jvm.version>
<spring.version>3.2.2.RELEASE</spring.version>
<spring.security>3.1.4.RELEASE</spring.security>
<slf4j.version>1.5.6</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<hibernate.version>4.2.2.Final</hibernate.version>
<jackson.version>1.9.12</jackson.version>
<lombok.version>0.11.8</lombok.version>
<querydsl.version>3.2.0</querydsl.version>
<springkex.version>0.0.23-SNAPSHOT</springkex.version>
</properties>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jpamodelgen</artifactId>
<version>1.2.0.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
<version>${spring.security}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security}</version>
</dependency>
<dependency>
<groupId>opensymphony</groupId>
<artifactId>quartz</artifactId>
<version>1.6.3</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
<exclusions>
<exclusion>
<artifactId>commons-pool</artifactId>
<groupId>commons-pool</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>com.jolbox</groupId>
<artifactId>bonecp</artifactId>
<version>0.7.1.RELEASE</version>
</dependency>
</dependencies>
</code>Создадим папку java:

Создадим модель данных и слой доступа к данным (DAO):

Car.java
<code class="java">
@Entity
@Table(name = "cars")
public class Car implements Serializable {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "price")
private Long price;
public Car() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getPrice() {
return price;
}
public void setPrice(Long price) {
this.price = price;
}
}
</code>CarDao.java
<code class="java">public interface CarDao {
void add(Car car);
void update(Car car);
void delete(Car car);
Collection<Car> getCars(String search);
public List findByCar(String name, Long price);
}
</code>CarDaoImpl.java
<code class="java">public class CarDaoImpl implements CarDao {
@PersistenceContext
private EntityManager emf;
@Override
public void add(Car car) {
emf.persist(car);
}
@Override
public void update(Car car) {
emf.merge(car);
}
@Override
public void delete(Car car) {
emf.remove(emf.getReference(Car.class, car.getId()));
}
@Override
public Collection<Car> getCars(String search) {
if (null == search || search.trim().isEmpty()) {
return emf.createQuery(
"select c from Car c")
.getResultList();
}
return emf.createQuery(
"select c from Car c where c.name like :search")
.setParameter("search", search.trim() + "%")
.getResultList();
}
public List<Car> findByCar(String name, Long price) {
return emf.createQuery(
"select c from Car c where c.name = :name and c.price = :price")
.setParameter("name", name)
.setParameter("price", price)
.getResultList();
}
}
</code>• Метод getCars(String search) принимает значение поля поиска и если пусто — вернет все данные;• Метод findByCar(String name, Long price) используется для поиска дубликата при добавлении данных;
Создадим слой сервиса:

CarService.java
<code class="java">
public interface CarService {
Boolean add(Car car);
void update(Car car);
Collection<Car> getCars(String search);
void delete(Car car);
}
</code>CarServiceImpl.java
<code class="java">
public class CarServiceImpl implements CarService {
private CarDao carDao;
public CarDao getCarDao() {
return carDao;
}
public void setCarDao(CarDao carDao) {
this.carDao = carDao;
}
@Transactional
@Override
public Boolean add(Car car) {
List<Car> duplicate = carDao.findByCar(car.getName(), car.getPrice());
if (duplicate.isEmpty()) {
carDao.add(car);
return true;
}
return false;
}
@Transactional
@Override
public void update(Car car) {
carDao.update(car);
}
@Transactional
@Override
public Collection<Car> getCars(String search) {
return carDao.getCars(search);
}
@Transactional
@Override
public void delete(Car car) {
carDao.delete(car);
}
}
</code>Создадим контролер, который будет замапен на адрес /car для обработки запросов с клиента:

CarController.java
<code class="java">@Controller
@RequestMapping("/car")
public class CarController {
@Autowired
private CarService carService;
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public Collection<Car> getCars(String search) {
return carService.getCars(search);
}
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public ExtResult setCar(@RequestBody Car car) {
return new ExtResult(carService.add(car), car);
}
@RequestMapping(value = "{id}", method = RequestMethod.DELETE)
@ResponseBody
public String deleteCar(@RequestBody Car car) {
carService.delete(car);
return "delete";
}
@RequestMapping(value = "{id}", method = RequestMethod.PUT)
@ResponseBody
public String updateCar(@RequestBody Car car) {
carService.update(car);
return "update";
}
}
</code>• Каждый метод замапен на соответствующий запрос с клиента. Внедряем зависимость с помощью spring аннотации @Autowired и вызываем соответствующие методы у сервиса;
• ExtResult — вспомогательный класс. Используется для ответа клиенту, что сущность, которую пытаемся записать в БД, дубликат или не дубликат;
ExtResult.java
<code class="java">public class ExtResult {
private boolean success;
private Car data;
public ExtResult(boolean success, Car data) {
this.success = success;
this.data = data;
}
public ExtResult() {
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public Car getData() {
return data;
}
public void setData(Car data) {
this.data = data;
}
}
</code>Проверьте, что всё работает. Соберите проект с помощью maven install и запустите приложение.
You need to login to create comments.
Comments ()