JSP&Servlet

JSP & Servlet 다루기 (2) : servlet 등록하기, 값 받기, DB 연결하기

TerianP 2022. 5. 29.
728x90

1. JSP 원리

  • 앞서 설명했듯 JSP 는 자바 코드를 실행할 수 있는 HTML 파일이다.
  • 그렇다면 JAVA 코드 어떤식으로 실행될까?
    • 바로 JSP 가 실행되는 순간 특정 경로에 해당 JSP 파일 이름으로 된 JAVA 파일이 생성된다. 코드가 실행되는 경우에는 class 파일로 컴파일되어 실행된다.
    • 즉 JSP 가 servlet 으로 변환 → 이에 맞춰 java, class 파일 생성 → servlet 실행 → jsp 를 사용자 웹에 출력! 하는 순서에 따른다
  • 이 때문에 <% %> 로만 변수 선언시 컴파일 시켜주는 메소드의 지역변수로 들어가고, <%! %> 로 변수를 선언해야만 전역변수가 된다.
  • ⇒ 바로 JSP 가 실행되는 순간 특정 경로에 해당 JSP 파일 이름으로 된 JAVA 파일이 생성된다. 코드가 실행되는 경우에는 class 파일로 컴파일되어 실행된다.

2. Servlet 등록하기

자바 servlet 은 주로 WebServlet 어노테이션을 사용해서 등록한다. 하지만 이것 말고도 xml 에 등록하는 방법도 존재한다.

XML 에 Servlet 등록하기

  • servlet 를 등록해서 사용하는 방법은 WebServlet 어노테이션을 사용해서 등록하는 방법도 있찌만 web.xml 을 사용해서 등록하는 방법도 있다
  • /web/src/main/webapp/WEB-INF/web.xml
  • xml 에 등록하는 경우 servlet name 과 class, url-pattern 을 정의한다.
<!--   
@WebServlet() 등록방법
web.xml 에 서블릿 등록
 -->  
 <servlet>
 	<servlet-name>friday</servlet-name> // 서블릿 이름 아래와 달라도 상관없음
 	<servlet-class>day2.Friday</servlet-class> // 서버 응답 위치 : 패키지명.클래스명
 </servlet>
 <!-- 사용자 요청 URL -->
 <servlet>
 	<servlet-name>friday</servlet-name> 
 	<url-pateren>/friday.do</url-pateren> // 사용자 요청 url
 </servlet>

 

JSP 다루기

  • JSP 는 html 의 포멧 안에서 자바 코드를 쓸 수 있도록 만든 html 이다.
  • 자바 코드를 쓸때는 <% %> 를 사용한다.
<% ~~~~~ &> 를 사용해서 안에 자바 코드를 넣을 수 있다 => 이것을 scriptlet 이라고도 한다

<body>
	<%
		for(int i=0; i<10; i++){
	%>
	<h1>Hello JSP World</h1>
	<%
		}
	%>
</body>
  • 자바 클래스를 임포트하여 사용할 때는 아래의 2가지 방법을 사용한다.
1. 클래스 앞에 패키지 명 사용
java.util.Date d = new java.util.Date();

2. <%@ 패이지 지시자를 사용해서 임포트
이때 단축키 컨트롤 스페이스 엔터!
<%@page import="java.io.PrintWriter"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
  • JSP 안에서 java 코드로 값을 얻고, html 페이지에 출력하기 위해서는 아래 2가지 방법을 사용한다.
    • out.println() 사용하기
    • expression 사용하기 : 변수의 값만 가져와서 사용하기 ⇒ 즉 변수명 사용X
      • html 태그 안에서 <%=변수명%> 을 사용한다.
<%
		
		// 2. import 사용
		Date d = new Date();
		//System.out.println(d);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분");
		
		String time = sdf.format(d);
		System.out.println(sdf.format(d));
		
		out.println("<h1> out.println : "+sdf.format(d)+" </h1>"); // 사용법 1
		
	%>
	
	<h1>h1 태그 : <%=time %></h1> 사용법 2

 

JSP 지역변수 전역변수

  • jsp 에서 <% %> 를 사용하여 생성되는 변수는 기본적으로 지역변수로 생성된다. 이는 servlet 이 jsp 파일을 java, class 파일로 컴파일하는 메소드 _jspService() 의 지역변수로 담아두기 때문이다.
  • 이때 <%! %> 를 사용하면 지역변수가 아닌 전역변수로 선언하여 사용 할 수 있다.
<body>
<%!
	int cnt1 = 0;
%>
	<%
		int cnt2 = 0;
		cnt2++;
		cnt1++;
	%>
	
	<h1> 현재 페이지 방문 횟수 전역변수 : <%=cnt1 %></h1>
	<h1> 현재 페이지 방문 횟수 지역변수 : <%=cnt2 %></h1>
</body>

 

JSP 로 값 받기

  • ACTION 태그에서 아무값도 쓰지 않으면 F5 를 누른 효과! ⇒ 자기 자신에게로
  • 값을 받아서 사용할때는 java 에서처럼 request 객체를 사용한다. 이때 request 는 JSP 내장객체로 request 풀네임 그대로 사용한다는 점!
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<%
		String num1 = request.getParameter("num1");
		String num2 = request.getParameter("num2");
		int result = 0;
		
		if(num1 !=null && num2 !=null){
			result = Integer.parseInt(num1)+Integer.parseInt(num2);
		}
		
	%>

	<form action="">
		<input type="text" name="num1" id="" value="" />
		+
		<input type="text" name ="num2" id="" value="" />
		<input type="submit" value="=" />
		<input type="text" name="result" id="" value=<%=result %> />
		
	</form>
</body>
</html>

 

JSP 로 DB 연결해서 값 가져오기

  • 사실 이 부분은 이전의 java 와 완전 동일함!!
  • 이때 중요한 것은 driver 를 /webQuiz/src/main/webapp/WEB-INF/lib 위치에 넣어야한다는 것을 기억하자!!
  • 또한 값을 가져와서 출력하는 부분과 <% %> 안에 java 코드를 넣어야 하는 부분을 기억하면 좋을듯
  • EMP 테이블 정보 가져오기
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.PreparedStatement"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	table, td, th{
		border: 1px solid red;
		border-collapse : collapse;
	}
	table{
		width: 600px;
		margin: 0px auto;
		txt-align : center;
	}
</style>
</head>
<body>
	<h1>EMP 테이블 출력하기</h1>
	<table>
	
	<tr>
		<td>사원번호</td>
		<td>사원명</td>
		<td>급여</td>
		<td>입사일</td>
		<td>부서번호</td>
	</tr>
	
	<%
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
		String user = "scott";
		String passwd = "tiger";
		
		//out.println(Class.forName(driver));
		
		// DB 연결 객체
		Connection conn = DriverManager.getConnection(url, user, passwd);
		//out.println("conn : "+conn);
		
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		// sql 문 STring
		StringBuffer sb = new StringBuffer();
		sb.append("SELECT EMPNO, ENAME, SAL, HIREDATE, DEPTNO FROM EMP");
		
		// 2. pstmt 에 sql 만들어두기
		pstmt = conn.prepareStatement(sb.toString());
		
		// 3. pstmt 객체 실행 후 결과를 rs  에 담기
		rs = pstmt.executeQuery();
		
		// 4. rs.next 가 true 인 동안
		// 즉 select 문으로 가져온 값이 있는 동안 while 문 실행
	  	while(rs.next()){
			int empno = rs.getInt("empno");
			String ename = rs.getString("ename");
			int sal = rs.getInt("sal");
			String date = rs.getString("hiredate");
			int deptno = rs.getInt("deptno"); 
			
			//out.println(empno+" "+ename+" "+sal);
			
	%>
	 	<tr>
			<td><%=empno %></td>
			<td><%=ename %></td>
			<td><%=sal %></td>
			<td><%=date %></td>
			<td><%=deptno %></td>
		</tr>
			
	<%
	 	}
	%>
	</table>
</body>
</html>

댓글