JSP 7일 (23.03.31)

Jane·2023년 3월 31일
0

IT 수업 정리

목록 보기
96/124

1. EL

1-1. 액션 태그

  • <jsp:useBean id="empVO" class="edu.global.ex.vo.EmpVO" />
    (EmpVO vo = new EmpVO();)
  • <jsp:setProperty name="empVO" property="ename" value="홍길동" />
    (vo.setEname("홍길동"))
  • ${empVO.ename}로도 접근 가능하고, ${empVO.getEname()}으로도 접근 가능하다.

1-2. 내장 객체

  • pageScope
  • requestScope
  • sessionScope
  • applicationScope

scope_el.java


<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>scople_el</title>
</head>
<body>
	<form action="objelOk.jsp" method="get">
		ID : <input type="text" name="id"><br />
		PW : <input type="password" name="pw">
		<input type="submit" value="login">
	</form>

	<% 
      application.setAttribute("application_name", "application_value");
      session.setAttribute("session_name", "session_value");
      pageContext.setAttribute("page_name", "page_value");
      request.setAttribute("request_name", "request_value");
   %>

pageScope : ${ pageScope.page_name }<br />
<jsp:forward page="objelOk.jsp" />

</body>
</html>
  • key, value 형태로 값을 저장한다.

objelOk.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>obj-el-OK</title>
</head>
<body>

	<%
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
	%>


	ID : <%= id %><br />
	PW : <%= pw %><br />
	<hr />
	
	applicationScope : ${ applicationScope.application_name }<br />
    sessionScope : ${ sessionScope.session_name }<br /> 
    pageScope : ${ pageScope.page_name }<br />
    requestScope : ${ requestScope.request_name } 
    
	
</body>
</html>
  • application scope : 내용 출력, 프로그램이 꺼질 때까지
  • session scope : 내용 출력, 서버의 유지 시간까지
  • page scope : 내용 미출력, 자신의 페이지에서만 유지
    (scope_el.jsp에 setAttribute가 적혀있으므로,
    그 밑에 pageScope : ${ pageScope.page_name } 적고 한다.)
  • request scope : 미출력, 포워딩을 타면 출력
    (scope_el.jsp에 <jsp:forward page="objelOk.jsp" />를 넣고 실행하면 출력)

2. JSTL (Java Standard Tag Library)

lib 안에 2개 삽입 (jstl.jar, standard.jar)

2-1. JSTL 사용하기

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

  • 각 언어 형식 별 표현 방법

    • 스크립틀릿 : <% out.println("AAA"); %>
    • 스크립틀릿 변수 선언 : <%= "AAA" %>
    • EL : ${"AAA"}
    • JSTL : <c:out value="AAA" />
  • c:out, c:set, c:remove, c:if(test, var),
    c:choose, c:when, c:otherwise,
    c:forEach

  • JSTL에서도 EL 문법을 쓸 수 있다.

  • JSTL은 pageContext 영역에 저장된다.


jstl_ex.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL_ex</title>
</head>
<body>

	<!-- c:out => 출력 -->
	<c:out value="hello world" />
	<br />
	<c:out value="hello world"></c:out>
	<br />
	<c:out value='${"hello world"}' />
	<br />

	<!-- c:set => 변수 다루기 -->
	<c:set var="name1" value="홍길동" />
	<c:set var="name2" value="홍길순" />

	<%
		pageContext.setAttribute("name1", "김길동");
	%>

	${ name1 }
	<br>${ name2 }<br>

	<hr />

	<!-- c:remove => 메모리에 있는 것 지우기 -->
	<c:remove var="name1" />
	${ name1 }
	<br>${ name2 }<br>

	<hr />

	<c:if test="${10 > 20}" var="result1">
    1020보다 크다.<br>
	</c:if>
	result1 : ${result1}
	<br>

	<c:if test="${10 < 20}" var="result2">
    2010보다 크다.<br>
	</c:if>
	result2 : ${result2}
	<hr />
<!--  choose, when, otherwise -->
	<c:set var="user" value="abcd123" /><!-- value를 admin으로 바꿔서 테스트 -->
	<c:choose>
		<c:when test="${ user == 'admin' }">
		관리자 페이지
		</c:when>
		<c:otherwise>
		${user}님 반갑습니다.
		</c:otherwise>
	</c:choose>

<hr />
<!-- c:forEach => 반복문 -->
<% pageContext.setAttribute("numList", new String[]{"1", "2", "3", "4", "5"}); %>

<ul>
	<c:forEach var="num" items="${numList}" begin="1" end="3">
    <!-- index처럼 0부터 시작해서 돈다. -->
	<li>${num }</li>
	</c:forEach>
</ul>

</body>
</html>

2-2. c:forEach 연습

  1. ArrayList를 만든다.
  2. 리스트 요소를 ArrayList에 추가한다.
  3. pageContext에 ArrayList를 속성 추가한다.
  4. ul 태그 안의 li 태그로 나올 수 있도록 c:forEach를 사용해준다. (ul 안에서)
  • 리스트에 담긴 과일 출력하기
<%
    List<String> fruits = new ArrayList<>();
    fruits.add("apple");
    fruits.add("banana");
    fruits.add("pineapple");
    fruits.add("kiwi");
    fruits.add("melon");
    pageContext.setAttribute("fruits", fruits);
%>

<ul>
	<c:forEach var="fruit" items="${fruits}">
	<li>${fruit}</li>
	</c:forEach>
</ul>
  • EMP 리스트에 있는 사원의 이름 출력하기

1번


<% 
EmpDAO dao = new EmpDAO();
List<EmpVO> vos = dao.empSelect();
List<String> names = new ArrayList<>();

for(EmpVO vo : vos){
	names.add(vo.getEname());
}
pageContext.setAttribute("names", names);
%>

