JavaRush /Java блогы /Random-KK /Көктем қорқынышты емес. Cookie файлдары және тақырыптар
Павел
Деңгей

Көктем қорқынышты емес. Cookie файлдары және тақырыптар

Топта жарияланған
МАҚАЛАЛАР ЦИКЛІНІҢ МАЗМҰНЫ Қайталау – білімнің анасы! Сондықтан, алдыңғы мақалаларға сүйене отырып, жаңа веб-серіппелі жобаны жасайық: MobilePhonePayment Connect h2, Lombok. Нысан деңгейін жасаңыз: BalancePhoneEntity Integer идентификаторы; бүтін санТелефон; Жол атауыCustomer; Бүтін баланс; Әдістері бар қызметтер қабатын жасаңыз: - Дерекқордағы барлық жазбаларды іздеу - Жазбаны идентификатор бойынша іздеу - Жазбаны телефон нөмірі бойынша іздеу - Жазбаны пайдаланушы аты бойынша іздеу (жазбалар парағын қайтару керек, атаулар мүмкін бірдей болсын)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- Дерекқорға жазба қосу - Идентификатор бойынша дерекқордан жазбаны жою - Бизнес әдісі: Телефон балансын толтыру - әдіс телефон нөмірін, соманы (Бүтін түрі) алуы және сәйкес нөмірдің қалдығын көрсетілгенге көбейтуі керек. сомасы.
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
DTO-дан нысанға және кері салыстыруды енгізуді ұмытпаңыз. Dto нысанға ұқсас болады: BalancePhoneDto Integer идентификаторы; бүтін санТелефон; Жол атауыCustomer; Бүтін баланс; DTO қабатын жасаңыз, InitiateUtils класын жасаңыз және дерекқорды деректермен толтырыңыз: id 1, телефон нөмірі 555000, баланс 100, тұтынушы Ivan id 2, телефон нөмірі 444000, теңгерім 250, тұтынушы Марья id 3, телефон нөмірі 111000, баланс 60, тұтынушы Ivan Create демалыс контроллері, бірақ оны әдістермен толтыруға асықпаңыз. Егер сіз алдыңғы мақаланы орындасаңыз, онда барлық жазбаларды көрсету әдісі келесідей болуы керек еді (мен қазір мақалаға түсініктемелерді қарауды ұсынамын - әсіресе Васorй Бабиннің түсініктемесінде):
//поиск записи по id - старая version
@GetMapping(value = "/find-phone/{id}")
public ResponseEntity<BalanceDto> findPhone(@PathVariable Integer id) {
    BalanceDto balanceDto = balanceService.findById(id);
    return balanceDto != null
            ? new ResponseEntity<>(balanceDto, HttpStatus.OK)
            : new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
ResponseEntity-ті конструкторды қолданбай пайдаланудың тағы бір жолы бар. Біз оны пайдалануды жалғастырамыз. ResponseEntity екі кірістірілген құрастырушы интерфейсін көрсетеді: HeadersBuilder және оның ішкі интерфейсі, BodyBuilder. Сондықтан біз олардың мүмкіндіктеріне ResponseEntity статикалық әдістері арқылы қол жеткізе аламыз. Толығырақ осы мақалада оқи аласыз . Демалыс контроллерінің әдістерін келесідей орындауға болады: 1) Жазбаны идентификатор бойынша көрсету
//поиск записи по id
@GetMapping(value = "/find-number-phoneById/{id}")
public ResponseEntity<?> findNumberPhoneById(@PathVariable Integer id) {
    BalanceDto balanceDto = balanceService.findById(id);
    return balanceDto != null
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
Біз Postman-да сынақтан өткіземіз (біз бұл туралы алдыңғы мақалада айтқанбыз, міне, осы бағдарлама бойынша тағы бір шағын нұсқаулық ). Біз іске қосамыз, GET сұрау түрін таңдаймыз, URL жолына жазамыз: http://localhost:8080/find-number-phoneById/1 – сұрау жолында id параметрін өткіздік, шығыста біз жазбаны аламыз id 1-ге тең. Жаңа codeты қосқаннан кейін жобаны қайта бастауды ұмытпаңыз😇 2) Жазбаларды аты бойынша көрсету
//поиск записи по имени пользователя
@GetMapping(value = "/find-number-phoneByName/{name}")
public ResponseEntity<?> findNumberPhone(@PathVariable String name) {
    List<BalanceDto> balanceDto = balanceService.findByNameCustomer(name);
    return balanceDto != null &&  !balanceDto.isEmpty()
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
Жаңа сұраныс жасайық, GET сұрау түрін таңдап, URL жолына жазыңыз: http://localhost:8080/ find-number-phoneByName/Ivan - сұраныс жолында атау параметрін өткіздік, ал шығыста біз Ivanға тең тапсырыс беруші аты бар жазбалар тізімін алыңыз. Шығармада сіз мынаған ұқсас нәрсені аласыз: %D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20%D0%BE%D1%88%D0%B8%D0 % B1%D0%BA%D0%B0 Бұл қате емес - бұл сұрауды codeтау мүмкіндіктері, ол туралы оқыңыз . Міне , бұл болмас үшін Postmanды қалай конфигурациялау керектігі жазылған . 3) Барлық жазбаларды шығару:
//поиск всех записей
@GetMapping(value = "/findAll")
public ResponseEntity<?> findAll() {
    List<BalanceDto> balanceDto = balanceService.findAll();
    return balanceDto != null &&  !balanceDto.isEmpty()
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
Біз жаңа сұраныс жасаймыз, GET сұрау түрін таңдаймыз, URL жолына жазыңыз: http://localhost:8080/findAll - біз мұнда ешқандай параметрлерді өткізбейміз. 4) Жаңа жазба қосу:
//добавление новой записи
@PostMapping(value = "/entry")
public ResponseEntity<?> entryNumber(@RequestBody BalanceDto dto){
    balanceService.save(dto);
    return ResponseEntity.ok().body(HttpStatus.CREATED);
}
Біз жаңа сұрау жасаймыз, POST сұрау түрін таңдап, URL жолына жазамыз: http://localhost:8080/entry. Бұл сұрауда біз JSON пішіміндегі нысанды беруіміз керек. Сұрау терезесінде Негізгі қойындысына өтіп, жалаушаны өңделмеген күйге орнатыңыз, Мәтін жанындағы көрсеткіні басып, JSON таңдаңыз. Келесі JSON файлын терезеге көшіріңіз:
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
Сұрауды орындауды басқан кезде жауап күйі ҚҰРЫЛДЫ. Енді findAll сұрауын қайтадан сұраңыз және жаңа жазба пайда болғанына көз жеткізіңіз. 5) идентификатор бойынша жазбаны жою
//удаление записи по id
@DeleteMapping(value = "/delete-phoneById/{id}")
public ResponseEntity<?> delete(@PathVariable Integer id) {
    balanceService.delete(id);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Біз жаңа сұраныс жасаймыз, DELETE сұрау түрін таңдаймыз, URL жолына жазамыз: http://localhost:8080/delete-phoneById/4 – сұрау жолында id параметрін өткіздік, шығыста OK күйін аламыз. . Енді барлығын табу үшін тағы бір сұрау жасаңыз және Сашаның жоқ екеніне көз жеткізіңіз. 6) Нөмірді идентификатор бойынша өзгерту
//изменение номера телефона по id
@PutMapping(value = "/change")
public ResponseEntity<?> changeNumberPhone(
//можно добавлять несколько параметров в request
        @RequestParam(value = "id") Integer id, //добавor один параметр
        @RequestParam(value = "phoneNumber") Integer phoneNumber) //добавor второй параметр
 {
    BalanceDto byId = balanceService.findById(id);
    byId.setNumberPhone(phoneNumber);
    balanceService.save(byId);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Біз жаңа сұрау жасаймыз, PUT сұрау түрін таңдап, URL жолына жазамыз: http://localhost:8080/change. Бұл сұраныста бірнеше параметрлер бар және көріп отырғаныңыздай, біз оларды бұрынғыдай сұрау жолында өткізбейміз. @RequestParam annotationсы әдістегі параметрлер үшін пайдаланылады. Параметрлерді Postman арқылы тасымалдау үшін сұрау терезесіндегі Параметрлер қойындысына өтіп, Кілт бағанында параметрдің атын (id) және Мән бағанында мәнді (1) көрсету керек. Екінші параметрмен де солай істейміз, Key = phoneNumber, Value = 888000. Сұрау жолына назар аударыңыз, Пошташы параметрлерді дұрыс беру үшін оны өзгертті. Шығыс OK күйін көрсетеді. Енді findAll сұрауын қайтадан сұраңыз және бірінші жазбаның телефон нөмірі өзгергеніне көз жеткізіңіз. 7) Телефон балансын толтырыңыз
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(
        //можно добавлять несколько параемров в request
        @RequestParam(value = "phoneNumber") Integer phoneNumber,//добавor один параметр
        @RequestParam(value = "sum") Integer sum) //добавor второй параметр
{
    balanceService.addingMoneyToBalance(phoneNumber, sum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Біз жаңа сұрау жасаймыз, PUT сұрау түрін таңдап, URL жолына жазамыз: http://localhost:8080/add. Телефон нөмірін 888000, қосындыны 130 етіп орнатамыз. Шығару OK күйін көрсетеді. Енді findAll сұрауын қайта іске қосыңыз және бірінші жазбаның балансының өзгергеніне көз жеткізіңіз. 8) Сұраныс органы арқылы PUT - жіберілген деректерді ашпау үшін мұны жасаған дұрыс
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(@RequestBody BalanceDto dto){
    balanceService.addingMoneyToBalance(dto.getPhoneNumber, dto.getSum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Біз JSON жібереміз
{
        "numberPhone": 888000,
       //  "nameCustomer" можно вообще не указывать
        "balance": 130
}
Соңында біз Cookie файлына көшеміз. Cookie дегеніміз не ? Қарапайым тілмен айтқанда: Cookie файлдары браузер бір рет қолданбадан алған деректерді сақтайды, содан кейін оларды сайтта қайталап пайдалануға болады. Сіз екі негізгі нәрсені білуіңіз керек: қалай жазу керек және cookie файлын қалай оқу керек. Жазу жолы: Бүкіл Spring Web MVC екі нысанның айналасында құрастырылған Servlet API-нің үстінде жүзеге асырылады - клиенттің сұрауы HttpSerlvetRequest ішіне оралады және жауап codeпен толтырылған HttpServletResponse арқылы жасалады. Осы нысандарға қол жеткізу арқылы сіз бүкіл HTTP сеансын толық басқара аласыз. Spring web бұл нысандарға тікелей қол жеткізуге мүмкіндік береді. Әдетте Cookie, контроллерде әдісті жасайық
//записать куки
 @GetMapping(value = "/set-cookie")
public ResponseEntity<?> setCookie(HttpServletResponse response) throws IOException {
     Cookie cookie = new Cookie("data", "Come_to_the_dark_side");//создаем an object Cookie,
     //в конструкторе указываем значения для name и value
     cookie.setPath("/");//устанавливаем путь
     cookie.setMaxAge(86400);//здесь устанавливается время жизни куки
     response.addCookie(cookie);//добавляем Cookie в request
     response.setContentType("text/plain");//устанавливаем контекст
     return ResponseEntity.ok().body(HttpStatus.OK);//получилось How бы два раза статус ответа установor, выбирайте Howой вариант лучше
 }
http://localhost:8080/set-cookie мекенжайы бойынша Postman-да GET сұрауын жасайық және нәтиже жақсы болады. Терезенің үстінде Cookie(1) жазуын табыңыз, оны басу арқылы біз жіберген cookie файлдарын көресіз. Аты: деректер, мән: қараңғылық_жағына келіңіз. Java тіліндегі Cookie класының негізгі мүмкіндіктері туралы ақпарат . Қалай оқу керек: Оқыған да оңай
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
@CookieValue ішінде біз мәнін оқитын cookie файлының атын көрсетеміз және жауапта оқылған мәнді көрсетеміз. Come_to_the_the_dark_side Енді ең жақсы сағат келді Тақырып ( тақырыптар , PHP туралы мақаланы қарамаңыз, оқу өте пайдалы): Алдымен тақырыптарды қалай оқуға болатынын көрейік:
//прочитать заголовки
@GetMapping(value = "/get-headers")
public ResponseEntity<?> getHeaders(@RequestHeader Map<String, String> headers){//представляет заголовки ввиде мапы,
    //где ключ это наименование заголовка, а meaning мапы - это meaning заголовка
    return ResponseEntity.ok(headers);
}
Негізгі жұмысты @RequestHeader Map<String, String> орындайды , ол карта түріндегі тақырыптарды көрсетеді, мұнда кілт тақырыптың аты, ал картаның мәні тақырыптың мәні болып табылады. Бұл әдісті браузер арқылы сынау қызықтырақ, браузерді ашыңыз, іздеу жолағына http://localhost:8080/get-headers теріңіз, нәтижесінде біз тақырыптардың кең тізімін аламыз. Олардың не үшін қажет екенін түсіну үшін әр тақырыпты Google арқылы іздеңіз. Википедия сонымен қатар тақырыптар тізімін ұсынады. «Егер біреу бірдеңені оқыса, оны біреу жазып алды» деген ескі бағдарламалау сөзі бар. Тақырыпты жазып алайық
//записать заголовок
@GetMapping(value = "/set-header")
public ResponseEntity<?> setHeader(){
    return ResponseEntity.ok().header("name-header","value-header").body(HttpStatus.OK);
}
Мұнда біз ResponseEntity класының арнайы тақырып әдісін қолдандық . Мұндағы "name-header" - тақырыптың атауы, ал "мән-тақырып" - тақырыптың мәні. Тақырыптармен жұмыс істеудің басқа нұсқалары бар
//еще варианты работы с заголовками
@GetMapping(value = "/set-headers")
public ResponseEntity<?> setHeaders() {
    HttpHeaders httpHeaders = new HttpHeaders();//создаем an object
    //который имплементирует мапу MultiValueMap<String, String>
    //наполняем ее парами ключ-meaning
    //можно наполнить своими заголовками через метод add
    httpHeaders.add("customer-header", "value-header1");
    //HttpHeaders так же предлагает большой выбор стандартных заголовков
    //Посмотрите на них набрав в IDEA HttpHeaders.
    httpHeaders.add(HttpHeaders.FROM, "russia");
    //можно изменить существующий заголовок, вызвав для него сет-метод
    httpHeaders.setDate(0);
    //or получить meaning конкретного заголовка
    Long date = httpHeaders.getDate();
    System.out.println(date);
    return ResponseEntity
            .ok().headers(httpHeaders)//здесь метод принимающий MultiValueMap<String, String>
            .body(HttpStatus.OK);
}
Мұнда MultiValueMap<String, String> түріндегі мәнді қабылдайтын ResponseEntity класының басқа әдісін қолданамыз . Сондай-ақ, оның браузерде қалай жұмыс істейтінін тексеру көбірек ақпаратты болады. Біз http://localhost:8080/set-headers мекенжайына барамыз, күй дұрыс деген жауап аламыз. Егер сіз керемет болсаңыз және Google Chrome-ды пайдалансаңыз, Ctrl + Shift + I пернелер тіркесімін басып , «Әзірлеуші ​​​​құралдары» бөліміне өтіңіз, содан кейін жоғарғы панельдегі Желі қойындысын іздеңіз , оны басу арқылы жазбаны іздеңіз: set-headers ( егер ол жоқ болса, бетті жаңартыңыз) сол жерді нұқыңыз және ашылатын терезеде Тақырыптар қойындысын таңдаңыз және ResponseHeaders ішінде біз тақырыптарымызды көреміз. Тақырыптармен танысу үшін әзірге бұл жеткілікті. Енді оқыңыз: ResponseEntity<!--?--> зерттеу және көктемгі контроллерлерде одан құтылу Осыған орай, демалысымды алуға рұқсат етіңіз 🤓, тағы кездескенше...
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION