본문 바로가기

Dev/[Java]

[DBMS] 8. Web 붙이기, Servlet / JSP

반응형

오늘 할 것..

1. Servlet / JSP작성해서 View Controller 작성

 

Servlet 과 JSP 차이는?

Servlet 은 Java Class 내부에 html을 포함하는 방식.

ex) out.println("<body> <h1> 등등..

 

Servlet장점

- 각 요청마다 다른 스레드로 실행되기 때문에 서블릿 요청의 처리 속도가 기존 CGI
처리 속도보다 빠르다

- 확장성이 있다
- 견고하고 , 객체 지향적이다
- Java 언어로서만 구현된다
- Platform independent 하다
- Logging 기능에 access 할 수 있다
- 웹 컨테이너가 Servlet 에 오류 처리나 보안과 같은 추가 서비스를 제공한다


Servlet단점
- 비즈니스 로직과 프리젠테이션 로직을 구분하기 힘들기 때문에 웹 응답을 생성하는
데 사용하기 어렵다 .  JSP (Java Server Page) 로 해결
- 동시성 문제를 고려해야 한다

 

 

JSP : script 언어

: html 이 java code를 포함하는 방식..

ex)

<table>

<% for(int i=0;i<=10;i++){ %>

 <tr>

</tr>

<%}%>

</table>

html 내에 코드를 포함하는 기술은 

1. PHP(아파치->아파치 에서만 동작)

2. ASP(Active Server Page) : Microsoft -> IIS에서만 동작

3. JSP(Java Server Page) : Sun Micro-> 웹서버 독립적

가 있다.

 

- JSP page 는 Web Container 에 의해 서블릿 인스턴스로 변환 되며 , 변환된 서블
릿은 해당 JSP page 에 대한 요청을 처리한다 .  결국 Servlet

- ASP 나 PHP page 는 HTTP 요청이 들어올 때 마다 interpret 되는 반면 , JSP 는
Java bytecode 로 컴파일된다


- Servlet 과 JSP 의 주된 차이점은 JSP 가 Presentation logic 에 포커스를 맞추고
있다는 점이다

 

 


JSP 의 장점
- OS 의 쉘이나 프로세스가 아닌 스레드가 사용되기 때문에 웹 응용프로그램의 성능
과 확장성이 있다
- Java 를 기반으로 하기 때문에 Platform independent 하다
- Java 언어로 작성되기 때문에 객체지향언어와 모든 API 를 사용할 수 있다

JSP 의 단점
- Presentation logic 과 Business logic 을 같이 포함하는 경우가 있다
- 동시성 문제를 고려해야 한다
- Debugging 이 어렵다

 

: 두개 다 옛날방식.

 

-JSTL(Java Standard Tag Librrary)

: 필요한 Java code를 모아서 tag로 만들어서 제공하는 라이브러리

<table>

<c:foreach>

<tr>

</tr>

</c:foreach>

</table>

 

 

 

요즘은 Spring + thymeleaf 조합이 많이 쓰인다.

www.thymeleaf.org/

 

Thymeleaf

Integrations galore Eclipse, IntelliJ IDEA, Spring, Play, even the up-and-coming Model-View-Controller API for Java EE 8. Write Thymeleaf in your favourite tools, using your favourite web-development framework. Check out our Ecosystem to see more integrati

www.thymeleaf.org

 

기초 단계부터 시작해야하므로..

일단은 서블릿부터 만들어 볼 것이다..

 

 

 

 

 

 

 

 

 

 

 

 

 

 

URL mapping. 서블릿을 호출할 때 사용하는 문자열이다. 바꿔줘도되고 안바꿔줘도된다

 

 

 

 

다음을 보면 doGet 과 doPost 가 체크되어있는것을 볼 수 있다.

Finish가자

 

 

 

 

이런 코드가 생성된다..

package jdbc.user.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;

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

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

실행하면 웹이 하나 만들어진다

 

 

http응답코드

get post 차이.

mime 타입

알아보자... 이미 알고있지만...

 

 

html 과 XML 에 대한 얘기..

XML:

eXtensible Markup Language

확장 가능한 마크업 언어라는 듯..

사용자가 Tag를 정의해서 쓸 수 있다.....

tag이름, tag attribure, tag 출현 횟수

이런것드을 사전에 정의해야한다.

 

XSD (xml schema) 그래서 이런게 있다..

스키마에 선언 된 대로.. XML 의 태그명, 속성명.. 파라미터.. 이런걸 써야댄다..

이런걸 정의해놓은 것이 스키마.

예를 들어

<name first="true">

<sub></sub>

</name>

가 있으면.. <sub> 태그는 꼭 <name> 태그 하부에 쓰여야한다.. 이런 규칙들정의

 

XSD 이전에는 DTD라는게 있었다.

 Doc type define 뭐 이런거의 줄임말..

우리 마이바티스 실습할 대 xxMapper..xml에 가보면..

