국비수업/수업정리
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>
- 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);
}//서비스
}//클래스
- 타임리프 추가해줄 코드
<%@ 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 받고 오른쪽 입력애는 그 값만 전달받음.
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