2 분 소요

Java Web Application with Spring and Hibernate (3)

/ @SessionAttributes / bootstrap / JSTL

Creating Todo Service

  • list 만들어서 jsp에 뿌리고 모델,컨트롤러, 뷰 연결하기

listTodos.jsp

<html>  
   <head>  
      <title>List Todos Page</title>  
   </head>  
   <body>  
       <div>Welcometo in28minutes>div>  
       <div>Your Todos are ${todos}</div>  
   </body>  
</html>

TodoService.java


@Service  
public class TodoService {  
  
    private static List<Todo> todos = new ArrayList<>();  
  
    static {  
        todos.add(new Todo(1, "in28minutes","Learn AWS",  
                LocalDate.now().plusYears(1), false ));  
        todos.add(new Todo(2, "in28minutes","Learn DevOps",  
                LocalDate.now().plusYears(2), false ));  
        todos.add(new Todo(3, "in28minutes","Learn Full Stack Development",  
                LocalDate.now().plusYears(3), false ));  
        todos.add(new Todo(4, "test","test description",  
		        LocalDate.now().plusYears(4), false ));
    }  
  
    public List<Todo> findByUsername(String username){  
        return todos;  
    }  
}

TodoController


@Controller  
@SessionAttributes("name")  
public class TodoController {  
  
    public TodoController(TodoService todoService) {  
        super();  
        this.todoService = todoService;  
    }  
  
    private TodoService todoService;  
  
  
    @RequestMapping("list-todos")  
    public String listAllTodos(ModelMap model) {  
        List<Todo> todos = todoService.findByUsername("adad");  
        model.addAttribute("todos", todos);  
  
        return "listTodos";  
    }  
  
}
  • findByUsername 매서드에 임의의 값(adad)을 넣어도 현재는 return 값이 todo 그 자체이기 때문에 상관없이 아이디 1,2,3,4 의 정보를 다 불러온다.

Todo.java


//Database (MySQL)  
//Static List of todos => Database (H2, MySQL)  
  
public class Todo {  
  
    public Todo(int id, String username, String description, LocalDate targetDate, boolean done) {  
        super();  
        this.id = id;  
        this.username = username;  
        this.description = description;  
        this.targetDate = targetDate;  
        this.done = done;  
    }  
  
    private int id;  
    private String username;  
    private String description;  
    private LocalDate targetDate;  
    private boolean done;  
  
    public int getId() {  
        return id;  
    }  
  
    public void setId(int id) {  
        this.id = id;  
    }  
  
    public String getUsername() {  
        return username;  
    }  
  
    public void setUsername(String username) {  
        this.username = username;  
    }  
  
    public String getDescription() {  
        return description;  
    }  
  
    public void setDescription(String description) {  
        this.description = description;  
    }  
  
    public LocalDate getTargetDate() {  
        return targetDate;  
    }  
  
    public void setTargetDate(LocalDate targetDate) {  
        this.targetDate = targetDate;  
    }  
  
    public boolean isDone() {  
        return done;  
    }  
  
    public void setDone(boolean done) {  
        this.done = done;  
    }  
  
    @Override  
    public String toString() {  
        return "Todo [id=" + id + ", username=" + username + ", description=" + description + ", targetDate="  
                + targetDate + ", done=" + done + "]";  
    }  
  
}

클래스 제네릭 : https://gangnam-americano.tistory.com/47 Static : https://mangkyu.tistory.com/47 , https://coding-factory.tistory.com/524

Request vs Model vs Session

Session vs Request Scopes

  • All requests from browser are handled by our web application deployed on a server
  • Request Scope: Active for a single request ONLY
    • Once the response is sent back, the request attributes will be removed from memory
    • These cannot be used for future requests
    • Recommended for most use cases
  • Session Scope: Details stored across multiple requests
    • Be careful about what you store in session (Takes additional memory as all details are stored on server)

example

  • 현재 name 부분은 in28minutes 라는 정보를 갖고 있다.
  • manage는 위 부분의 list-todos 으로 연결해놨다.
  • list-todos에 name 정보를 써 넣었지만 해당 정보는 안 넘어오는걸 볼 수 있다.
  • 위에 나온것처럼 디폴트는 해당 페이지에서 넘어가면 정보가 없어짐으로
  • Session을 이용해야 데이터를 길게 가져갈 수 있음
  • 해당 컨트롤러에 @SessionAttributes 을 사용하면 Session을 이용해서 데이터를 유지할 수 있다.

JSTL

  • 자바코드를 html태그형식으로 간편하게 사용하기 위해 나온 라이브러리

참고 : https://velog.io/@psj0810/JSTL%EC%9D%B4%EB%9E%80-JSTL-%EA%B8%B0%EC%B4%88%EC%82%AC%EC%9A%A9%EB%B2%95 , https://hackersstudy.tistory.com/42

JSTL Dependencies 추가

<dependency>  
   <groupId>jakarta.servlet.jsp.jstl</groupId>  
   <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>  
</dependency>  
  
<dependency>  
   <groupId>org.eclipse.jetty</groupId>  
   <artifactId>glassfish-jstl</artifactId>  
</dependency>

부트스트랩 & 제이쿼리 Dependencies 추가

<dependency>  
   <groupId>org.webjars</groupId>  
   <artifactId>bootstrap</artifactId>  
   <version>5.1.3</version>  
</dependency>  
  
<dependency>  
   <groupId>org.webjars</groupId>  
   <artifactId>jquery</artifactId>  
   <version>3.6.0</version>  
</dependency>

listTodo.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
  
<html>  
   <head>  
      <link href="webjars/bootstrap/5.1.3/css/bootstrap.min.css" rel="stylesheet" >  
      <title>List Todos Page</title>  
   </head>  
   <body>  
      <div class="container">  
         <h1>Your Todos</h1>  
         <table class="table">  
            <thead>  
               <tr>  
                  <th>id</th>  
                  <th>Description</th>  
                  <th>Target Date</th>  
                  <th>Is Done?</th>  
               </tr>  
            </thead>  
            <tbody>  
               <c:forEach items="${todos}" var="todo">  
                  <tr>  
                     <td>${todo.id}</td>  
                     <td>${todo.description}</td>  
                     <td>${todo.targetDate}</td>  
                     <td>${todo.done}</td>  
                  </tr>  
               </c:forEach>  
            </tbody>  
         </table>  
  
      </div>  
      <script src="webjars/bootstrap/5.1.3/js/bootstrap.min.js"></script>  
      <script src="webjars/jquery/3.6.0/jquery.min.js"></script>  
  
   </body>  
</html>
  • JSTL 문법은 위에 참고란 링크를 참고
  • 제이쿼리는 더 이상 쓸 이유가 없다고 하지만 계속 지겹게 나오는거 보면 그냥 찍먹 수준으로 보는게 좋은거 같다.
  • 진자든 타임리프든 사용법만 알면 다 비슷비슷한거 같다.

댓글남기기