일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 이클립스
- git
- 답변형 게시판
- ||
- group by
- HTTP Status 404
- Oracle DB
- HTML
- github
- Oracle SQL
- jQuery
- CRUD
- tomcat
- oracle
- HTTP Status 500
- 성적프로그램
- JSP
- SQL
- distinct
- 부트스트랩
- sql developer
- 한글 인코딩
- rownum
- 제약조건
- Bootstrap
- Java
- 과정평가형
- JavaScript
- alias
- 모조칼럼
초급의 끄적거림
[servlet] 사용자 정의 서블릿 작성 (MyController 클래스) 본문
첫 페이지 : index.do
답변형 게시판 : 쓰기, 목록 상세보기, 삭제, 수정
회원 : 로그인, 로그아웃, 회원가입, 아이디 중복확인, 아이디/비번찾기
이것들을 다 web.xml에 넣으면 비효율적임
때문에 이것들을 한번에 관리할 수 있는 것을 만듦
Model : DAO
View : JSP, EL, JSTL
Control : MyController, DispatcherServlet (Spring)
0. MVC답변형 게시판
- bbs2 라는 패키지 만들기
- WebContent\bbs2 폴더 생성
- index.jsp와 header.jsp 의 MVC 카테고리의 경로가 .do 인지 확인
1. 커맨드 패턴
- 서블릿에서 사용자의 요청을 명령어 전달
- 사용자가 어떤 요청을 했는지 판단하기 위한 가장 일반적인 방법이 명령어로 사용자의 요청을 전달하는 것
예) 글목록 명령, 글삭제 명령
1-1) 요청 파라미터로 명령어를 전달하는 방법
http://localhost:8090/myweb/control?command=login.do
1-2) 요청 URI 자체를 명령어로 사용하는 방법
http://localhost:8090/myweb/index.do
2. 사용자 요청 커맨드 작성 및 등록
2-1) /WEB-INF/command.properties (새 파일만들기)
- 경로 : /WEB-INF/command.properties
- web.xml을 대신해서 명령어를 모아둘 곳.
- 명령어=클래스명
- 경로와 이름의 대소문자 주의 (수많은 오류의 주범이 될 수 있음)
/myweb/index.do=net.action.Index
/myweb/bbs2/bbsform=net.bbs2.BbsForm
<!-- MyController 서블릿 등록 -->
<servlet>
<servlet-name>ControllerAction</servlet-name>
<servlet-class>net.controller.MyController</servlet-class>
<init-param> <!-- 초기값으로 이 값을 가져가라 -->
<param-name>propertyConfig</param-name>
<param-value>D:\java0514\workspace\myweb\WebContent\WEB-INF\command.properties</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ControllerAction</servlet-name>
<url-pattern>*.do</url-pattern> <!-- .do 패턴으로 요청하면 무조건 거치는 것 -->
</servlet-mapping>
2-2) 한글 필터 (EncodeFilter.java)
- 경로 주의 : net.utility/EncodeFilter.java
package net.utility;
import java.io.*;
import javax.servlet.*;
public class EncodeFilter implements Filter{
@Override
public void destroy() { }
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
//request 보내기전에 전처리할 코드가 있으면 여기서 처리한다.
//또한 response후의 후처리할 코드가 있다면 여기서 처리
arg0.setCharacterEncoding("UTF-8");
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}//class end
<!-- web.xml에 한글 필터 등록 -->
<filter>
<filter-name>encode</filter-name>
<filter-class>net.utility.EncodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encode</filter-name>
<url-pattern>/*</url-pattern> <!-- 정해진 패턴을 찍고가는데 /* 는 '전체' 를 의미 -->
</filter-mapping>
3. MyController
- net.controller 클래스 생성
클래스 |
객체 (object) |
class Index{} |
new Index() |
class BbsForm{} |
new BbsForm() |
class BbsInsert{} |
new BbsInsert() |
commandMap에 저장할 모습 (key와 value 형태로 데이터를 관리할 수 있게 함)
key |
value |
index.do |
new Index() |
bbsform.do |
new BbsForm() |
bbsinsert.do |
new BbsInsert() |
interface CommandAction{}
class Index implements CommandAction{}
class BbsForm implements CommandAction{}
class BbsList implements CommandAction{}
CommandAciton com=new Index()
CommandAciton com=new BbsForm()
CommandAciton com=new BbsList()
자식(Index/BbsForm/BbsList)이 부모(commandAction)집에 들어갈 수 있다 그 떄 부모는 자식의 모습으로 바꿈 → 다형성
package net.controller;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import javax.activation.CommandMap;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.action.CommandAction;
public class MyController extends HttpServlet {
private Map commandMap = new HashMap(); //명령어와 명령어 처리 클래스를 쌍으로 저장, HashMap : key와 value 형태로 데이터 관리를 할 수 있게 함
//명령어와 처리클래스가 매핑되어 있는 properties 파일을 읽어서 Map 객체인 commandMap에 저장
//명령어와 처리클래스가 매핑되어 있는 properties 파일은 command.properties파일
public void init(ServletConfig config) throws ServletException{
//web.xml에서 propertyConfig에 해당하는 init-param의 값을 읽어옴
String props=config.getInitParameter("propertyConfig");
Properties pr=new Properties(); //명령어와 처리클래스의 매핑정보를 저장할 Properties 객체 생성
FileInputStream f=null;
try{
f = new FileInputStream(props); //command.properties 파일 가져오기
pr.load(f); //command.properties 파일을 Properties 객체에 저장하기
}catch(IOException e){
System.out.println(e);
}finally{
if (f !=null) try { f.close(); } catch (Exception ex) {}
}//try end
Iterator keyIter = pr.keySet().iterator(); //Iterator 객체는 Enumeration객체를 확장시킨 개념의 객체
while(keyIter.hasNext()){ //객체를 하나씩 꺼내서 그 객체명으로 Properties 객체에 저장된 객체에 접근
String key = (String)keyIter.next();
String value= pr.getProperty(key);
/*System.out.println(key);
System.out.println(value);*/
try{
Class commandClass = Class.forName(value); //해당 문자열을 클래스로 만든다
Object commandInstance = commandClass.newInstance(); //해당 클래스의 객체를 생성
commandMap.put(key, commandInstance); //Map객체인 commandMap에 객체 저장
}catch(Exception e){ System.out.println(e); }
}//while end
}//init() end
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
//process는 doPost를 복사해서 만듦
protected void process(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String view=null;
CommandAction com=null;
try{
String command= req.getRequestURI(); // /myweb/index.do
com = (CommandAction)commandMap.get(command); //다형성
view = com.requestPro(req, resp);
}catch(Throwable e){
throw new ServletException();
}
RequestDispatcher dispatcher=req.getRequestDispatcher(view);
dispatcher.forward(req, resp);
}//process() end
}//class end
4. 슈퍼 인터페이스
- 명령어 메뉴 나열
- 매니저 클래스 역할
- 서블릿으로부터 명령어의 처리를 지시받아 해당 명령에 대한 작업을 처리하고 작업결과를 서블릿으로 리턴한다.
- 실제로 작업을 처리하는 것은 구현 클래스가 수행
4-1) net.action.CommandAction.java
package net.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//요청 파라미터로 명령어를 전달하는 ㅏㅇ식의 슈퍼 인터페이스
public interface CommandAction {
//추상 메소드
public String requestPro(HttpServletRequest req, HttpServletResponse resp) throws Throwable;
}//interface()end
5. 명령어 처리 클래스
5-1) 첫페이지 index.jsp 호출
package net.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/* 첫 페이지 index.jsp 호출
결과 확인 : http://localhost:8090/myweb/index.do
*/
public class Index implements CommandAction{
@Override
public String requestPro(HttpServletRequest req, HttpServletResponse resp)
throws Throwable {
return "index.jsp";
}
}//class end
* 첫 페이지 호출
http://localhost:8090/myweb/index.do
'JSP' 카테고리의 다른 글
[JSP] MVC 패턴 (0) | 2019.11.10 |
---|---|
[JSP] 한글 깨짐 여러 유형 (0) | 2019.11.03 |
[MVC] EL / JSTL / 에러페이지 구현 (0) | 2019.10.01 |
[MVC] 서블릿 개요, JSP 형식 출력 (0) | 2019.09.30 |
[에러] Could not delete 경로/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/myweb/storage. May be locked by another process. (0) | 2019.09.30 |