위에 이렇게 선언되어있따.

 

이런게스키마.. 규칙들이선언되어있따는말.

 

 

실제로 저 링크로 접속해보면..

mybatis.org/dtd/mybatis-3-mapper.dtd

 

다운로드가 하나가 바로 된다...

dtd파일을 받아서 에디터로열어보면..

엄청 길게 규칙들이 작성되어있다.

 

 

 

XSD도 다운받아볼까

web.xml에서 링크가있따.

 

xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd

 

 

무튼 이런 식으로 XML의 스키마가 정의되어있다.

 

이 규칙을 따르겠다.. 이런말이다.

 

 

무튼..

 

상단에 선언되어있는 어노테이션

@WebServlet("/controller")

을 없애고 web.xml에 태그로 추가하는 방법을 해본다.

이렇게 해주면 어노테이션 필요가 없고,

url-pattern 태그에 보면 *.do라고 되어있다.

URL에 어떤 값이 들어오든 확장자가do로 끝나면 잘 접속이 된다.

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
	<display-name>Dynamic_Mybatis_test</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<!-- Servlet 선언 -->
	<servlet>
		<servlet-name>UserServlet</servlet-name>
		<servlet-class>jdbc.user.controller.UserServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>UserServlet</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	
</web-app>

 

 

이후 문자열 출력이나 이런것들을 doGet에 해볼것이다.

전에 EWS에서 잠깐 해봤던 것들하고 비슷하다...

Content type, println 이런 방식으로 쓰면된다...

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// 응답을 서버에서 클라이언트로 주는 것이다...
	// response(응답) 데이터의 content Type을 설정해보자. 그리고 한글 인코딩도 같이 해주자.
	response.setContentType("text/html; charset=utf-8");
		
	// 클라이언트에게 데이터를 전달해야한다.
	// 전달 할  html을 담아줄 stream 을 하나 만들어보자.
	PrintWriter out = response.getWriter();
	out.println("<h1>Hello 써블릿</h1>");
	Date date = new Date();
		
	out.println("<h3> 현재 시간은 : " + date);
	out.close();
	
}

 

 

 

-----------------------------------------------------------------------------------------------------------여담

 

클래스가 있는데 계속 404?

 

클래스 파일 먼저 확인

2. Clean 하고 속성에서 날짜 확인

 

 

 

-----------------------------------------------------------------------------------------------------------

 

JSP생성.. 얘는 WebContent 폴더에 넣어준다..

 

 

html5 선택..

 

 

 

초기에여기에 EUC-KR로 되어있는것을 UTF8로 바꿔주는게 좋다.

 

 

이런 소스가 생겨났다.

 

<%@ 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>

</body>
</html>

 

여기다가 아까 서브릿에서 헸던 것처럼 코딩을해보겠다.

<%태그로 감싸고 out.println 하던가..

<h3>태그 안에 <%= 를 써줘도 비슷하다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.util.Date" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1> hello JSP </h1>
	<% 
	Date date = new Date(); 
	out.println("스트림으로 출력한 현재 시간은 : " + date);
	%>
	<h3>현재시간은 : <%=date %> </h3>
	
</body>
</html>

 

자...

 

이제 우리는 JSP에서 Servlet을 호출하고,

Servlet은 DAO를 호출하는 형식으로 진행할것이다.

 

이렇게 doGet에 Dispatcher로 호출하는 방법이다.

package jdbc.user.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;

import javax.servlet.RequestDispatcher;
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 jdbc.user.dao.UserDAOMyBatis;
import jdbc.user.vo.UserVO;

/**
 * Servlet implementation class UserServlet
 */

// @WebServlet("/controller")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    UserDAOMyBatis dao = null;  
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UserServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public void init() throws ServletException {
    	System.out.println("UserServlet Init()");
    	dao = new UserDAOMyBatis();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("UserServlet doGet()" + request.getMethod());
		// 응답을 서버에서 클라이언트로 주는 것이다...
		// response(응답) 데이터의 content Type을 설정해보자. 그리고 한글 인코딩도 같이 해주자.
		//response.setContentType("text/html; charset=utf-8");
		
		// 클라이언트에게 데이터를 전달해야한다.
		// 전달 할  html을 담아줄 stream 을 하나 만들어보자.
//		PrintWriter out = response.getWriter();
//		out.println("<h1>Hello 써블릿</h1>");
//		Date date = new Date();
//		
//		out.println("<h3> 현재 시간은 : " + date);
//		out.close();
		
		//1. DAO의 메서드 호출
		List<UserVO> users = dao.getUsers();
		
		//2. List객체를 Request 객체에 저장한다.
		request.setAttribute("users",users);
		
		//3. RequestDispatcher 의 forward() 메서드 호출해서 userList.jsp로 포워딩한다.
		RequestDispatcher rd = request.getRequestDispatcher("/userList.jsp");
		rd.forward(request, response);
	}

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

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-----------------------------------------------------------------------------------------------------------여담

