백엔드 : 서버컴 실행 Servlet, jsp +
프론트엔드 : 브라우저에서 실행 html, css, js
Servelet : DB연동(PreparedStatement, MyBatis)
단점 : 사용자에 대한 요청 처리는 Java 코드와 동일하지만,html을 만들기가 매우 어려운 단점이 있음. 그래서 JSP를 함께 사용함
JSP : HTML 코드 작성이 쉬움, 사용자 요청 처리코드 작성이 어려움
이 두가지의 장점만을 활용하여 mvc 패턴을 사용할 것임
=> 이것은 spring, springboot의 프로그래밍 패턴의 기본이 됨
Client/Server 구조
URL이란 웹 서버가 인터넷 상에 존재하는 자원(정보, 파일 등)을 검색하고 해석하는데 필요한 네트워크 서비스의 표현식을 의미한다.
URL은 다음과 같은 문법으로 표현되어 웹 브라우저 주소간에 입력하여 사용된다.
http://www.naver.com:80/index.html
프로토콜://호스트번호:포트 번호/경로/파일명
프로토콜 / 서버주소(도메인,ip)/ 포트 / 프로젝트이름.요청파일.html
: HTTP 요청에 대해 TCP 통신을 설정한 후 요청에 대한 응답이 처리되면 / TCP 연결을 끊어 버리는 형태의 통신
: 한 번의 요청에 대해 한 번의 응답으로 HTTP 트랜잭션이 종료
기성 기업 같은 경우에는 JSP를 쓰는 곳도 있으나, 최근 트렌드는 JSP보다는 REST API를 구현하는 방식으로 많이 구현하고 있습니다!
MVC 패턴과 JSP의 개념도 어느 정도 알고 있으면 도움 되니 익혀놓으셔도 좋을 것 같아요~! 다만, JSP보다 REST API로 구현하는 방식을 더 깊게 공부하시면 좋을 것 같습니다!!
.
.
.
다이나믹 웹 프로젝트
프로젝트 생성시 xml 찍어줘야함 -> 설정파일
servlet 파일은 src/main/java에 생성됨
이번 이클립스에서는 다른 ("/Test") URL Mapping 서블릿 실행시? 서버 멈췄다 다시 실행시켜줘야하는 문제가 있음
서블릿은 웹 컨테이너에 의해서 관리되며, 다양한 클라이언트 요청에 의해서 동적인 컨텐츠(content)로 응답 가능한 자바 기반의 웹 컴포넌트이다.
해당 역할은 톰캣이 함
web.xml에 Source를 보면 <welcome-file>의 innerText에 적혀있는 파일명들은 url요청시 아무것도 적혀있지 않으면 기본갑으로 응답시 해당 파일들을 보내준다는 뜻이다.
클래스 배포:
WEB-INF/lib에 6g.jar파일과 드라이버 파일들을 넣어만 주면 됨.
Servlet 클래스 작성 : 서블릿 하나는 하나의 클래스
web.xml 설정 : 서블릿 정의, URL 매핑, config 설정
클래스 배포 : WEB-INF/lib, WEB-INF/classes 디렉토리에 배포
URL 매핑처리는 다음 2가지 방법이 제공된다.
가) web.xml
나) @WebServlet
서블릿을 추가하기 위하여 웹 프로젝트를 선택하고 마우스 오른쪽 버튼 클릭후 New > Servlet을 선택한다.
Java package: 서블릿 클래스 파일의 패키지명을 지정하는 곳.
Class name: 서블릿 클래스 파일명을 지정하는 곳.
Superclass: 서블릿이 상속받는 HttpServlet 클래스명을 지정하는 곳.
클래이언트가 서블릿을 요청하는 URL값을 임의의 별칭값으로 맵핑시키는 작업이다.
URL mappings을 사용하지 않을 때 생기는 문제점
1) URL값이 길어서 사용자가 직접 입력시 불편하다.
2) 서블릿의 구조가 명확하여 보안에 취약하다.
클라이언트의 요청 및 응답 처리를 담당하는 서비스 메서드를 지정한다. 일반적으로 doGet 또는 doPost 메서드를 사용하며 기본은 doGet 메서드이다.
webapp -> WEB-INF - web.xml에서 <servlet>과 <servlet-mapping> 태그를 사용하여 설정할 수도 있다.
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.controller.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/info</url-pattern>
</servlet-mapping>
어노테이션은 JDK 5.X부터 추가된 기능으로서 XML 파일 등을 이용하여 환경설정 및 추가정보를 등록하는 방법 대신에 자바코드 등에 직접 설정하는 방법이다.
서블릿을 구현하기 위한 핵심 API로서 일반 클래스가 아닌 추상클래스가 제공된다.
Request 관련 처리작업을 담당하는 API
한글처리 setCharacterEncoding()
HTTP Response 관련 처리작업을 담당하는 API이다.
Tomcat 컨테이너는 서블릿의 인스턴스를 다음과 같이 3가지 메서드를 사용하여 관리한다.
웹 컨테이너에 의해서 서블릿 인스턴스가 처음 생성될 때, 단 한번 호출된다. 따라서 서블릿에서 필요한 초기화 작업시 주로 사용된다.
클라이언트가 요청할 때마다 호출된다. 따라서 클라이언트가 원하는 동적인 처리 작업시 필요하다. 일반적으로 service 메서드보다는 doGet 또는 doPost 메서드를 사용한다.
서블릿 인스턴스가 웹 컨테이너에게 제거될 때 호출된다. 따라서 init 메서드에서 구현했던 초기화 작업을 반납 처리하는 작업시 주로 사용된다.
post ->get
스레드?
클라이언트에서 서블릿으로 요첨을 하면 서블릿은 처리된 결과를 html 형식으로 작성하여 응답 처리한다.
서블릿에서 응답 처리와 관련된 API는 HttpServletResponse이고 다음 2가지 메서드를 사용하여 클라이언트에게 html을 전송한다.
response.setContentType("text/html; charset=UTF-8");
클라이언트인 웹브라우저에서 처리할 데이터의 MIME 타입을 알려주는 메서드이다. 기본은 일반 텍스트를 의미하는 'text/plain'이다.
PrintWriter out = response.getWriter();
응담 처리는 기본적으로 자바 I/O 기술을 이용한다.
따라서 출력을 위한 OutputStream 또는 Writer APLI를 사용해야 된다.
webapp은 정적인 부분?으로 그냥 접근가능?하다.
server 설정에서 Modules 에서 서버주소 이름을 변경가능하다.
html파일에서 <a> 를 이용해 URL mapping을 이용해 서블릿 파일에 접근
프로젝트 복붙할 때 주의할 점 : 톰켓에서 프로젝트명을 읽어와서 주소를 만들어서 따로 임포트할 때마다 바꿔주지 않으면 원본 주소가 유지되는 문제가 있음
post방식은 한글처리를 따로 하지 않으면 한글데이터가 깨져서 사용할 수 없음
request.setCharacterEncoding("utf-8"); 를 이용해서 request 데이터에 한글처리를 해줄 수 있음.
request에서 없는 값을 가져오면 오류가 발생하지 않고 null값을 가져온다.
loginForm.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>로그인화면</h1>
<form action="LoginServlet" method="get">
아이디:<input type="text" name="userid"><br>
비밀번호:<input type="text" name="passwd"><br>
<input type="submit" value="로그인">
</form>
<hr>
<form action="LoginServlet" method="post">
아이디:<input type="text" name="userid"><br>
비밀번호:<input type="text" name="passwd"><br>
<input type="submit" value="로그인">
</form>
</body>
</html>
LoginServlet.java
package com.controller;
import java.io.IOException;
import java.io.PrintWriter;
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 LoginServlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post 방식 사용시 한글이 깨짐 , 그래서 utf-8 처리를 해주어야함
request.setCharacterEncoding("utf-8");
//요청작업 처리
String userid = request.getParameter("userid");
String passwd = request.getParameter("passwd");
//응답작업 처리
// System.out.println("이름은 " + userid);
// System.out.println("비밀번호는 " + passwd);
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("이름은:"+ userid+"<br>");
out.print("비밀번호는:"+passwd);
out.print("</body></html>");
}
/**
* @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);
}
}