다른 서블릿 또는 JSP로 대량의 데이터 공유 및 전달
javax.servlet.ServletRequest
클라이언드와 서블릿 간의 통신에 활용
pro08/src/sec04/ex01/FirstServlet.java
package sec04.ex01;
...
@WebServlet("/first")
public class FirstServlet extends HttpServlet{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
/* 바인딩 */
request.setAttribute("address", "서울시 성북구");
/* 포워드 */
RequestDispatcher dispatch = request.getRequestDispatcher("second");
dispatch.forward(request, response);
}
}
pro08/src/sec04/ex01/SecondServlet.java
package sec04.ex01;
...
@WebServlet("/second")
public class SecondServlet extends HttpServlet{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
/* 출력 */
PrintWriter out = response.getWriter();
String address = (String)request.getAttribute("address"); //address 가져오기
out.println("<html><body>");
out.println("주소:"+address);
out.println("<br>");
out.println("dispatch를 이용한 바인딩 실습");
out.println("</body></html>");
}
}
pro08/src/sec04/ex03/MemberServlet.java
package sec04.ex03;
...
@WebServlet("/member")
public class MemberServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
doHandle(request,response);
}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
doHandle(request,response);
}
private void doHandle(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
MemberDAO dao=new MemberDAO();
/* 바인딩 */
List memberList = dao.listMembers();
request.setAttribute("membersList", membersList);
/* 포워딩 */
RequestDispatcher dispatch = request.getRequestDispatcher("viewMembers");
dispatch.forward(request, response);
}
}
pro08/src/sec04/ex03/ViewServlet.java
package sec04.ex03;
...
@WebServlet("/viewMembers")
public class ViewServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
/* 바인딩 데이터 리스트 가져오기 */
List membersList = (List) request.getAttribute("membersList");
out.print("<html><body>");
out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td><td >삭제</td></tr>");
for (int i = 0; i < membersList.size(); i++) { //받아온 데이터 출력
MemberVO memberVO = (MemberVO) membersList.get(i);
String id = memberVO.getId();
String pwd = memberVO.getPwd();
String name = memberVO.getName();
String email = memberVO.getEmail();
Date joinDate = memberVO.getJoinDate();
out.print("<tr><td>"+id+"</td><td>"+pwd+"</td><td>"+name+"</td><td>"+email+"</td><td>"+joinDate+"</td><td>"+"<a href = '/pro08/member3?command=delMember&id="+id+"' >삭제 </a></td></tr>");
}
out.print("</table></body></html>");
out.print("<a href='/pro08/memberForm.html'>새 회원 등록하기</a");
} // -> 책에는 없으나 오탈자인 것으로 보임
}
javax.servlet.ServletContext
서블릿과 서블릿 컨테이너 간 통신에 활용
서블릿끼리의 자원 공유 가능
서블릿에서의 파일 접근 기능
자원 바인딩 기능
로그 파일 기능
컨텍스트의 설정 정보 제공 기능
톰캣 컨테이너 실행 시 컨텍스트(웹 애플리케이션)마다 ServletContext 객체 1개 생성
톰캣 컨테이너 종료 시 ServletContext 객체 소멸
ServletContext 객체에 데이터 바인딩
애플리케이션 전체의 공통 자원이나 정보를 미리 바인딩
ServletContext 바인딩 데이터는 모든 서블릿에서 접근 가능
모든 사용자가 공통으로 사용하는 데이터에 활용
pro08/src/sec05/ex01/SetServletContext.java
package sec05.ex01;
...
@WebServlet("/cset")
public class SetServletContext extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext context = getServletContext(); //ServletContext 객체 가져오기
List member = new ArrayList();
member.add("이순신");
member.add(30);
context.setAttribute("member", member); //데이터 바인딩
out.print("<html><body>");
out.print("데이터 저장 및 바인딩");
out.print("</body></html>");
}
}
pro08/src/sec05/ex01/GetServletContext.java
package sec05.ex01;
...
@WebServlet("/cget")
public class GetServletContext extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
ServletContext context = getServletContext(); //ServletContext 객체 가져오기
List member = (ArrayList)context.getAttribute("member"); //데이터 가져오기
String name = (String)member.get(0);
int age = (Integer)member.get(1);
out.print("<html><body>");
out.print(name +"<br>");
out.print(age + "<br>");
out.print("</body></html>");
}
}
결과
/*
1. http://localhost:8090/pro08/cset 요청
데이터 바인딩
2. http://localhost:8090/pro08/cget 요청
바인딩된 데이터를 브라우저에 표시
*/
pro08/WebContext/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<context-param>
<param-name>menu_member</param-name>
<param-value>회원등록 회원조회 회원수정</param-value>
</context-param>
<context-param>
<param-name>menu_order</param-name>
<param-value>주문조회 주문등록 주문수정 주문취소</param-value>
</context-param>
<context-param>
<param-name>menu_goods</param-name>
<param-value>상품조회 상품등록 상품수정 상품삭제</param-value>
</context-param>
...
</web-app>
pro08/src/sec05/ex02/ContextParamServlet.java
package sec05.ex02;
...
@WebServlet(/initMenu)
public class ContextParamServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
/* param-name 값으로 param-value 값 가져오기 */
ServletContext context = getServletContext(); //ServletContext객체 가져오기
String menu_member = context.getInitParameter("menu_member");
String menu_order = context.getInitParameter("menu_order");
String menu_goods =context.getInitParameter("menu_goods");
/* 출력 */
out.print("<html><body>");
out.print("<table border=1 cellspacing=0><tr>메뉴 이름</tr>");
out.print("<tr><td>" + menu_member + "</td></tr>");
out.print("<tr><td>" + menu_order + "</td></tr>");
out.print("<tr><td>" + menu_goods + "</td></tr>");
out.print("</tr></table></body></html>");
}
}
pro08/WebContent/WEB-INF/bin/init.txt
// 메뉴 항목 입력
pro08/src/sec05/ex03/ContextFileServlet.java
package sec05.ex03;
...
@WebServlet("/cfile")
public class ContextFileServlet extends HttpServlet{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
/* 파일 읽기 */
ServletContext context = getServletContext();
InputStream is = context.getResourceAsStream("/WEB-INF/bin/init.txt");
BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
/* 문자열 나누기 */
String menu= null;
String menu_member = null;
String menu_order = null;
String menu_goods = null;
while((menu=buffer.readLine()) !=null){
StringTokenizer tokens = new StringTokenizer(menu, ",");
menu_member=tokens.nextToken();
menu_order=tokens.nextToken();
menu_goods=tokens.nextToken();
}
/* 출력 */
out.print("<html><body>");
out.print(menu_member + "<br>");
out.print(menu_order+ "<br>");
out.print(menu_goods + "<br>");
out.print("</body></html>");
out.close();
}
}
javax.servlet.ServletConfig
서블릿 객체마다 생성되어 서블릿에 대한 여러가지 기능 제공
각 서블릿에서만 접근 가능, 공유 불가
서블릿과 동일한 생명주기
방법1. @WebServlet 애너테이션 이용
urlPatterns: 서블릿 매핑 이름
name: 서블릿 이름
loadOnStartup: 서블릿 로드 순서
initParams: 매개변수 추가
description: 서블릿 설명
pro08/sec06/ex01/InitParamServlet.java
package sec06.ex01;
...
@WebServlet(name ="InitParamServlet",
// 복수 매핑 이름 설정
urlPatterns = { "/sInit","/sInit2" },
// 복수 매개변수 설정
initParams = { @WebInitParam(name="email", value="admin@jweb.com"),
@WebInitParam(name="tel", value="010-1111-2222") })
public class InitParamServlet extends HttpServlet {
protected void doGet( HttpServletRequest request , HttpServletResponse response) throws SevletException, IOException {
response.setContentType( "text/html;charset=utf-8" );
PrintWriter out = response.getWriter();
// 매개변수 name으로 value 가져오기
String email = getInitParameter("email");
String tel = getInitParameter("tel");
out.print( "<html><body>" );
out.print( "<table><tr>");
out.print( "<td>email: </td><td>"+email+"</td></tr>");
out.print( "<tr><td>휴대전화: </td><td>"+tel+"</td>");
out.print( "</tr></table></body></html>" );
}
}
방법2. web.xml에 설정
현재는 잘 쓰이지 않는 방식
pro08/WebContent/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>sinit</servlet-name>
<servlet-class>sec06.ex01.initParamServlet</servlet-class>
<!-- 매개변수 설정 -->
<init-param>
<param-name>email</param-name>
<param-value>admin@jweb.com</param-value>
</init-param>
<init-param>
<param-name>tel</param-name>
<param-value>010-111-2222</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>sinit</servlet-name>
<url-pattern>/first</url-pattern>
</servlet-mapping>
</web-app>
*자바 웹을 다루는 기술