국비수업/수업정리

JSP / 3 + JSTL

밀김 2023. 5. 24. 10:06
728x90

 

 

 

 

 

 

 

 

 

 

 

< view를 위한 데이터 추출 표현식 EL > 

 

 

${m.name}

- 이 표기법으로 값을 꺼낼수 있다 (저장소에서 m이라는 키를 갖고있는 애한테 걔를 꺼내서 걔한테 price든 뭘 주면, 그 값을 jsp가 꺼내준다) 이게 EL 표기법. 표기할때 앞에 get은 빼야함. 함수처럼 쓰기 xx

 

request.setAttribute("m", menu);
---------------------------------
  <h1>${m.name}</h1>
  <span>${m.price}</span>

 

 

 

 

 

 

 

앞에 get은 빼준다

 

 

 

 

 

 

 

- pagecontext : 서블릿 하나에만 국한됨

 

- request : 서블릿 두개 사이에서 사용됨

 

- session : 한 사용자가 요청하는것만 사용하는거

 

- application : 모든 사용자가 요청하는것으로 사용되는거

(아래로 내려갈수록 저장소가 커짐)

 

 

 

 

 

 

- 저장객체 + EL 이용

<%@ page import="kr.co.rland.web.entity.Menu"%>
<%@ page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>  
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>insert title here</title>
</head>
<body>
	<h1>메뉴 목록</h1>
	<ul>
	 <%
	 List<Menu> list = (List<Menu>)request.getAttribute("list");
     //형변환을 해주는 이유는,request.getAttribute로 가져오면 형태가 object이기 때문에 list컬렉션으로 형변환 해줘야 한다
     //getAttribute 하면 객체로 반환이 된다. 형변환을 해주지 않으면 list에 있는 메소드들을 쓸수 없기 때문에 형변환 필수당
	 for(int i=0; i<list.size(); i++){
		 Menu menu = list.get(i);
		 int id = menu.getId();
		 String name = menu.getName();
		 
		 pageContext.setAttribute("name",name);
		 pageContext.setAttribute("id",id);
	 %>
	 	<li><a href="detail?id=${id}">${name}</a></li>
	 <%} %>	
	</ul>
</body>
</html>
package kr.co.rland.web.controller.menu;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import kr.co.rland.web.entity.Menu;
@WebServlet("/menu/list") // 정의는 코드를 위한 주석 , 역할이 xml 역할 해주는 거다!! 
public class ListController extends HttpServlet 
{
   public void service(HttpServletRequest request
         ,HttpServletResponse response)
               throws IOException,ServletException{

      //<사용자로부터 값 입력(쿼리 스트링)받기>--------------------------- 
      int page =1; // mapping에 쿼리스트링이 없을때 1로 뜨게끔 내가 설정함 (null임 파라미터를 page로 찾는데 쿼리스트링에 page를안넣어서 ) 
      if(request.getParameter("page")!=null) {
         String page_ =request.getParameter("page") ; // 파라미터를 page로 받겠다 했는데 page가 없으니까 null이어서 500이 나오는거다 
         page = Integer.parseInt(page_); 
      }

      //<메뉴 목록 데이터를 가져오기>---------------------------

      List<Menu> list = new ArrayList<>(); // 메뉴리스트를 만든거다 , 전역으로 쓰려고 , 제너릭
      {
         int offset = 10*(page-1); // 1 -> 0 , 2-> 10 , 3 ->20 , 처음시작 
         int size = 10;
         String sql = "select * from menu order by reg_date limit ?,10;";


         String driverClassName ="org.mariadb.jdbc.Driver";
         String url = "jdbc:mariadb://db.newlecture.com:3306/rlanddb";

         try {
            Class.forName(driverClassName);
         } catch (ClassNotFoundException e1) {
         
            e1.printStackTrace();
         }
         try (Connection con = DriverManager.getConnection(url,"rland","20220823");
               PreparedStatement st = con.prepareStatement(sql); 
               // 닫힐 여지가 있는 아이들을 ( ) 안에 넣어준다 .
               ){ //try에 이걸 선언하면 close() 안해도 된다 예외가발생하면 저절로 닫아준다.
            //Connection con = DriverManager.getConnection(url,"rland","20220823");   
            //PreparedStatement st = con.prepareStatement(sql);
            System.out.println("before");
            st.setInt(1,offset);  // ResultSet을 () 안에 넣어버리면 위에서 , setInt가 되기전이라서 '?' 인상태로 sql이 실행된다. 
            
            try(ResultSet rs = st.executeQuery();){ //그래서 따로 try 해야한다 
               System.out.println("after");
               while(rs.next()) { // 10개가 소진될때까지 
                  Menu menu = new Menu(
                        rs.getInt("id"),
                        rs.getString("name"),
                        rs.getInt("price"),
                        rs.getString("img"),
                        rs.getDate("reg_date"),
                        rs.getInt("reg_member_id")
                        );

                  list.add(menu); // 리스트 배열에 넣어주기 
               }


            }
            //rs.close();

         } catch(SQLException e){
            //e.printStackTrace();
            System.out.println("SQL구문오류");


         }
      }
        request.setAttribute("list",list);
      //<사용자에게 데이터를 포함하는 문서 "출력"하기>-----------------------------------------

          request.getRequestDispatcher("/WEB-INF/view/menu/list.jsp").forward(request,response);


   }//서비스

}//클래스

 

 

 

 

 


 

 

 

JSTL

 

 

 

- 타임리프 추가해줄 코드

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

- 저 c는 뒤에 주소의 이름을 c라고 명명해준것이다. 너무기니깐..다른이름으로 해도 되는데 c 라고 많이 표현함 

 

 

 

 

	<c:forEach var="m" items="${list}">
	//리스트의 개수를 파악해서 그만큼 반복함
	//리퀘스트에서 하나꺼내서 페이지컨텍스트에 m이라는 이름으로 객체를 담아줌
	
	 	<li><a href="detail?id=${m.id}">${m.name}</a></li>
	</c:forEach>

 

 

 

 

 

 

 

 

 

 

 

<span>${m.regDate}</span>
//날짜 출력

 

 

 

 


 

 

 

 

 

 

- 왼쪽 입력에서만 request 받고 오른쪽 입력애는 그 값만 전달받음.

 

 

 

왼쪽은 앞단 컨트롤러, 왼쪽은 업무용 컨트롤러(POJO라고 부름)

 

포조 뜻

 

 

 

package com.haebong.hb.controller;

@Controller
public class CatController {

  @GetMapping(“/”)
  String index(Model model) {
     List<Cat> list = new ArrayList<>();

    list.add(new Cat("단비"));
    list.add(new Cat("루비"));
    list.add(new Cat("토리"));

    model.addAttribute(“catList”, list);


     return “cat/index”;
  }
}

- 디스패처서블릿들이 모든걸 해줌...

 

 

 

 

 

 

 

728x90