2016-10-27 2 views
2

У меня есть этот код, на мой взгляд, для отображения окна ввода и кнопки отправки. (ОБНОВЛЕНО)Метод доступа в контроллере с точки зрения

<form action="/hms/accommodations" method="GET"> 
     <input type="text" name="searchKeyword"/> 
     <input type="submit" value="Submit"/> 
    </form> 

Как я нажимаю кнопку отправки, мне нужно пройти независимо от пользователя, введенные в поле ввода быть переложены на метод в моем контроллере.

Это метод, который у меня есть в контроллере. (ОБНОВЛЕНО)

@RequestMapping(value = "/hms/accommodations", method = RequestMethod.GET) 
public List<Accommodation> listofAccomo(@RequestParam String searchKeyword){ 
    List<Accommodation> searchResult = accommodationService.findAllAccommodationBySearchBox(searchKeyword); 
    return searchResult; 
} 

У меня есть это в моем AccommodationService классе:

public abstract List<Accommodation> findAllAccommodationBySearchBox(String searchKeyword); 

И это на другом классе:

public List<Accommodation> findAllAccommodationBySearchBox(String searchKeyword){ 
    TypedQuery<Accommodation> searchResult = em.createNamedQuery("findAllAccommodationBySearch", Accommodation.class); 
    searchResult.setParameter("searchKeyword",'%'+searchKeyword+'%'); 
    List<Accommodation> result=searchResult.getResultList(); 
    return result; 
} 

У меня есть эта NamedQuery в моем домене .:

@NamedQueries(
{ 
@NamedQuery(
    name = "findAllAccommodationBySearch", 
    query = "SELECT a FROM Accommodation a WHERE a.person.firstName LIKE :searchKeyword OR a.person.middleName LIKE :searchKeyword OR a.person.lastName LIKE :searchKeyword OR a.room.roomNumber LIKE :searchKeyword OR a.person.pvId LIKE :searchKeyword OR a.startDate LIKE :searchKeyword OR a.endDate LIKE :searchKeyword" 
    ) 
}) 

Что происходит заключается в том, что когда я нажимаю кнопку «Отправить» после ввода, он перенаправляется на ту же страницу, но с другим URL-адресом, но, похоже, он не получает доступ к моему методу Controller, потому что он не возвращает значение, которое он должен был вернуть. Что я упускаю здесь? Надеюсь, кто-то может помочь. Благодаря!

EDIT: Это мой класс кода контроллера.

import java.io.UnsupportedEncodingException; 
import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.TypedQuery; 
import javax.servlet.http.HttpServletRequest; 
import javax.validation.Valid; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.http.HttpHeaders; 
import org.springframework.http.HttpStatus; 
import org.springframework.http.ResponseEntity; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.validation.BindingResult; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.ResponseBody; 
import org.springframework.web.util.UriComponentsBuilder; 
import org.springframework.web.util.UriUtils; 
import org.springframework.web.util.WebUtils; 

import ph.com.smesoft.hms.domain.Accommodation; 
import ph.com.smesoft.hms.service.AccommodationService; 
import ph.com.smesoft.hms.service.PersonService; 
import ph.com.smesoft.hms.service.RoomService; 

