이 기사는 참조를 위해 Struts2 MVC 프레임 워크를 사용자 정의하는 방법을 공유했습니다. 특정 내용은 다음과 같습니다
Custom MVC : (먼저 Model1 및 Model2의 개념을 이해)
Model1 및 Model2 :
Model1 : 비즈니스 로직 코드와 렌더링 코드를 결합한 순수한 JSSP 개발 기술입니다.
Model2 : Model2는 Model1을 기반으로하며 비즈니스 로직 코드를 분리하며 서블릿 만 형성합니다. Model2는 MVC를 기반으로 개발되었습니다.
MVC의 특성은 다음과 같이 요약됩니다.
(1) 데이터 수집 및 디스플레이 분리
(2) 컨트롤러는 서로 다른 모델과 뷰를 결합합니다
(3) 응용 프로그램은 세 부분으로 나뉘어 느슨하게 결합되어 함께 작동하여 응용 프로그램의 확장 성과 유지 가능성을 향상시킵니다.
(4) 각 계층은 다른 기능을 담당하며 자체 의무를 수행합니다. 각 계층의 구성 요소는 동일한 특성을 가지므로 엔지니어링 및 툴링을 통해 프로그램 코드의 생성을 용이하게합니다.
MVC 생각과 장점 (매우 강함)
MVC는 건축 모델이며, 목적은 모델 (비즈니스 로직)과보기 (프레젠테이션 계층)를 분리하여 모델과보기를 서로 영향을 미치지 않고 독립적으로 수정할 수 있도록하는 것입니다. 대부분의 소프트웨어는 아키텍처를 설계 할 때이 패턴을 채택합니다. MVC 모드를 사용하는 방법에는 여러 가지가 있습니다. 브라우저를 통해 탐색하는 시스템이 모바일 버전을 개발하려면보기 만 재개발하면 모델 부분의 비즈니스 로직을 재사용 할 수 있습니다. 많은 소프트웨어는 MVC 모드를 채택하여 B/S 및 C/S 버전을 동시에 시작해야하며 모델 부분을 재사용 할 수 있으며 다양한 뷰 만 개발해야합니다. MVC 아이디어는 응용 프로그램을 M (Model, Model) v (보기,보기) C (컨트롤러, 컨트롤러)의 세 가지 기본 부분으로 나눕니다. 여기서 m은 비즈니스 로직을 처리하는 부분을 나타내고, v는 데이터를 표시하고 사용자 입력을 얻는 부분을 나타내며, c는 중개자와 유사하므로 m과 v가 직접 상호 작용하지 않도록합니다.
기본 단계는 다음과 같습니다.
1. XML 문서 프레임 워크를 만듭니다 .xml
2. 조치 인터페이스를 정의하십시오
3. 액션 맵핑 클래스를 정의하고 액션 노드로 취급합니다.
4. ActionMappingManage 클래스 정의 액션 매핑 클래스 (액션 노드)를 관리합니다.
5. 리플렉션 메커니즘을 사용하여 ActionManager 클래스를 정의하여 문자열 유형의 클래스 이름을 기반으로 특정 클래스를 얻습니다 (Web.xml 태그 쓰기)
6. 실행 시간 제어를 위해 서블릿을 작성하십시오
7. 테스트를 위해 로그인 클래스를 정의하십시오
1. XML 문서 프레임 워크를 만듭니다 .xml
<!-? xml version = "1.0"encoding = "utf-8"?-> <!-정의 제한 조건 파일-> (참고) <!-요소는 요소를 나타냅니다.> <!-attlist 표시 속성-> <!-cdata는 문자열 유형-> <!-requireations arever at areptable을 표시합니다. 전달-> <!-요소 조치 (action)-> <!-요소 조치 (result*)-> (**) <!-attlist 액션 이름 cdata #required 클래스 cdata #required-> <!-attlist 결과 이름 cdata #implied redirect (true | false) "false"->]> <framwork> <!-action am <action am <action name = <action name "> 이름 = "success"> success.jsp </result> <result name = "login"> index.jsp </resent> </action> </action> </framework>
참고 : 공간 및 <>의 쓰기 사양.
노드의 계층.
2. 조치 인터페이스를 정의하십시오
참고 : Excute 매개 변수가 작성, 요청 및 응답됩니다.
3. 액션 맵핑 클래스를 정의하고 액션 노드로 취급합니다 (액션 노드의 레이블 작성).
데이터를 필드 및 결과 컬렉션에 캡슐화합니다.
참고 : 글쓰기에 데이터를 추가하십시오. (지도 컬렉션)
4. ActionMappingManage 클래스 정의 액션 매핑 클래스 (액션 노드)를 관리합니다.
/** 액션 맵핑 클래스를 관리하는 데 사용되는 액션 노드*/public class actionmappingmanager {// ActionMapping 클래스 모음 개인 맵 <문자열, 액션 맵핑> 맵 = new Hashmap <String, ActionMapping> (); public actionmapping getActionMapping (문자열 이름) {return maps.get (이름); } // src project의 모든 구성 파일을 구문 분석합니다. }} // 초기화 초기화 방법 // XML 문서 공개 void init (문자열 경로) {try {inputStream is = this.getClass (). getResourCeasStream ( "/"+path); // XML 문서를 구문 분석합니다. doc = new SaxReader (). read (is); // 루트 노드 요소를 가져옵니다. root = doc.getRootElement (); // 작업 노드 요소 action = (element) root.elementiterator ( "action"). next (); // for loop을 사용하여 액션 노드 아래의 모든 동작 노드 (iterator <etement> action = action.lementiterator ( "action"); action.hasnext ();) {action> node element actionnext = action.next (); // 액션 노드에서 이름 속성 및 클래스 속성을 각각 문자열 이름 = actionNext.attributeValue ( "name"); 문자열 className = actionNext.attributeValue ( "class"); // 위의 두 속성을 ActionMapping Class ActionMapping MAP에 저장합니다. mapapp.setclassName (className); mapapp.setName (이름); // 액션 노드 아래에 여러 결과 노드가 있기 때문에 (iterator <etement> result = actionnext.elementiterator ( "result"); result.hasnext ();) {// 결과 노드 요소 resultNext = result.next (); // 결과 노드의 이름 속성 값과 결과 노드의 값을 추출하십시오. 결과 문자열 resultName = resultNext.attributeValue ( "name"); 문자열 resultValue = resultnext.getText (); // 액션 맵핑 클래스 호출을 용이하게하기 위해 액션 맵핑에서 세트에 세트로 저장하십시오 (ActionMapping 클래스에 데이터가 있습니다!) mapp.AddResult (resultName, resultValue); System.out.println (mapp.getName ()); } // 모든 동작 노드 모음을 가져옵니다. Maps.put (mapp.getName (), Map); }} catch (예외 e) {// todo : 핸들 예외}}}}요약:
dom4j를 통해 framework.xml 구성 파일을 구문 분석하십시오. 루트 노드와 동작 노드를 얻은 다음 For Loop을 통해 작업 노드 아래에서 동작 노드를 이동하여 이름과 클래스의 속성 값을 얻습니다. 동작 노드 아래에 여러 결과 노드가 있고 동작 하에서 모든 결과 노드가 있으므로 액션 맵핑에 이중 열에 저장되며 마지막으로 모든 작업 노드 세트를 얻습니다.
참고 : init 메소드의 쓰기 및 매개 변수 그룹을 사용한 ActionMappingMaperManager의 쓰기.
5. 반사 메커니즘을 사용하여 ActionManager 클래스를 정의하여 문자열 유형의 클래스 이름을 기반으로 특정 클래스를 얻습니다.
public class actionmanager {public static action getActionClass (String ClassName) {class clazz = null; 행동 조치 = null; // 현재 스레드의 클래스 로더를 가져옵니다 {// 스레드에 클래스가있는 경우 클래스 이름에 따라 클래스 유형을 직접 얻으십시오. Clazz.CurrentThread (). getContextClassLoader (). loadClass (className); } catch (classNotFoundException e) {// TODO 자동 생성 캐치 블록 E.PrintStackTrace (); } if (clazz == null) {try {// 스레드에 없으면 클래스를 사용하여 clazz = class.forname (className)을 가져옵니다. } catch (classNotFoundException e) {// TODO 자동 생성 캐치 블록 E.PrintStackTrace (); }} if (action == null) {try {// 획득 된 유형을 동작으로 변환하고 매개 변수가없는 생성자를 호출하는데, 이는 어느 정도 새로운 것과 동일하지만 유형 action = (action) clazz.newinstance ()를 지정해야합니다. } catch (InstantiationException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } catch (불법 행위 exception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }} 반환 조치; }}web.xml의 노드 구성 :
6. 런타임을 제어하기 위해 서블릿을 작성하십시오 (서블릿, 모든 클래스 초기화)
공개 클래스 MyServlet은 httpservlet을 확장 { / ***당신은 너무 장난 꾸러기* / public void doget (httpservletrequest 요청, httpservletreponse 응답) servletexception, ioexception {dopost (요청, 응답); } <br> / ***계속 열심히 일하고 있습니다* / ActionMappingManager man = null; public void dopost (httpservletRequest 요청, httpservletResponse 응답) servletexception, ioexception {// 액션 매핑 actionmapping actionmapping = man.getActionMapping (getPath (request)); // 동작 인터페이스의 반사 메커니즘을 가져옵니다 action action = actionManager.getActionManager (actionMapping.getClassName ()); try {string message = action.execute (요청, 응답); 문자열 results = actionMapping.getResults (메시지); 응답 .sendredirect (결과); } catch (예외 e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }} /** 요청의 경로 이름을 가져옵니다* /public string getPath (httpservletRequest 요청) {// project + 요청 주소 문자열 requestUri = request.getRequestUri (); // 프로젝트 이름 문자열 contextPath = request.getContextPath (); // 특정 요청 문자열 경로 = requestUri.SubString (contextPath.Length ()); 문자열 filename = path.substring (1, path.lastindexof ( ".")); 리턴 파일 이름; } / * * init를 다시 작성하고 프로그램을 실행하고로드합니다. 기능은 초기화 구성 정보를 얻는 것입니다. //config.getInitParameter는 지정된 이름 String filename = config.getInitParameter ( "config")의 초기화 매개 변수 내용입니다. 문자열 [] filenames = null; if (filename == null) {// 비어있는 경우 filenames = new String [] { "framework.xml"}; } else {// 다른 구성 매개 변수 정보가 있으면 filenames = filename.split ( ",")를 분리하여 배열에 저장됩니다. } // 초기화 init 메소드를 사용하면 man = new ActionMappingManager (filenames); }}참고 : 코드의 레벨과 주석.
7. 테스트를 위해 로그인 클래스를 정의하십시오
공개 클래스 로그인 action action {@override public string execute (httpservletrequest request, httpservletResponse 응답) 예외 {string name = request.getParameter ( "name"); 문자열 pwd = request.getParameter ( "pwd"); if (name.equals ( "1") && pwd.equals ( "1")) {return success; } else {반환 로그인; }}}JSP 코드 :
효과를 실현하십시오 :
도로가 아무리 길어도 단계별로 걸을 수 있으며 도로가 아무리 짧더라도 한 걸음 더 나아가지 않고 도달 할 수 없습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.