<ul>
	<c:forEach var="name" items="${names}">
	<li>${name}</li>
	</c:forEach>
</ul>

2번

<% 
EmpDAO dao = new EmpDAO();
List<EmpVO> emps = dao.empSelect();

pageContext.setAttribute("emps", emps);
%>

<ul>
	<c:forEach var="emp" items="${emps}">
	<li>${emp.ename}</li>
	</c:forEach>
</ul>

3번

<% 
EmpDAO dao = new EmpDAO();
List<EmpVO> emps = dao.empSelect();

pageContext.setAttribute("emps", emps);
%>

<ul>
	<c:forEach var="emp" items="${emps}">
	<li>${emp.getEname()}</li>
	</c:forEach>
</ul>
  • 구구단 출력하기

1번

<% pageContext.setAttribute("numList", new String[]{"1", "2", "3", "4", "5","6","7","8","9"}); %>

<ul>
	<c:forEach var="num1" items="${numList}" begin="1" end="8">
  
	<li>
		<ul>
		<c:forEach var="num2" items="${numList}" >
		<li>${num1} * ${num2} = ${num1 * num2}</li>
		</c:forEach>
		</ul>
	</li>
			<hr />
	</c:forEach>
</ul>

2번

   <table  border="1">
      <c:forEach var="i" begin="1" end="9">
         <tr>
            <c:forEach var="j" begin="1" end="9">
               <td>${j }x ${i} = ${i*j}</td>
            </c:forEach>
         </tr>
      </c:forEach>
   </table>

3. eshopper

3-1. 반복문으로 카드 출력하기

  • emp.sal과 emp.hiredate가 나오도록 한다.
<%
	EmpDAO dao = new EmpDAO();
	List<EmpVO> emps = dao.empSelect();

	pageContext.setAttribute("emps", emps);
%>
    <c:forEach var=" emp" items="${emps }">

        <div class="col-sm-4">
            <div class="product-image-wrapper">
                <div class="single-products">
                    <div class="productinfo text-center">
                        <img src="images/home/product1.jpg" alt="" />
                        <h2>${emp.sal}</h2>
                        <p>${emp.hiredate}</p>
                        <a href="#" class="btn btn-default add-to-cart"><i class="fa fa-shopping-cart"></i>Add to
                            cart</a>
                    </div>
                    <div class="product-overlay">
                        <div class="overlay-content">
                            <h2>${emp.sal}</h2>
                            <p>${emp.hiredate}</p>
                            <a href="#" class="btn btn-default add-to-cart"><i class="fa fa-shopping-cart"></i>Add to
                                cart</a>
                        </div>
                    </div>
                </div>
                <div class="choose">
                    <ul class="nav nav-pills nav-justified">
                        <li><a href="#"><i class="fa fa-plus-square"></i>Add
                                to wishlist</a></li>
                        <li><a href="#"><i class="fa fa-plus-square"></i>Add
                                to compare</a></li>
                    </ul>
                </div>
            </div>
        </div>

    </c:forEach>

3-2. image 랜덤하게 나오기

EmpVO.java에 함수 추가

	public int getImgNum() {
		return (int) (Math.random() * 6) + 1;
	}

emp_shop.jsp 내의 이미지 코드 수정

<img src="images/home/product${emp.getImgNum()}.jpg" alt="" />

4. MVC

  • Model View Controller
    모델 : DB, 게시판
    뷰 : JSP, 화면
    컨트롤러 : Servlet, 조작

4-1. MVC Board

create table mvc_board( 
    bid NUMBER(4) PRIMARY KEY, 
    bname VARCHAR2(50), 
    btitle VARCHAR2(100), 
    bcontent VARCHAR2(1000), 
    bdate DATE DEFAULT SYSDATE, 
    bhit NUMBER(4) DEFAULT 0, 
    bgroup NUMBER(4),    
    bstep NUMBER(4), 
    bindent NUMBER(4) 
); 
 
commit;
 
create sequence mvc_board_seq;

insert into mvc_board (bid, bname, btitle, bcontent, bhit, bgroup, bstep, bindent)
values (mvc_board_seq.nextval, 'test' , '테스트', '테스트', 0, mvc_board_seq.currval, 0, 0);

select * from mvc_board;
  • 게시판 코드

    • id, name, title, content, date, hit : 게시판 글 작성 관련
    • group, step, indent : 댓글 관련
  • 시퀀스 : auto sequence

4-2. Board 프로젝트 작업하기

Controller (Servlet) : Client에서 받는 모든 것들을 담는다.

  • @WebServlet("/.do") 로 설정한다.
  • actionDo 함수를 만든다.

BoardController.java

package edu.global.board.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import edu.global.board.command.BCommand;

/**
 * Servlet implementation class BoardController
 */
@WebServlet("/.do")
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public BoardController() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet() ... ");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost() ... ");
	}

	private void actionDo(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("actionDo() ... ");
		
		request.setCharacterEncoding("UTF-8");
		
		String viewPage = null;
		BCommand command = null; // Board의 커맨드
	}
	
}

BCommand.java

package edu.global.board.command;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class BoardController
 */

public abstract interface BCommand {
	void execute(HttpServletRequest request, HttpServletResponse response);
}
// 실행 함수를 interface로 저장

BListCommand.java

package edu.global.board.command;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import edu.global.board.dao.BDao;

public class BListCommand implements BCommand{

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) {

		BDao dao = new BDao(); // Board DAO 호출
		
	}
	
}

BDao.java

package edu.global.board.dao;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BDao {

	private DataSource dataSource;

	public BDao() {
		try {
			Context context = new InitialContext();
			dataSource = (DataSource) context.lookup("java:comp/env/jdbc/oracle");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글