SpringMVC-Controller (2)


Controller Return Type

  • String:jspファイルパスの名前変更
  • void:呼び出しURLの同名jsp
  • オブジェクトタイプ


    主にJSONデータの生成に用いられる.
    Jackson-databindライブラリの使用
    @GetMapping("/ex06")
    public @ResponseBody SampleDTO ex06() {
        log.info("/ex06..........");
        SampleDTO dto = new SampleDTO(); //Bean 객체
        dto.setAge(10);
        dto.setName("홍길동");
        return dto
    }

    ResponseEntityタイプ


    HTTPヘッダに関しては、ResponseEntityを使用してデータを転送できます
    	@GetMapping("/ex07")
    	public ResponseEntity<String> ex07() {
    		log.info("/ex07.........................");
    		String msg = "{\"name\": \"홍길동\"}";
    		HttpHeaders header = new HttpHeaders();
    		header.add("Content-Type", "application/json;charset=UTF-8");
    		return new ResponseEntity<>(msg,header,HttpStatus.OK);
    	}

    ファイルアップロード処理


    commonsファイルを使用してアップロード

  • dependency
  • <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.3</version>
    </dependency>
    @GetMapping("/exUpload")
    public void exUpload() {		
        log.info("/exUpload..................");
    }
    	
    @PostMapping("/exUploadPost")
    public void exUploadPost(ArrayList<MultipartFile> files) {
    	files.forEach(file -> {
    		log.info("------------------------------");
    		log.info("name:" + file.getOriginalFilename());
    		log.info("size:"+file.getSize());
    	});
    }
    <%@ page language="java" contentType="text/html; charset=EUC-KR"
        pageEncoding="EUC-KR"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="EUC-KR">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="/sample/exUploadPost" method="post" enctype="multiPART/form-data">
    	<div><input type='file' name='files'></div>
    	<div><input type='file' name='files'></div>
    	<div><input type='file' name='files'></div>
    	<div><input type='file' name='files'></div>
    	<div><input type='file' name='files'></div>
    	<div><input type='submit'></div>
    </form>
    </body>
    </html>

    コントローラ異常処理


    SpringMVC@ExceptionHandlerと@Controller Addviceで処理
    @ResponseEntityの例外メッセージ構成を使用して処理できます.

    @ControllerAdvice


    側面向けのプログラミング(AOP)をどのように使用しますか?
    共通の関心事を分けるということだ.例えば、Web上で最も一般的な状況は何ですか?404 notfoundなどのエラーアクセスの処理が最も共通の問題の一つである可能性があると思います.

    ex)

    @ControllerAdvice
    @Log4j
    public class CommonExceptionAdvice {
    	@ExceptionHandler(Exception.class)
    	public String except(Exception ex, Model model) {
    		log.error("Exception ...." + ex.getMessage());
    		model.addAttribute("exception",ex);
    		log.error(model);
    		return "error_page";
    	}
    }
    <%@ page language="java" contentType="text/html; charset=EUC-KR"
        pageEncoding="EUC-KR"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="EUC-KR">
    <title>Insert title here</title>
    </head>
    <body>
    	<h4><c:out value="${exception.getMessage() }"></c:out></h4>
    	<ul>
    		<c:forEach items="${exception.getStackTrace() }" var="stack">
    			<li><c:out value="${stack }"></c:out></li>
    		</c:forEach>
    	</ul>
    </body>
    </html>
    コントローラのアシスタントは、@ControllerAdviceコントローラで発生した異常を処理します.同じ役を演じる.クラスで、@ExceptionHandlerに適用され、コンテンツは特定の例外タイプを処理する.Exceptionクラスはこの宣言の内部に適用されるため、すべての例外に対して処理されます.
    通常、コントローラは異なるパッケージを作成することによって異常処理を処理し、servlet-context.xmlにコンポーネントスキャンを追加する必要があります.

    404 Not Found


    404 Not Foundの場合、DispatcherServiceletを404エラーとしてWebで処理してもよい.xmlを修正したら、上記の異常処理のように処理すればいいです.
            ...
    		<init-param>
    			<param-name>throwExceptionIfNoHandlerFound</param-name>
    			<param-value>true</param-value>
    		</init-param>
            ...
        ...
    	@ExceptionHandler(NoHandlerFoundException.class)
    	@ResponseStatus(HttpStatus.NOT_FOUND)
    	public String handle404(NoHandlerFoundException ex) {
    		log.error("404 Not Found....................... " + ex.getMessage());
    		return "custom404";
    	}
        ...
    <%@ page language="java" contentType="text/html; charset=EUC-KR"
        pageEncoding="EUC-KR"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="EUC-KR">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1>해당 URL은 존재하지 않습니다.</h1>
    </body>
    </html>