@Controller 
@RequestMapping("/accommodations") 
public class AccommodationController { 

@RequestMapping(value = "/{id}", method = RequestMethod.GET, headers = "Accept=application/json") 
    @ResponseBody 
    public ResponseEntity<String> showJson(@PathVariable("id") Long id) { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("Content-Type", "application/json; charset=utf-8"); 
     try { 
      Accommodation accommodation = accommodationService.findAccommodation(id); 
     if (accommodation == null) { 
       return new ResponseEntity<String>(headers, HttpStatus.NOT_FOUND); 
      } 
      return new ResponseEntity<String>(accommodation.toJson(), headers, HttpStatus.OK); 
     } catch (Exception e) { 
      return new ResponseEntity<String>("{\"ERROR\":"+e.getMessage()+"\"}", headers, HttpStatus.INTERNAL_SERVER_ERROR); 
     } 
    } 
[1:49:35 AM] Kath Revilla: @RequestMapping(headers = "Accept=application/json") 
    @ResponseBody 
    public ResponseEntity<String> listJson() { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("Content-Type", "application/json; charset=utf-8"); 
     try { 
      List<Accommodation> result = accommodationService.findAllAccommodations(); 
      return new ResponseEntity<String>(Accommodation.toJsonArray(result), headers, HttpStatus.OK); 
     } catch (Exception e) { 
      return new ResponseEntity<String>("{\"ERROR\":"+e.getMessage()+"\"}", headers, HttpStatus.INTERNAL_SERVER_ERROR); 
     } 
    } 

@RequestMapping(method = RequestMethod.POST, headers = "Accept=application/json") 
    public ResponseEntity<String> createFromJson(@RequestBody String json, UriComponentsBuilder uriBuilder) { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("Content-Type", "application/json"); 
     try { 
      Accommodation accommodation = Accommodation.fromJsonToAccommodation(json); 
      accommodationService.saveAccommodation(accommodation); 
      RequestMapping a = (RequestMapping) getClass().getAnnotation(RequestMapping.class); 
      headers.add("Location",uriBuilder.path(a.value()[0]+"/"+accommodation.getId().toString()).build().toUriString()); 
      return new ResponseEntity<String>(headers, HttpStatus.CREATED); 
     } catch (Exception e) { 
      return new ResponseEntity<String>("{\"ERROR\":"+e.getMessage()+"\"}", headers, HttpStatus.INTERNAL_SERVER_ERROR); 
     } 
    } 


@RequestMapping(value = "/jsonArray", method = RequestMethod.POST, headers = "Accept=application/json") 
    public ResponseEntity<String> createFromJsonArray(@RequestBody String json) { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("Content-Type", "application/json"); 
     try { 
      for (Accommodation accommodation: Accommodation.fromJsonArrayToAccommodations(json)) { 
       accommodationService.saveAccommodation(accommodation); 
      } 
      return new ResponseEntity<String>(headers, HttpStatus.CREATED); 
     } catch (Exception e) { 
      return new ResponseEntity<String>("{\"ERROR\":"+e.getMessage()+"\"}", headers, HttpStatus.INTERNAL_SERVER_ERROR); 
     } 
    } 

@RequestMapping(value = "/{id}", method = RequestMethod.PUT, headers = "Accept=application/json") 
    public ResponseEntity<String> updateFromJson(@RequestBody String json, @PathVariable("id") Long id) { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("Content-Type", "application/json"); 
     try { 
      Accommodation accommodation = Accommodation.fromJsonToAccommodation(json); 
      accommodation.setId(id); 
      if (accommodationService.updateAccommodation(accommodation) == null) { 
       return new ResponseEntity<String>(headers, HttpStatus.NOT_FOUND); 
      } 
      return new ResponseEntity<String>(headers, HttpStatus.OK); 
     } catch (Exception e) { 
      return new ResponseEntity<String>("{\"ERROR\":"+e.getMessage()+"\"}", headers, HttpStatus.INTERNAL_SERVER_ERROR); 
     } 
    } 

@Autowired 
    AccommodationService accommodationService; 

@Autowired 
    PersonService personService; 

@Autowired 
    RoomService roomService; 


@RequestMapping(produces = "text/html") 
    public String list(@RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, @RequestParam(value = "sortFieldName", required = false) String sortFieldName, @RequestParam(value = "sortOrder", required = false) String sortOrder, Model uiModel) { 
     if (page != null || size != null) { 
      int sizeNo = size == null ? 10 : size.intValue(); 
      final int firstResult = page == null ? 0 : (page.intValue() - 1) * sizeNo; 
      uiModel.addAttribute("accommodations", Accommodation.findAccommodationEntries(firstResult, sizeNo, sortFieldName, sortOrder)); 
      float nrOfPages = (float) accommodationService.countAllAccommodations()/sizeNo; 
      uiModel.addAttribute("maxPages", (int) ((nrOfPages > (int) nrOfPages || nrOfPages == 0.0) ? nrOfPages + 1 : nrOfPages)); 
     } else { 
      uiModel.addAttribute("accommodations", Accommodation.findAllAccommodations(sortFieldName, sortOrder)); 
     } 
     addDateTimeFormatPatterns(uiModel); 
     return "accommodations/list"; 
    } 

@RequestMapping(value = "/hms/accommodations", method = RequestMethod.GET) 
public List<Accommodation> listofAccomo(@RequestParam String searchKeyword){ 
    List<Accommodation> searchResult = accommodationService.findAllAccommodationBySearchBox(searchKeyword); 
    return searchResult; 
} 

void addDateTimeFormatPatterns(Model uiModel) { 
     uiModel.addAttribute("accommodation_startdate_date_format","yyyy-MM-dd"); 
     uiModel.addAttribute("accommodation_enddate_date_format","yyyy-MM-dd"); 
    } 

void populateEditForm(Model uiModel, Accommodation accommodation) { 
     uiModel.addAttribute("accommodation", accommodation); 
     addDateTimeFormatPatterns(uiModel); 
     uiModel.addAttribute("people", personService.findAllPeople()); 
     uiModel.addAttribute("rooms", roomService.findAllRooms()); 
    } 

String encodeUrlPathSegment(String pathSegment, HttpServletRequest httpServletRequest) { 
     String enc = httpServletRequest.getCharacterEncoding(); 
     if (enc == null) { 
      enc = WebUtils.DEFAULT_CHARACTER_ENCODING; 
     } 
     try { 
      pathSegment = UriUtils.encodePathSegment(pathSegment, enc); 
     } catch (UnsupportedEncodingException uee) {} 
     return pathSegment; 
    } 




} 
+0

