본문 바로가기

카테고리 없음

Weblogic Server 11에서 Web Module를 작성하는 예

Weblogic Server 11에 포함된 OEPE에서 Web Module을 작성하는 예
앞에서부터 이어지는 설명이므로 Session Bean을 작성하는 부분을 먼저 확인해야 한다.



















위와 같은 절차로 서블릿을 생성한 후에 서블릿의 내용에 다음과 같이 추가한다.
 @EJB(name="ScottBean")
 private ScottBeanLocal scottBean;







doGet() 안에 다음 코드를 입력하고 저장한다.

  response.setContentType("text/plain");
  Long empno = 7369L;
  String empParam = request.getParameter("empno");
  if (empParam != null)
  empno = Long.parseLong(empParam);
  PrintWriter out = response.getWriter();
  Emp emp = scottBean.findEmp(empno);
  out.println("" + empno + ": "
  + emp.getEname() + " " + emp.getSal());
  out.println("working in " + emp.getDept().getDname()
  + " department");
  out.println("as " + emp.getJob().getJobTitle());
  out.println("has " + (emp.getDept().getEmps().size()-1)
  + " colleagues");



















지금까지 설정해왔던 것들을 정리해 보면....
Weblogic Server의 관리콘솔에서 데이터소스를 설정하고 JNDI이름을 jdbc/myoracle 이라고 했는데, 이 이름을 JPA에서 사용하여 데이터베이스와 연결할 때 사용한다. JPA에서는 데이터베이스와 맵핑하기 위한 Entity클래스를 선언했고 Session Bean에서 JPA를 접속해서 데이터를 검색할 때 EntityManager를 이용하였다. 웹브라우저를 이용하는 일반이용자들은 Session Bean에 접속하여 데이터를 검색할 수 있는데, 웹 브라우저에서 Session Bean에 접속할 수 있도록 Web Module을 작성했으며 Servlet을 사용하여 브라우저에 검색된 데이터를 출력해 보았다.


Servlet에서 웹브라우저에 출력하는 것은 적합하지 않으므로 JSP를 추가한다면 다음과 같이 작성할 수 있다.
ScottServlet.java

package scott.test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import scott.ejb.ScottBeanLocal;
import scott.model.Emp;

public class ScottServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
 
 @EJB(name="ScottBean")
 private ScottBeanLocal scottBean;

 
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("text/plain");
  Long empno = 7369L;
  String empParam = request.getParameter("empno");
  if (empParam != null)
  empno = Long.parseLong(empParam);
  PrintWriter out = response.getWriter();

  Emp emp = scottBean.findEmp(empno);

  request.setAttribute("emp", emp);
  getServletContext().getRequestDispatcher("/empView.jsp").forward(request, response);

  /*
  out.println("" + empno + ": "
  + emp.getEname() + " " + emp.getSal());
  out.println("working in " + emp.getDept().getDname()
  + " department");
  out.println("as " + emp.getJob().getJobTitle());
  out.println("has " + (emp.getDept().getEmps().size()-1)
  + " colleagues");
  */

 }
}



empView.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import="scott.model.Emp"%>
<% Emp emp = (Emp)request.getAttribute("emp"); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>empView.jsp</title>
</head>
<body><center>
 <%=emp.getEmpno() + ": " + emp.getEname() + " " + emp.getSal()%><br>
 <%="working in " + emp.getDept().getDname()+ " department"%><br>
 <%="as " + emp.getJob().getJobTitle()%><br>
 <%="has " + (emp.getDept().getEmps().size()-1)+ " colleagues"%><br>
</center>
</body>
</html>



JSP에서 Session Bean에 접속하는 예 (JSP나 JSP의 Bean클래스에서 EJB Bean클래스에 접근하기 위해서는 JNDI이름으로 접근해야 한다, JNDI이름은 관리콘솔에서 배포된 프로그램을 선택해 보면 이름이 표시된다. 페이지 하단 참조)
주의: 서블릿에서 @EJB(name="ScottBean") 와 같이 주입하여 빈객체를 사용하는 경우에만 아래와 같은 방법으로 JSP에서도 EJB객체에 대한 접근이 가능하다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import="scott.model.Emp"%>
<%@ page import="scott.ejb.ScottBeanLocal" %>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.rmi.*" %>
<%
 Context ctx = new javax.naming.InitialContext();
 Object obj = ctx.lookup("java:comp/env/ScottBean");
 ScottBeanLocal scottBean = (ScottBeanLocal)PortableRemoteObject.narrow(obj,ScottBeanLocal.class);
 Emp emp = scottBean.findEmp(7369L);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Session Bean 에 접속하는 JSP 예제</title>
</head>
<body>
사 번: <%=emp.getEmpno()%><br>
이 름: <%=emp.getEname()%><br>
부 서: <%=emp.getDept().getDname()%><br>
부서인원수: <%=emp.getDept().getEmps().size()%><br>
직 무: <%=emp.getJob().getJobTitle()%><br>
</body>
</html>



JSP와 JSP Beans 클래스를 사용하여 Session Bean에 접근하는 예
FacsdeBean.java

package scott.test;

import javax.ejb.EJB;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;

import scott.ejb.ScottBeanLocal;
import scott.model.Emp;

public class FacadeBean {
 
 //@EJB(name="ScottBean")
 private ScottBeanLocal scottBean;
 
 public Emp findEmp(long empno){
  javax.naming.InitialContext ctx = null;
  try {
   ctx = new javax.naming.InitialContext();
   Object obj = ctx.lookup("java:comp/env/ScottBean");
   scottBean = (ScottBeanLocal)PortableRemoteObject.narrow(obj,ScottBeanLocal.class);
  } catch (NamingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return scottBean.findEmp(empno);
 }
}


test.jsp(콘트롤러와 뷰 역할을 담당하는 JSP, 위에 선언된 빈을 사용하여 EJB에 접근함)

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import="scott.model.Emp"%>
<%@ page import="scott.test.*" %>

<jsp:useBean id="fb" class="scott.test.FacadeBean" />
<% Emp emp = fb.findEmp(7369); %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Session Bean 에 접속하는 JSP 예제</title>
</head>
<body>
사 번: <%=emp.getEmpno()%><br>
이 름: <%=emp.getEname()%><br>
부 서: <%=emp.getDept().getDname()%><br>
부서인원수: <%=emp.getDept().getEmps().size()%><br>
직 무: <%=emp.getJob().getJobTitle()%><br>
</body>
</html>


Local 접속시에 사용되는 EJB의 이름은 서버 관리콘솔에서 다음과 같이 확인할 수 있다.