http는 connectionless(비연결형)이다..

TCP나 UDP처럼 계속 유지되면 서버터지겠지?

 

그래서 http는 웹에 특화된.. 프로토콜..

 

비연결형이라 세션, 쿠키같은 걸 쓴다.

세션은 서버, 쿠키는 클라이언트 에 저장됨

 

세션은 브라우저 열고 끝날 때 까지 계속유지된다...

타임아웃을 서버단에서 설정해놓은 경우는 해당 시간만큼 유지됨

 

 

-----------------------------------------------------------------------------------------------------------

 

 

-----------------------------------------------------------------------------------------------------------여담

servlet에 init메서드 추가하면, 최초1번만 실행한다.

유용하게 사용할 수 있을것이다..

 @Override
    public void init() throws ServletException {
    	System.out.println("UserServlet Init()");
    }

 

 

-----------------------------------------------------------------------------------------------------------

 

 

자 이제 JSTL을 해볼것이다..

 

maven 에서 JSTL 받기

 

 

 

 

지금 아래와 같이..

index.jsp에서 처음 시작...

 

여기서 데이터베이스 접근하려면.. 서블릿을 꼭 거쳐야한다..

.

 

 

진입점 : index.jsp

여기서 링크를 누르면? 서블릿으로 요청을 하겠지

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="java.util.Date" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1> 사용자 관리 </h1>
	<%--
	Date date = new Date(); 
	out.println("스트림으로 출력한 현재 시간은 : " + date);
	--%>
	<ul>
		<li><a href="UserList.do">1.사용자리스트</a></li>
	</ul>
	
</body>
</html>

서블릿 소스코드

 

여기서는 dispatcher를 이용해서 UserList.jsp로 결과값을 날려준다..

package jdbc.user.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;

import javax.servlet.RequestDispatcher;
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 jdbc.user.dao.UserDAOMyBatis;
import jdbc.user.vo.UserVO;

/**
 * Servlet implementation class UserServlet
 */

// @WebServlet("/controller")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    UserDAOMyBatis dao = null;  
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UserServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public void init() throws ServletException {
    	System.out.println("UserServlet Init()");
    	dao = new UserDAOMyBatis();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("UserServlet doGet()" + request.getMethod());
		// 응답을 서버에서 클라이언트로 주는 것이다...
		// response(응답) 데이터의 content Type을 설정해보자. 그리고 한글 인코딩도 같이 해주자.
		//response.setContentType("text/html; charset=utf-8");
		
		// 클라이언트에게 데이터를 전달해야한다.
		// 전달 할  html을 담아줄 stream 을 하나 만들어보자.
//		PrintWriter out = response.getWriter();
//		out.println("<h1>Hello 써블릿</h1>");
//		Date date = new Date();
//		
//		out.println("<h3> 현재 시간은 : " + date);
//		out.close();
		
		//1. DAO의 메서드 호출
		List<UserVO> users = dao.getUsers();
		
		//2. List객체를 Request 객체에 저장한다.
		request.setAttribute("users",users);
		
		//3. RequestDispatcher 의 forward() 메서드 호출해서 userList.jsp로 포워딩한다.
		RequestDispatcher rd = request.getRequestDispatcher("/UserList.jsp");
		rd.forward(request, response);
	}

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

}

 

UserList.jsp 소스코드

for문으로 돌려서.. 이런식으로 뿌려준다..

정확하게 이게 어떻게 동작하는지는 다시 공부 해야겠다...

중점적으로 볼 부분은.. 아까 메이븐으로 추가한 jstl을 여기서 활용한다..

<%@ taglib 태그를 쓴다..

그리고.. <c:forEach var="user" items="${users}"> 여기서 items에 사용되는 변수는..

서블릿의 Key 값이어야한다.

request.setAttribute("users",users);

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>사용자 목록</h2>
	<table>
		<tr>
			<th>순서</th>
			<th>사용자ID</th>
			<th>이름</th>
		</tr>

		<%-- 자바코드로 하면 이렇게된다.. --%>
		<%--
		List<UserVO> users = (List)request.getAttribute("users);
		for(int i=0;i<users.size();i++){
			UserVO user = users.get(i);
		}
		--%>

		<%-- JSTL로 하면 이렇게된다.. --%>
		<c:forEach var="user" items="${users}">
			<tr>
				<td>${user.id}</td>
				<td>${user.userid}</td>
				<td>${user.name}</td>
			</tr>

		</c:forEach>
	</table>
</body>
</html>

 

 

쿼리스트링이란?

 

여기서 이제 호출한 JSP에서 서블릿을 한번 더 호출하려면...?

Servlet 에서 분기해야한다.

Servlet 을 여러개 만들면 비효율적이기 때문이다.

 

그래서 호출하는것들에 ID를 붙여서 서블리에서 분기한다.

 

 

일단여기까지,,,

 

반응형