図1に示すように、コントローラ層
MVCコントローラの設計層は、制御層に属し;に設計された:要求を受け入れ、要求に応答するため、層は、可能な限り薄く、ビジネス・プロセスに関連するコードを書く避けるために。
設計モードの開発の前端と後端とを分離し、それが推奨され@RestController組み合わせ@ResponseBody + @Controller使用に対応する注釈を、。
1)@RestController Controllerクラスを除く注釈は、この方法では、コンテンツは、JSON文字列に戻るデフォルトのターンの内容を返された、またはHTML、viewresolver InternalResourceViewResolver動作不能設定、コントローラーのJSPページを返すことができない場合。
あなたが特定のページに戻る必要がある場合2)は、ジョブInternalResourceViewResolverビューリゾルバと@Controller使用する必要があります。
あなたがJSON、XMLまたはページへのカスタムMEDIATYPEコンテンツを返すために必要がある場合は、対応するメソッド@ResponseBodyコメントを追加する必要があります。
要約すると、注釈@Controllerの使用は、対応する方法で、パーサは、リターンJSPのビューを解析するhtmlページ、および該当ページにジャンプして、ページには、JSONなどを返却する場合は、注釈を追加する必要が@ResponseBody
1)パス設定要求
(「/ページ」)を@PostMapping注釈を使用して、クラス名とメソッド名が上の追加することができます。
なお、異なるビジネス用途に応じて分け、無差別使用の走り書きを避けます。
2)設定要求モード
通常のPOST / GET。使用注:@RequestMappingと@GetMapping @PostMapping。
Spring4.3マッピング方法を簡素化する{@ GetMapping、@ PostMapping、@ PutMapping、@ DeleteMapping、@ PatchMapping}の導入及びHTTP共通セマンティクスよりよい方法注釈付き
注釈HTTPは、具体的な処理方法にマップされます
アノテーションを@GetMappingする(メソッド= RequestMethod.GET)を@RequestMapping略語である組み合わせのものです
アノテーションを@PostMappingする(メソッド= RequestMethod.POST)を@RequestMapping略語である組み合わせのものです
3)設定要求パラメトリック
①フォーム提出、直接または特定のパラメータ名VOは、受信しました。
@Controller
public class LoginController {
@RequestMapping(value = "login", method = RequestMethod.POST)
public String login(UserVO user){
System.out.println("POJO: " + user.getClass().getName() +
", hash code: " + user.hashCode() + ", " + user.toString());
return "redirect:/";
}
}
② @RequestParam
@RequestParam(値= ""、必要=真、はdefaultValue = "")
@RequestParamは、3つの属性があります。
(1)値:リクエストパラメータ名(設定されなければなりません)
(2)必要:デフォルトは真である必要があれば、それは、例外が(オプション)スローされていない場合、すなわち、要求は、パラメータを含める必要があります
(3)はdefaultValue:値が設定されている場合は、デフォルト値、自動的にfalseに設定所要
@ApiOperation(value = "根据id查询")
@PostMapping("/show")
public Responses show(@RequestParam(value="userId",defaultValue="-1") Long userId) {
Record data = recordService.getOne(vo.getId());
return Responses.success(data);
}
③のn-提出し、注釈の@RequestBodyを使用しています。
バックエンド(リクエストボディデータ)に渡された遠位JSON文字列データを受信するため@RequestBody主POSTメソッドは、モード要求なし体を取得ので、GET遠位提出を使用することができない、@RequestBodyデータを受信使用しますデータはではなく、POSTメソッドで提出しました。)同じ受信機のバックエンド方式では、RequestBody及び@RequestParam()を同時に使用することができる@、@ RequestBodyだけで多くても1つ、及び@RequestParam(持つことができるより多くを有することができます。
注:リクエスト、唯一requestBody;リクエストが複数RequestParamを持つことができます。
@ApiOperation(value = "根据id查询")
@PostMapping("/get")
public Responses getOne(@Validated @RequestBody IdVO vo){
Record data = recordService.getOne(vo.getId());
return Responses.success(data);
}
④ athVariable
@RestController
@RequestMapping("/")
public class ChineseDrugController {
@ResponseBody
@RequestMapping(value = "/{name}")
public String showName(@PathVariable String name, @PathVariable(value = "name", required = false) String sex) {
return "Hello " + name + sex;
}
⑤ @fthfrm
URL:http://127.0.0.1:8080/sexvalue/namevalue?name=唐&セックス=男
@RestController
@RequestMapping(value = "/{sex}")
public class ChineseDrugController {
@ResponseBody
@RequestMapping(value = "/{name}")
public String showName(@PathVariable(value = "name") String name, @PathParam(value = "sex") String sex) {
return "Hello " + name + " " + sex;
}
}
注意:上記のコードはちょうど良い柔軟性の機能を示すことであるので、実際の開発には、任意の使用を避けること。
4)検証要求パラメータ
パラメータチェック
①自動校正パラメータは注釈のスプリングコンテックスという効果を取るように、@Validatedアノテーションを使用して、
②voクラスカスタムなど@NotNull、などすべての種類を、確認してください、彼はここでのjavax検証-APIの注釈の下で繰り返されていません。
③プログラムレベルチェック。
実施例の方法
@ApiOperation(value = "应用类型和应用关系绑定")
@PostMapping("/applicationTypeBind")
public Boolean applicationTypeBind(@Validated @RequestBody ApplicationBindVO vo){
applicationTypeService.applicationTypeBind(vo);
return true;
}
例に対応するVOクラス
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Set;
@Data
@ApiModel(value = "ApplicationBindVO",description = "关系绑定vo")
public class ApplicationBindVO {
@NotNull
@ApiModelProperty("应用类型id")
private Long typeId;
@ApiModelProperty("应用id集合")
private List<Long> applicationIdList;
}
5)パラメトリック設計パラメータに
ベースのビジネスは、可能な限り統一フォーマットとしてであってもよいです。
遠位の応答パラメータ(APP / PC)、典型的には、再カプセル化層、便利な単一のフロントエンドは、以下を返します
Responses.success(data);
import com.fasterxml.jackson.annotation.JsonView;
import com.myfutech.common.util.enums.ResponseCode;
import com.myfutech.common.util.vo.BaseView;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@ApiModel(value = "Responses",description = "响应信息")
public class Responses<T> {
@JsonView({BaseView.class})
@ApiModelProperty("响应编码")
private String code;
@JsonView({BaseView.class})
@ApiModelProperty("响应消息")
private String msg;
@JsonView({BaseView.class})
@ApiModelProperty("响应体")
private T result;
public static <T> Responses<T> success() {
return new Responses(ResponseCode.SUCCESS_CODE, "", (Object)null);
}
public static <T> Responses<T> success(T result) {
return new Responses(ResponseCode.SUCCESS_CODE, "", result);
}
public static <T> Responses<T> success(String msg, T result) {
return new Responses(ResponseCode.SUCCESS_CODE, msg, result);
}
public static <T> Responses<T> error(String msg) {
return new Responses(ResponseCode.ERROR_CODE, msg, (Object)null);
}
public static <T> Responses<T> error(ResponseCode code) {
return new Responses(code, code.getDefaultMsg(), (Object)null);
}
public static <T> Responses<T> error(ResponseCode code, String msg) {
return new Responses(code, msg, (Object)null);
}
public Responses() {
}
private Responses(ResponseCode code, String msg, T result) {
this.code = code.getCode();
this.msg = msg;
this.result = result;
}
public String getCode() {
return this.code;
}
public boolean notSuccess() {
return !ResponseCode.SUCCESS_CODE.getCode().equals(this.code);
}
public String getMsg() {
return this.msg;
}
public T getResult() {
return this.result;
}
public void setCode(String code) {
this.code = code;
}
public void setMsg(String msg) {
this.msg = msg;
}
public void setResult(T result) {
this.result = result;
}
}
6)自動インターフェースドキュメントを生成します
使用SwaggerAPI、
共通アノテーション
//加载类名之上
@Api(tags = "日志相关接口", description="操作日志",
consumes= MediaType.APPLICATION_JSON_UTF8_VALUE,
produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
//加在方法名之上
@ApiOperation(value = "查询分页列表")
//加载实体或VO类名之上
@Data
@ApiModel(value = "ApprovalRoleModifyVO",description = "审批角色修改信息")
public class ApprovalRoleModifyVO{
@Api:クラス、具体的な実施内容のクラスラベルに作用します。このクラスは、リソースの闊歩を示すフラグです。
パラメータ:
①tags:あなたがタグを使用することができます()あなたの代わりにプロパティを使用するのでは、操作のために複数のタグのプロパティを設定することができます。
②description:記述は、そのような効果を記述してもよいです。
@ApiOperation:httpリクエストの動作を指示するための方法。
@ApiModel:メソッド、フィールド、または説明モデル属性の変更操作に関するデータ
図2に示すように、比較的標準的なコントローラクラスの例
package com.myfutech.employee.service.provider.ctrl;
import com.myfutech.common.util.Responses;
import com.myfutech.common.util.vo.IdVO;
import com.myfutech.common.util.vo.Page;
import com.myfutech.common.util.vo.Pageable;
import com.myfutech.employee.service.api.vo.response.record.RecordListVo;
import com.myfutech.employee.service.provider.model.Record;
import com.myfutech.employee.service.provider.service.RecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 相关接口
*/
@Api(tags = "日志相关接口", description="操作日志",
consumes= MediaType.APPLICATION_JSON_UTF8_VALUE,
produces=MediaType.APPLICATION_JSON_UTF8_VALUE)
@RestController
@RequestMapping("/record")
public class RecordCtrl {
private static final Logger log = LoggerFactory.getLogger(RecordCtrl.class);
@Resource(name="recordService")
private RecordService recordService;
@ApiOperation(value = "查询分页列表")
@PostMapping("/page")
public Page<RecordListVo> page( @RequestBody Pageable pageable){
Page<RecordListVo> list = recordService.findConditionPage(pageable);
return list;
}
@ApiOperation(value = "根据id查询")
@PostMapping("/get")
public Responses getOne(@Validated @RequestBody IdVO vo){
Record data = recordService.getOne(vo.getId());
return Responses.success(data);
}
@ApiOperation(value = "新增")
@PostMapping("/add")
public Responses add(@Validated(Record.Create.class) @RequestBody Record data){
recordService.save(data);
return Responses.success();
}
@ApiOperation(value = "更新")
@PostMapping("/update")
public Responses update(@Validated(Record.Update.class) @RequestBody Record data){
recordService.save(data);
return Responses.success();
}
@ApiOperation(value = "删除")
@PostMapping("/delete")
public Responses delete(@Validated @RequestBody IdVO vo){
recordService.deleteById(vo.getId());
return Responses.success();
}
}