오늘 할 것..
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 조합이 많이 쓰인다.
기초 단계부터 시작해야하므로..
일단은 서블릿부터 만들어 볼 것이다..
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를 붙여서 서블리에서 분기한다.
일단여기까지,,,
'Dev > [Java]' 카테고리의 다른 글
[Spring] 1. 라이브러리와 프레임워크의 차이점? DI전략1 (0) | 2021.01.29 |
---|---|
[DBMS] 9. Web 붙이기, Servlet / JSP - 직접해보기 (0) | 2021.01.28 |
[DBMS] 7-2. Mybatis 연동후 MariaDB와 붙여서 CRUD작성(첨부터 해보기)-2 (0) | 2021.01.27 |
[DBMS] 7-1. Mybatis 연동후 MariaDB와 붙여서 CRUD작성(첨부터 해보기) (0) | 2021.01.27 |
[DBMS] 6. Mybatis 연동후 MariaDB와 붙여서 CRUD작성 (0) | 2021.01.27 |