최근에 세션을 사용하고 싶지 않았습니다. 더 안전하고 안정적인 방법 토큰을 경험하고 브라우저 및 앱에 대한 통합 인터페이스를 작성하고 싶습니다. 그래서 훈련 프로그램의 프론트 데스크를 Ajax로 변경 한 다음 SpringMVC를 점프하여 전달을 제어했습니다. JSON 데이터 전송에 대한 더 깊은 이해가 있습니다. 나는 그것을 공유하고 나를 바로 잡을 것입니다.
SpringMVC에서는 JSON을 수락하는 몇 가지 방법을 선택할 수 있습니다. SpringMVC가 JSON을 어떻게 받아들이는지 이야기하기 전에 JSON이 무엇인지에 대해 이야기합시다. 나는 특정 정의에 대해 자세히 설명하지 않을 것입니다. JavaScript에서는 종종 이러한 방식으로 JSON 객체를 정의합니다.
var jsonobject = { "username": "admin", "password": 123}이 형식에서는이를 JSON 객체라고하며 JSON String이라는 개념도 있습니다. 이름에서 알 수 있듯이, 전체 전체는``또는 "" "를 문자열이라고 부릅니다. 우리는 문자열이 직접 출력 될 수 있지만 객체는 직접 출력 할 수 없습니다. JavaScript에서는 할 수 있습니다
// 객체 정의 jsonobjectvar jsonobject = { "username": "admin", "password": 123}; alert (jsonobject);현재 JSON 객체의 내용을 출력하지 않고 [Object Object]가 표시됩니다. JavaScript는 우리에게 두 가지 도구를 제공합니다
json.parse ()는 json 문자열을 JavaScript 객체로 변환하는 데 사용됩니다. json.stringify ()는 JavaScript 값을 JSON 문자열로 변환하는 데 사용됩니다.
그래서 우리가 입력 할 때
Alert (json.stringify (jsonobject));
{ "username": "admin", "password": 123}이 표시됩니다.
* 좋아요, 그게 전부 JSON의 설명입니다. SpringMVC에 대해 이야기합시다 *
JSON은 위의 두 가지 존재 방식을 가지고 있기 때문에 AJAX를 통해 값을 SpringMVC로 전달해야합니까?
먼저 JSON 객체를 직접 보내려고합니다
// JSON 객체 정의 var username = $ ( "#username"). val (); var password = $ ( "#password"). val (); var json = { "username": username, "password": password}; // jQuery ajax 요청 $ .ajax ({url : "jsontest", type : "post", "post", async : true : json, datatype : 'json', success (data) {if (data.userstatus === ")) {"#errorms (errorms ===). } else {if ($ ( "#errormsg"). length <= 0) {$ ( "form [name = loginform]").먼저 SpringMVC가 우리에게 제공하는 것에 대해 생각해 봅시다. @requestparam의 주석이 있습니다. 이 주석의 경우, 그 기능은 기본적으로 서블릿의 요청 .getParameter와 동일합니다. 우리는 먼저이 주석을 사용하여 그것을 얻습니다
@requestmapping ( "/jsontest") public void test (@requestparam (value = "username", required = true) 문자열 username, @requestparam (value = "password", required = true) {system.out.println ( "username :" + username); System.out.println ( "비밀번호 :" + 비밀번호); }배경에서 성공적으로 출력 한 매개 변수가 성공적으로 받아 들여졌습니다!
SpringMVC는 너무 똑똑합니다. @requestparam 주석을 제거하면 직접 두 값을 넣으면 어떻게됩니까?
@requestmapping ( "/jsontest") public void test (문자열 사용자 이름, 문자열 암호) {system.out.println ( "username :" + username); System.out.println ( "비밀번호 :" + 비밀번호); }실제로 성공했습니다. 나는 여기서 원리에 대해 자세히 설명하지 않을 것입니다. 관심있는 친구들은 요점을 깨고 살펴볼 수 있습니다.
SpringMVC는 @RequestBody를 제공합니다. @RequestBody는 전경 정의 컨텐츠 유형에 의해 전송 된 데이터를 처리하는 데 사용됩니다. 응용 프로그램/JSON, Application/XML 등과 같은 응용 프로그램/x-www-form-urlencoded 인코딩이 아닙니다.
신중한 친구들은 이전 AJAX에서 컨텐츠 유형 유형을 정의하지 않았으며 jQuery는 기본적으로 Application/X-WWW- 형태 방전 유형을 사용한다는 것을 발견했을 수 있습니다. 즉, SpringMVC의 @requestparam 주석 및 Servlet의 요청. getParameter는이 형식으로 전송 된 JSON 객체를 수락 할 수 있습니다.
왜! ? 나는 모든 사람이 GET 요청에 익숙하다고 생각합니다. URL? username =”admin”& password = 123의 형태로 서버에 매개 변수를 보냅니다. request.getParameter는이 매개 변수를받을 수 있습니다. 브라우저 주소 표시 줄에서 이것을 볼 수 있습니다. 우리가 Ajax에서 사용하고 JSON 객체를 보내는 게시물에 관해서는, 우리는 어떻게 백그라운드에서 얻을 수 있습니까? 답은 컨텐츠 유형의 인코딩 방법에 있으며 JSON 데이터를 String (username =”admin”& password = 123)으로 변환하고 URL에 추가하고 사용합니까? 세분화 (GET 메소드와 매우 유사합니다). 제출 방법이 게시되면 브라우저는 데이터를 HTTP 본체로 캡슐화 한 다음 서버로 보냅니다. 따라서 URL에 표시되지 않습니다. (이 단락은 약간의 비틀기 일 수 있습니다. 모든 사람이 신중하게 이해할 수 있기를 바랍니다.)
마침내 말하기를 마치고, 한숨을 쉬었다. 따라서 @RequestBody 주석을 사용하면 프론트 데스크의 내용 유형을 Application/JSON으로 변경해야합니다. 변경 사항이 없으면 프론트 데스크는 415 (지원되지 않은 미디어 유형)의 오류를보고합니다. 백그라운드 로그는 오류 콘텐츠 유형 'Application/X-www-form-urlencoded; charset = utf-8'가 지원되지 않습니다. 이 오류는 Eclipse의 Tomcat에 표시되지 않습니다. 로그가 사용될 때만 표시됩니다. 로그 구성 방법에 대한 이전 기사를 읽을 수 있습니다. 다음으로 올바르게 구성하겠습니다. 위에서 언급 한 내용은 컨텐츠 유형을 변경해야하며 데이터도 변경해야합니다. 이 주석 메소드는 JSON 객체 대신 JSON 문자열 만 허용합니다.
$ .ajax ({url : "jsontest", type : "post", async : true, contenttype : "application/json", data : json.stringify : 'json', success : function (data) {if (data.userstatus == "success") {$ ( "#errormsg"); ($ ( "#errormsg"). length <= 0) {$ ( "form [name = loginform]". Append (errormsg);배경도 변경됩니다. JSON은 실제로 키 값 쌍으로 이해 될 수 있으므로 MAP를 사용하여 문자열 또는 기타 데이터 유형을 추가로 처리합니다.
@requestmapping ( "/jsontest") public void test (@requestbody (request = true) map <string, object> map) {String username = map.get ( "username"). toString (); 문자열 비밀번호 = map.get ( "password"). toString (); System.out.println ( "사용자 이름 :" + username); System.out.println ( "비밀번호 :" + 비밀번호); }동시에, 나는 마법의 SpringMVC를 다시 기억했기 때문에 주석을 제거하고 시도하기로 결정했습니다. 좋아, 나는 널 포인터 오류로 결정적으로 폭발했다 ... 나는 그것을 막으려 고 노력했다.
SpringMVC는 또한 파라미터를 Pojo에 직접 바인딩하는 메소드를 제공합니다. 프론트 데스크는 동일하므로 게시하지 않습니다.
@requestmapping ( "/jsontest") public void test (@requestbody user user) {string username = user.getusername (); 문자열 암호 = user.getPassword (); System.out.println ( "사용자 이름 :" + username); System.out.println ( "비밀번호 :" + 비밀번호); }좋아, 이번에는 가치를 얻을 수 있습니다. 개인적으로 로그인과 같은 작은 데이터 볼륨을 업로드하는이 방법이 마음에 들지 않습니다. 사용자에는 많은 변수가 있습니다. 나는 그들 중 두 개만 사용했습니다. 사용자 객체를 만들 필요가 없습니다. 일반적으로 데이터 볼륨이 작을 때 별도의 값을 사용하여 얻는 것이 좋습니다. 다시 생각합시다. 만약 우리가 JSON 개체를 업로드한다면, 우리는 pojo를 바인딩 할 수 있습니까? 대답은 예입니다. @requestparam 주석을 사용하지 마십시오. 그렇지 않으면 필요한 사용자 매개 변수 '사용자'가 오류가 아닙니다. 설명은 기본적으로 여기에 있습니다. 아래에서 요약하겠습니다.
우리는 먼저 JSON 객체와 JSON 문자열에 대해 이야기합니다
그런 다음 SpringMVC가 2 ~ 2 개의 JSON 형식, 프론트 엔드 ContentType 설정 및 백엔드가 주석을 사용하여이를 수락하는지 여부를 수용하면 작은 서블릿을 언급했습니다.
Ajax가 Application/x-www-form-urlencoded 형식에 업로드되면 @requestparam 또는 servlet을 사용하여 백그라운드에서 얻을 필요가 있습니다. AJAX가 Application/JSON 형식으로 업로드되면 JSON 문자열을 사용하는 데 사용되며 배경은 @RquestBody를 사용하여 얻을 수 있습니다.
이것들은 하루 동안의 실험에 대한 요약입니다. 나는 그것이 당신을 도울 수 있기를 바랍니다. 오류가 있으면 나를 용서하고 수정하십시오.
SpringMVC에 의해 수락 된 JSON 매개 변수에 대한 위의 자세한 설명과 일반적인 오류 요약은 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.