Springブロックはcontroller層jsonデータの戻りを実現します.
17486 ワード
Controller層の役割は業務ロジックを処理してデータを返しますが、データはどうやって戻りますか?インターフェースの要求はHttpServletRequestとHttpServletResonseによって前後端のインタラクションを実現し、ServletReponseには一つのgetWriterオブジェクトがあり、PrintWriterのprint()方法によってデータをHttpServResponseの先端に転送することができます.
まず、リターンデータのmoduleを定義します.
スクリーンセーバーの定義が完了した後、配置しないと機能しません.従来のspringプロジェクトはXMLファイルの構成により、spring-bootはXMLなしの設定を実現するために、以下のように追加できます.
ここではスクリーン全体の核心であり、addInterceptorsインターフェースを実現することによって、自分が加えたいブロックを追加できます.また、ブロックを必要としないインターフェースを特別に配置することもできます.コードは簡単ですが、よく推測する価値があります.最適化できるところもたくさんあります.
まず、リターンデータのmoduleを定義します.
public class ResponseModel {
public static final int SUCCESS = 200;
public static final int ERROR = 100;
private Integer status;
private String message;
private Object data;
private Locale locale;
public ResponseModel(){
this.status = SUCCESS;
this.locale = Locale.CHINA;
}
public ResponseModel put(String key, Object value){
if(this.data == null || !(data instanceof Map)){
this.data = new HashMap();
}
Map map = (Map)this.data;
map.put(key,value);
return this;
}
public Object getData(){
return data;
}
public ResponseModel setData(Object data){
this.data = data;
return this;
}
public ResponseModel setErrorMsg(ErrorMsg errorMsg){
this.setStatus(errorMsg.getCode());
this.setMessage(errorMsg.getMessage());
return this;
}
public ResponseModel setStatus(int status){
this.status = status;
if(ERROR == status){
this.setMessage(" ");
}
return this;
}
public ResponseModel setMessage(String message){
this.message = message;
return this;
}
public int getStatus(){
return status;
}
public String getMessage(){
return message;
}
}
holder Bean, module Bean ,
@Component
public class ResponseHolder {
private static ThreadLocal
ErrorMsg ,
public enum ErrorMsg {
TEST(1,"test"),
SUCCESS(200," "),
LOGIN_FAIL(101," "),
LOGOUT_SUCCESS(104," "),
USER_NOT_FOUND(102," "),
USER_DISABLED(103," "),
NO_LOGIN(105," "),
VERIFY_CODE_ERROR(106," "),
SYSTEM_ERROR(100," ");
private int code;
private String message;
public int getCode(){
return code;
}
public String getMessage(){
return message;
}
ErrorMsg(int code, String message){
this.code = code;
this.message = message;
}
}
, controller holder HttpServletResponse ,
@Component
public class ResponseInterceptor implements HandlerInterceptor {
@Autowired
private ResponseHolder responseHolder;
private Logger logger = LogManager.getLogger(ResponseInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception{
return true;
}
@Override
public void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception{
//do noting
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) throws Exception{
if(responseHolder == null){
logger.error("system error", exception);
responseHolder.setErrorMsg(ErrorMsg.SYSTEM_ERROR);
}
String json = JSON.toJSONString(responseHolder.getModel());
this.returnJson(response,json);
responseHolder.clean();
}
private void returnJson(HttpServletResponse response, String json) throws Exception{
PrintWriter writer = null;
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=utf-8");
try {
writer = response.getWriter();
writer.print(json);
} catch (IOException e) {
logger.error("response error",e);
} finally {
if (writer != null)
writer.close();
}
}
}
springは、3つのpreHandle、postHandle、afterCompletion方法を提供します.preHandleは、トラフィックプロセッサ処理要求の前に呼び出しられ、 postHandleは、業務プロセッサ処理要求の実行が完了した後、ビューを生成する前に実行し、afterComplectionはDisplatServletで要求を完全に処理した後に呼び出しられ、リソースのクリーンアップなどに利用できます.スクリーンセーバーの定義が完了した後、配置しないと機能しません.従来のspringプロジェクトはXMLファイルの構成により、spring-bootはXMLなしの設定を実現するために、以下のように追加できます.
@Configuration
public class WebAppConfig extends org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter {
@Autowired
private ResponseInterceptor responseInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(responseInterceptor).addPathPatterns("/**").excludePathPatterns("/identifyCode/generate");
}
}
ここではスクリーン全体の核心であり、addInterceptorsインターフェースを実現することによって、自分が加えたいブロックを追加できます.また、ブロックを必要としないインターフェースを特別に配置することもできます.コードは簡単ですが、よく推測する価値があります.最適化できるところもたくさんあります.