* 서블릿(Servlet)
- JSP - Serverlt
JSP(Java Server Page) : 클라이언트의 요청을 처리해서 동적인 데이터(DB)를 사용 가능하도록 만들어주는 기술
Servlet (Server Side Applet) : 자바 코드로 동적 데이터를 처리하는 기술
JSP <=> Servlet(java) <=> calss
[실행] [컴파일]
** 서블릿의 경우는 코드하나 공백하나 변경할 때마다 컴파일이 필요,
JSP(HTML + JAVA) 매번 컴파일 X
* 서블릿 사용 규칙
1) javax.servlet.Servlet 인터페이스를 구현
2) 1)을 구현하기 힘든 경우, javax.servlet.http.HttpServlet 클래스를 상속 사용
3) doGet(), doPost() 메서드를 선언(오버라이딩)
(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse 전달인자 필수로 구현)
4) java.io.IOException, javax, servlet.ServletException을 통한 예외 처리(예외던기지)
5) 배포서술자(web.xml)를 사용해서 서블릿과 주소(url)을 매핑 (서블릿3.0~이상은 어노테이션 지원)
package com.itwills.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Myservlet extends HttpServlet {
// alt shfit s + v
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("MyServlet-doGet() 실행");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("MyServlet-doPost() 실행");
}
}
shift + ctrl + S -> V
doGet, doPost 체크
xeb.xml 열어서 수정
<?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" version="4.0">
<display-name>JSP7</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>
<!-- web.xml (배포서술자) 서블릿을 매핑한다 -->
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>com.itwillbs.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
</web-app>
package com.itwillbs.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
// 서버실행 ctrl + 클릭
// http://localhost:8088/JSP7/myServlet (x)
// http://localhost:8088/JSP7/myServlet.com (o)
@Override
public void init() throws ServletException {
System.out.println(" init()실행 - 서블릿 클래스(객체) 초기화! ");
}
// alt shfit s + v
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println(" MyServlet-doGet() 실행 ");
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println(" MyServlet-doPost() 실행 ");
// response.setContentType("text/html; charset=UTF-8");
// response.getWriter().append("안녕하세요!");
// response.getWriter().append("<h1> ITWILL 서블릿수업 </h1>");
// => 직접적으로 태그를 작성해서 사용 (불편함)
// => JSP페이지 사용
// 서블릿(매핑) + JSP(화면) 같이 사용
// -> JSP 페이지로 이동(포워딩)
/* <jsp:~> 액션태그 포워딩은 JSP 페이지에서 */
RequestDispatcher dis
= request.getRequestDispatcher("./board/myServlet.jsp");
dis.forward(request, response);
}
@Override
public void destroy() {
System.out.println(" destroy() 호출 - 서블릿 객체 소멸 ");
}
}
<!-- web.xml (배포서술자) 서블릿을 매핑한다 -->
<servlet>
<servlet-name> 서블릿 객체 이름 </servlet-name>
<servlet-class> 서블릿 클래스의 위치 </servlet-class>
</servlet>
서블릿 클래스와 url 주소를 매핑
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern> URL 주소 </url-pattern>
</servlet-mapping>
* JSP -> Servlet 변경(자동변경)
- JSP페이지를 실행할 때(컴파일) Servlet으로 변경
- JSP 스크립틀릿(<% %>)코드는 Servlet-service() 메서드 안에 작성
- JSP 선운문(<%! %>)코드는 Servlet안에 멤버(변수, 메서드)의 형태로 작성
- JSP 표현식 (<%= %>)코드는 Servlet-service() 메서드, out.println()로 변경
- HTML 코드는 Servlet-service() 메서드, out.write()로 변경
* EL(Expression Language) : 표현(식) 언어
사용목적
- 간편한 출력
- out.println(), <%= %>을 대신하기 위한 표현법
사용방법
${ 변수 } ${ 식(연산) } ${ 메서드 호출(단, 리턴이 있는 경우) }
- EL 내장객체
- pageScope / requestScope / sessionScope / applicationScope
- param / paramValues
- header / headerValues
- cookie
- initParam
- pageContext
- EL 연산자(p516~517)
- 산술연산자 ( + - * / % )
- 논리연산자 ( && || ! )
- 비교연산자 ( == != > < >= <= )
- ( . [] () X? a:b empty )
https://tomcat.apache.org/download-taglibs.cgi
Apache Tomcat® - Apache Taglibs Downloads
Welcome to the Apache Taglibs download page. This page provides download links for obtaining the latest version of the Apache Standard Taglib, as well as links to the archives of older releases. You must verify the integrity of the downloaded files. We pro
tomcat.apache.org
<%@ 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>
<h1>elTest1.jsp</h1>
<%
int num = 100;
out.println("변수num : "+num+"<hr>");
// 영역객체에 정보 저장
request.setAttribute("num2", 1000);
%>
변수num : <%=num %><br>
=> jsp 표현식 출력하는 num (변수)
<hr>
변수num(el) : ${num }<br>
=> el 표현식 출력하는 num (변수X, 속성(attribute)O )
<hr>
영역객체의 속성 num2 (JSP) : <%=request.getAttribute("num2") %><hr>
영역객체의 속성 num2 (EL) : ${num2 }<hr>
</body>
</html>
<%@ 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>
<h1>elParamTest.jsp</h1>
<fieldset>
<form action="elParamTestPro.jsp" method="post">
아이디 : <input type="text" name="id"><br>
이름 : <input type="text" name="name"><br>
나이 : <input type="number" name="age"><br>
<hr>
좋아하는 음식1: <input type="text" name="foods"><br>
좋아하는 음식2: <input type="text" name="foods"><br>
<hr>
취미:
<input type="checkbox" name="hobbys">게임
<input type="checkbox" name="hobbys">운동
<input type="checkbox" name="hobbys">영화<br>
<input type="submit" value="전송하기">
</form>
</fieldset>
</body>
</html>
<%@ 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>
<h1>elParamTestPro.jsp</h1>
<h2> elParamTest.jsp 페이지에서 전달된 정보 출력하기 </h2>
<%
// 한글처리
request.setCharacterEncoding("UTF-8");
// 전달해준 정보 저장(id,name,age)
// String id = request.getParameter("id");
// String name = request.getParameter("name");
// int age = Integer.parseInt(request.getParameter("age"));
%>
<h3>JSP 코드</h3>
<p>
<%-- 아이디 : <%=id %><br> --%>
<%-- 이름 : <%=name %><br> --%>
<%-- 나이 : <%=age %><br> --%>
</p>
<h3>EL 코드</h3>
<p>
아이디 : ${param.id }<br>
이름 : ${param.name }<br>
나이 : ${param.age }<br>
나이 +100 : ${param.age + 100 }<br>
EL 표현식은 자동으로 정수데이터를 형변환 한다
</p>
<hr>
<h2> 중복된 이름의 파라메터 정보를 저장 </h2>
<%
// 중복된 데이터를 처리X
String foods1 = request.getParameter("foods");
String foods2 = request.getParameter("foods");
String[] foods = request.getParameterValues("foods");
%>
<h3> JSP </h3>
음식1 : <%=foods1 %> <br>
음식2 : <%=foods2 %> <br>
음식1 : <%=foods[0] %> <br>
음식2 : <%=foods[1] %> <br>
<h3> EL </h3>
음식1 : ${param.foods } <br>
음식2 : ${param.foods } <br>
음식 : ${paramValues.foods }<br>
음식1 : ${paramValues.foods[0] }<br>
음식2 : ${paramValues.foods[1] }<br>
<hr>
<%
String[] hobbys = request.getParameterValues("hobbys");
if(hobbys != null){
for(int i=0;i<hobbys.length;i++){
%>
취미 : <%=hobbys[i] %><br>
<%
}
}
%>
<hr>
* EL표현식은 + JSP 반복문 사용 불가능 => JSTL-foreach구문 <br>
취미 : ${paramValues.hobbys[0] }<br>
취미 : ${paramValues.hobbys[1] }<br>
취미 : ${paramValues.hobbys[2] }<br>
</body>
</html>
<%@ 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>
<h1>elOperatorTest.jsp</h1>
<fieldset>
<form action="elOperatorTestPro.jsp" method="post">
숫자1: <input type="text" name="num1"><br>
숫자2: <input type="text" name="num2"><br>
<input type="submit" value="전송">
</form>
</fieldset>
</body>
</html>
<%@ 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>
<h1>elOperatorTestPro.jsp</h1>
<h2> 전달정보 저장 </h2>
num1 = ${param.num1 }, num2 = ${param.num2 } <hr>
<h3> 기본적인 형변환 제공, 하나의 EL표현식 안에서 연산 수행 </h3>
num1 + num2 = ${param.num1 }+${param.num2 }<br>
num1 + num2 = ${param.num1 + param.num2 }<br>
num1 * num2 = ${param.num1 * param.num2 } <hr>
Q. num1,num2 값이 모두 양수인가? A. ${ (param.num1 > 0) && (param.num2 > 0) } <hr>
Q. num1,num2 값이 같은지, 다른지 비교 A. ${param.num1 == param.num2? "같다":"다르다"} <!-- 같다or다르다 출력 --> <hr>
Q. 사용자의 아이디가 있는경우 "OOO님 안녕하세요!",없는경우 "guest님 안녕하세요!"
<%-- ${param.id == null} --%>
<hr>
=> ${param.id == ""? "guest":param.id}님 안녕하세요! <br>
</body>
</html>
TestServlet1
package com.itwillbs.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class TestServlet1 extends HttpServlet{
// http://localhost:8088/JSP7/test1
// alt shift s + v
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet1_doGet() 실행");
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet1_doPost() 실행");
//page영역에 정보를 저장해서 전달 => JSP 출력 가능 X
//session영역에 정보를 저장해서 전달 => JSP 출력 가능 O
// 데이터 생성 -> JSP 페이지에서 출력
// request영역에 정보를 저장해서 전달
request.setAttribute("cnt", 2000);
// session영역 정보 저장
HttpSession session = request.getSession();
session.setAttribute("cnt", 5000);
// 서블릿 + JSP( attribute.jsp )연결 (포워딩)
RequestDispatcher dis
= request.getRequestDispatcher("./jstl_el/attribute.jsp");
dis.forward(request, response);
}// doPost
}
<%@ 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>
<h1>attribute.jsp</h1>
<%
int cnt = 1000;
// page영역에 cnt값을 3000 저장
pageContext.setAttribute("cnt", 3000);
%>
JSP 표현식 - cnt : <%=cnt %><br>
EL 표현식 - cnt : ${cnt }<br>
EL 표현식 - cnt : ${requestScope.cnt }<br>
EL 표현식 - cnt : ${requestScope.cnt }<br>
<h2>
EL표현식에서 영역객체정보를 생략가능 <br>
=> 데이터를 찾을때 모든영역에 데이터를 검색 (영역의 범위 크기순서)
pageScope < requestScope < sessionScope < applicationScope
cnt=2000
cnt = 3000
-> 만약 모든 영역에 값이 없을 때 (끝)
-> 동일한 이름의 속성(attribute)이 있을 경우 영역객체 정보가 없으면
영역의 범위가 적은 객체정보를 사용
</h2>
</body>
</html>
'⛏️ > JSP' 카테고리의 다른 글
[JSP] 13 . JSTL (CORE 라이브러리, Formmatting 라이브러리) (0) | 2023.10.06 |
---|---|
[JSP] 12. EL 표현식 데이터 (1) | 2023.10.04 |
[JSP] 10. 게시판 만들기2 (답글, 파일 업로드) (0) | 2023.09.20 |
[JSP] 9. 게시판 만들기(글쓰기, 조회수, 페이징, 수정, 삭제) (0) | 2023.09.14 |
[JSP] 8. 자바빈(JavaBean) (0) | 2023.09.04 |