1) UsrArticleController
@RequestMapping("usr/article/doModify")
@ResponseBody
public ResultData<Article> doModify(HttpSession httpSession, int id, String title, String body) {
boolean isLogined = false;
int loginedMemberId = -1;
if(httpSession.getAttribute("loginedMemberId") !=null) {
isLogined= true;
loginedMemberId = (int)httpSession.getAttribute("loginedMemberId");
}
if(isLogined==false) {
return ResultData.from("F-A", "로그인 후 이용가능 합니다.");
}
Article article = articleService.getArticle(id);
if (article == null) {
return ResultData.from("F-1", Ut.f("%d번 게시물은 존재하지 않습니다.", id));
}
ResultData actorCanModifyRd = articleService.actorCanModify(loginedMemberId, article);
if(actorCanModifyRd.isFail()){
return actorCanModifyRd;
}
return articleService.modifyArticle(id, title, body);
}
2) ArticleService
public ResultData modifyArticle(int id, String title, String body) {
articleRepository.modifyArticle(id, title, body);
Article article = getArticle(id);
return ResultData.from("S-1", Ut.f("%번 게시물 수정 했습니다.", id), article);
}
public ResultData actorCanModify(int loginedMemberId, Article article) {
if (loginedMemberId != article.getMemberId()) {
return ResultData.from("F-2", "해당 게시물에 대한 수정 권한이 없습니다.");
}
return ResultData.from("S-1", "수정 가능 합니다.");
}
actorCanModifyRd
는 수정권한이 있는지를 service측에 체크 public static <DT> ResultData<DT> from(String resultCode, String msg) {
return from(resultCode, msg, null, null);
}
public static <DT> ResultData<DT> from(String resultCode, String msg, String data1Name, DT data1) {
ResultData<DT> rd = new ResultData<DT>();
rd.resultCode = resultCode;
rd.msg = msg;
rd.data1Name = data1Name;
rd.data1 = data1;
return rd;
}
public static <DT> ResultData<DT> newData(ResultData Rd, String data1Name, DT data1) {
return from(Rd.getResultCode(), Rd.getMsg(), data1Name, data1);
}
ResultData에 data1의 데이터이름(article,id 등)을 data1Name에 저장
매개변수를 두개만 받는 from메서드는 데이터와, 데이터이름이 null
newData에서도 from메서드를 사용하기때문에 data1Name이 필요
@Controller
public class UsrHomeController {
@RequestMapping("/usr/home/main")
public String showMain() {
return "usr/home/main";
}
@RequestMapping("/")
public String showRoot() {
return "redirect:usr/home/main";
}
}
/usr/home/main
로 요청이오면
이전에는 @ResponseBody
어노테이션을 통해 Json 형태로 데이터를 출력하였으나
jsp파일로 보여주기위해 @ResponseBody
를 사용하지 않고
메소드에 String을 return "JSP파일 경로"
하면 해당경로의 JSP페이지
를보여주게 된다.
이때 "JSP파일 경로"
application.yml에 prefix,suffix를 설정해 놓았기때문에
string 값("JSP파일 경로"
) 앞에는 prefix의 경로(/WEB-INF/views/)
가 붙고 뒤에는 suffix(.jsp)
가 붙어서 jsp 페이지를 연결
브라우저에서 /
로 요청이 왔을때 redirect
를 통해 상대경로인 usr/home/main
로 이동
리다이렉트(redirect)
는 웹 브라우저(사용자)가 어떤 URL로 웹 서버를 요청했을때 다른 URL로 넘겨주는 것
참고로 prefix의 상위 폴더는 src/main/webapp/
폴더
prefix와 suffix설정은 앞단의 경로와 뒷단의 확장자명은 기본적으로 고정이 되어 있기 때문인데 이 부분을 설정하지 않는다면, Controller에서 페이지를 호출 할 때 모든 경로
를 입력해야 되는 불편함이 생긴다
Spring Model 객체
Controller 에서 생성된 데이터를 담아서 View 로 전달할 때 사용하는 객체.
Controller의 메서드는 Model이라는 타입의 객체를 파라미터로 받을 수 있다.
Method 에 Model 타입이 지정된 경우 Model 타입의 객체를 만들어서 메서드에 주입
addAttribute("키", "값") 메소드
를 사용하여 전달할 데이터 세팅
JSP Servlet으로 웹 어플리케이션을 만들 때 보통 request나 session 내장객체에 정보를 담아 jsp에 넘겨주곤 했는데 Spring에서는 Model을 쓴다.
즉 request.setAttribute()
와 비슷한 역할을 하는 것.
개발자는 직접 model을 생성할 필요는 없다. 다만 파라미터로 선언
만 해주면 스프링이 알아서 만들어준다.
@ModelAttribute("파라미터명")
model.addAttribute하면 Model에 저장되는 것이 아니라 Request객체에 저정
그렇기 때문에 받을 때도 HttpServletRequest를 이용해서 받아야한다. 물론, Request영역에 저장한 것이기 때문에 View에서도 활용이 가능하다.
Model객체는 request영역만 가능하기 때문에 Session영역에 값 저장은 불가능 하다.
1) UsrArticleController
@RequestMapping("/usr/article/getArticles")
public String getArticles(Model model) {
List<Article> articles = articleService.getArticles();
model.addAttribute("articles",articles);
return "usr/article/list";
}
Model
을 쓴다.파라미터로 선언
만 해주면 스프링이 알아서 만들어준다.addAttribute("키", "값") 메소드
를 사용하여 전달할 데이터 세팅2) ArticleService
public List<Article> getArticles() {
return articleRepository.getArticles();
}
3) list.jsp
<table border="2">
<thead>
<tr>
<th>번호</th>
<th>날짜</th>
<th>제목</th>
</tr>
</thead>
<tbody>
<c:forEach var="article" items="${articles}">
<tr>
<td>${article.id } </td>
<td>${article.regDate.substring(0,10)}</td>
<td>${article.title}</td>
</tr>
</c:forEach>
</tbody>
</table>
var
의 값은 배열 요소를 저장할 임시변수 이름
items
의 값은 ${배열이름}