이 글에서는 Spring mvc의 공통 Annotation을 주로 소개하며, @RequestMapping, @RequestParam, @ModelAttribute 등 유사한 Annotation을 자세히 소개하고 있으니 관심 있는 분들은 알아보세요
Spring은 버전부터 프로그래밍에 Annotation을 도입했습니다. 2.5. 사용자는 @RequestMapping, @RequestParam, @ModelAttribute 및 기타 유사한 주석을 사용할 수 있습니다. 지금까지 Spring 버전은 큰 변화를 겪었지만 Annotation의 기능은 계속해서 확장되어 개발자의 손을 더욱 쉽게 만들어주었습니다. 이는 Function의 힘과 불가분의 관계에 있습니다. 오늘은 Annotation에 대해 살펴보겠습니다. Spring MVC 4에서 일반적으로 사용됩니다.
1. @Controller
Controller는 애플리케이션에 대한 액세스를 제공하는 서비스 인터페이스를 통해 정의된 동작이며, 이를 모델로 변환한 다음 사용자에게 뷰를 제공합니다. Spring MVC는 @Controller를 사용하여 컨트롤러를 정의하며, 이를 통해 클래스 경로에 정의된 구성 요소가 자동으로 감지되고 자동 등록될 수 있습니다. 자동 감지를 적용하려면 XML 헤더 파일 아래에 spring-context를 도입해야 합니다:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="org.springframework.samples.petclinic.web"/> <!-- ... --></beans>
2. @RequestMapping
@RequestMapping 주석을 사용하여 " /favsoft"를 사용하여 클래스 전체 또는 특정 처리 방법을 지정할 수 있습니다. 일반적으로 클래스 수준 주석은 특정 요청 경로를 양식 컨트롤러에 매핑하는 반면, 메서드 수준 주석은 단순히 특정 HTTP 메서드 요청("GET", "POST" 등) 또는 HTTP 요청 매개변수에 매핑합니다.
@Controller @RequestMapping("/favsoft") public class AnnotationController { @RequestMapping(method=RequestMethod.GET) public String get(){ return ""; } @RequestMapping(value="/getName", method = RequestMethod.GET) public String getName(String userName) { return userName; } @RequestMapping(value="/{day}", method=RequestMethod.GET) public String getDay(Date day){ DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); return df.format(day); } @RequestMapping(value="/addUser", method=RequestMethod.GET) public String addFavUser(@Validated FavUser favUser,BindingResult result){ if(result.hasErrors()){ return "favUser"; } //favUserService.addFavUser(favUser); return "redirect:/favlist"; } @RequestMapping("/test") @ResponseBody public String test(){ return "aa"; } }
@RequestMapping은 클래스 수준과 메서드 수준 모두에 적용할 수 있습니다. 클래스 수준에서 정의되면 이 컨트롤러에서 처리하는 모든 요청이 /favsoft 경로에 매핑됨을 나타냅니다. @RequestMapping의 메소드 속성을 사용하여 메소드 유형을 지정하지 않으면 HTTP GET/POST 메소드를 사용하여 데이터를 요청할 수 있습니다. 해당 유형만 사용하여 데이터를 얻으세요.
@RequestMapping @Validated 및 BindingResult를 사용하여 입력 매개변수를 공동으로 확인할 수 있습니다. 확인이 성공하거나 실패하면 각각 다른 뷰가 반환됩니다.
@RequestMapping은 URI 템플릿을 사용하여 URL에 액세스하도록 지원합니다. URI 템플릿은 하나 이상의 변수 이름으로 구성된 URL과 유사한 문자열입니다. 이러한 변수에 값이 있으면 URI가 됩니다.
3. @PathVariable
Spring MVC에서는 @PathVariable을 사용하여 메서드 매개변수에 주석을 달고 이를 URI 템플릿 변수의 값에 바인딩할 수 있습니다. 다음 코드에 표시된 대로
String findOwner( String , Model model) { FavUser favUser = favUserService.findFavUser(); model.addAttribute( ; }
URI 템플릿 "favusers/{favUserId}"는 컨트롤러가 이 요청을 처리할 때 favUserId 값이 URI로 설정됩니다. 예를 들어 "favusers/favccxx"와 같은 요청이 있는 경우 favUserId의 값은 favccxx입니다.
@PathVariable은 다음과 같이 여러 주석을 가질 수 있습니다.
@RequestMapping(value="/owners/{ownerId}/pets/{petId}", method=RequestMethod.GET)public String findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) { Owner owner = ownerService.findOwner(ownerId); Pet pet = owner.getPet(petId); model.addAttribute("pet", pet); return "displayPet"; }
@PathVariable의 매개변수는 int, long, Date 등과 같은 간단한 유형일 수 있습니다. Spring은 이를 적절한 유형으로 자동 변환하거나 TypeMismatchException을 발생시킵니다. 물론 추가 데이터 유형을 지원하도록 등록할 수도 있습니다.
@PathVariable이 Map
@PathVariable은 매우 강력한 속성을 결정하는 정규식 사용을 지원하며 경로 템플릿에서 자리 표시자를 사용할 수 있고 특정 접두사 일치, 접미사 일치 및 기타 사용자 정의 형식을 설정할 수 있습니다.
@PathVariable도 행렬변수를 지원합니다. 실제 시나리오에서는 많이 사용되지 않기 때문에 자세히 소개하지 않겠습니다. 어린이용 신발이 필요한 경우 공식 웹사이트의 문서를 확인하세요.
4. @RequestParam
@RequestParam은 다음 코드와 같이 요청된 매개변수를 메서드의 매개변수에 바인딩합니다. 실제로 이 매개변수가 구성되지 않은 경우에도 주석은 기본적으로 이 매개변수를 사용합니다. 지정된 매개변수를 사용자 정의하려면 @RequestParam의 필수 속성을 false(예: @RequestParam(value="id",required=false))로 설정합니다.
5. @RequestBody
@RequestBody는 메서드 매개변수가 HTTP 요청 본문에 바인딩되어야 함을 의미합니다.
@RequestMapping(value = "/something", method = RequestMethod.PUT)public void handle(@RequestBody String body, Writer writer) throws IOException { writer.write(body); }
@RequestBody가 @RequestParam만큼 좋지 않다고 생각되면 HttpMessageConverter를 사용하여 요청 본문을 메서드 매개 변수로 전송할 수 있습니다. HttMessageConverser는 Object 개체 간에 HTTP 요청 메시지를 변환하지만 일반적으로 그렇지 않습니다. 완료. . REST 아키텍처를 구축할 때 @RequestBody는 @RequestParam보다 더 큰 장점이 있는 것으로 나타났습니다.
6. @ResponseBody
@ResponseBody는 @RequestBody와 유사하며 HTTP 응답 본문에 반환 유형을 직접 입력하는 기능입니다. @ResponseBody는 JSON 형식으로 데이터를 출력할 때 자주 사용됩니다. 코드는
@RequestMapping(value = "/something", method = RequestMethod.PUT)@ResponseBodypublic String helloWorld() { return "Hello World"; }
7입니다. 我们经常见到一些控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,@RestController用来创建REST类型的控制器,与@Controller类型。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody。 8. HttpEntity HttpEntity除了能获得request请求和response响应之外,它还能访问请求和响应头,如下所示: 9. @ModelAttribute @ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用,示例如下: @ModelAttribute方法用来在model中填充属性,如填充下拉列表、宠物类型或检索一个命令对象比如账户(用来在HTML表单上呈现数据)。 @ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另一种是该方法接受一个模型并添加任意数量的模型属性。用户可以根据自己的需要选择对应的风格。 @ModelAttribute作用在方法参数上 当@ModelAttribute作用在方法参数上时,表明该参数可以在方法模型中检索到。如果该参数不在当前模型中,该参数先被实例化然后添加到模型中。一旦模型中有了该参数,该参数的字段应该填充所有请求参数匹配的名称中。这是Spring MVC中重要的数据绑定机制,它省去了单独解析每个表单字段的时间。 @ModelAttribute是一种很常见的从数据库中检索属性的方法,它通过@SessionAttributes使用request请求存储。在一些情况下,可以很方便的通过URI模板变量和类型转换器检索属性。 위 내용은 Spring MVC에서 일반적으로 사용되는 주석 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!@RestController
public class FavRestfulController {
@RequestMapping(value="/getUserName",method=RequestMethod.POST)
public String getUserName(@RequestParam(value="name") String name){
return name;
}
}
@RequestMapping("/something")public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException {
String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader")); byte[] requestBody = requestEntity.getBody(); // do something with request header and body
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("MyResponseHeader", "MyValue"); return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}
@ModelAttribute
public Account addAccount(@RequestParam String number) {
return accountManager.findAccount(number);
}
@ModelAttribute
public void populateModel(@RequestParam String number, Model model) {
model.addAttribute(accountManager.findAccount(number));
// add more ...
}