Weblogic Server 11에 포함된 OEPE에서 Web Module을 작성하는 예
앞에서부터 이어지는 설명이므로 Session Bean을 작성하는 부분을 먼저 확인해야 한다.
위와 같은 절차로 서블릿을 생성한 후에 서블릿의 내용에 다음과 같이 추가한다.
@EJB(name="ScottBean")
private ScottBeanLocal scottBean;
doGet() 안에 다음 코드를 입력하고 저장한다.
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
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객체에 대한 접근이 가능하다.
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의 이름은 서버 관리콘솔에서 다음과 같이 확인할 수 있다.