Можете ли вы предоставить полный код класса контроллера? – developer

+0

@javaguy Я отредактировал вопрос и включил код класса контроллера. –

ответ

2

Проблема заключается в том, что в вашем методе контроллера вы ожидаете параметр пути, тогда как в форме вы передаете параметр запроса. Я хотел бы изменить метод, чтобы принять параметр запроса, как

@RequestMapping(value = "/hms/accommodations", method = RequestMethod.GET) 
public List<Accommodation> listofAccomo(@RequestParam String searchKeyword){ 
    List<Accommodation> searchResult = accommodationService.findAllAccommodationBySearchBox(searchKeyword); 
    return searchResult; 
} 

Есть два изменения:

  1. Изменено отображение, чтобы соответствовать форме действия
  2. Made searchKeyword параметр запроса, а не путь переменная.

Также в форме вам не нужно часть параметра запроса в действии, как он будет заменен браузером во время покориться и данные будут добавлены в качестве параметра запроса:

<form action="/hms/accommodations" method="GET"> 
    <input type="text" name="searchKeyword"/> 
    <input type="submit" value="Submit"/> 
    </form> 
+0

Я пробовал это, но он все равно ничего не возвращает. Я пробовал печатать строки между кодами, чтобы проверить, проходит ли она по каждой строке, но не распечатала ни одной вещи. Все еще запутано, почему он не может получить доступ к методу контроллера. –

+0

Вы можете получить доступ к методу контроллера от любого другого клиента? завиток, браузер? – Bijoy

+0

На самом деле, когда я нажимаю кнопку «Отправить», он переходит к этому URL: http: // localhost: 8080/hms/accommodation? SearchKeyword = keyword «Ключевое слово» - это слово, которое я набрал в поле ввода. Означает ли это, что я могу получить доступ к методу контроллера? –

0

Проблема в том с текущим кодом, окончательный URL становится ниже: /размещение/HMS/размещение

другими словами, общий URL = @RequestMapping на уровне класса + @RequestMapping на уровне метода (всего URL является то, что отображение весной обработчик видит & затем карты/определяет для вызова соответствующего метода)

Вариант (1):

Таким образом, чтобы сделать его работу, вы должны удалить @RequestMapping ("/ размещение") на верхнем (уровне класса) класса

контроллер:

@Controller 
public class AccommodationController { 
    @RequestMapping(value = "/hms/accommodations", method = RequestMethod.GET) 
    public List<Accommodation> listofAccomo(@RequestParam String searchKeyword){ 
     List<Accommodation> searchResult = accommodationService.findAllAccommodationBySearchBox(searchKeyword); 
     return searchResult; 
    } 
    //add all other methods 
} 

HTML:

<form action="/hms/accommodations" method="GET"> 
     <input type="text" name="searchKeyword"/> 
     <input type="submit" value="Submit"/> 
     </form> 

Вариант (2): Вы можете изменить свою форму, как показано ниже с действием в качестве "/ жилье/HMS/жилые помещения":

класса

Контроллер:

@Controller 
@RequestMapping("/accommodations") 
    public class AccommodationController { 
     @RequestMapping(value = "/hms/accommodations", method = RequestMethod.GET) 
     public List<Accommodation> listofAccomo(@RequestParam String searchKeyword){ 
      List<Accommodation> searchResult = accommodationService.findAllAccommodationBySearchBox(searchKeyword); 
      return searchResult; 
     } 
     //add all other methods 
    } 

HTML:

<form action="/accommodations/hms/accommodations" method="GET"> 
    <input type="text" name="searchKeyword"/> 
    <input type="submit" value="Submit"/> 
    </form> 
+0

С моим текущим кодом, URL становится ** "localhost: 8080/hms/accommodation? SearchKeyword = keyword" ** после нажатия submit. –

+0

Это то, что вы увидите в браузере, для которого не указан URL-адрес контроллера – developer

+0

Можете ли вы попробовать мой вариант (2) выше? – developer

Смежные вопросы