이 기사는 주로 Struts의 요청 전달 기능을 구현합니다. 다른 기능은 천천히 구성됩니다.
최근에 Javassist의 내용을 배웠고 MVC가 주로 MVC의 워크 플로우를 묘사했으며 동시에 간단한 struts2 기능을 실현했습니다.
다음은 간단한 struts2 프레임 워크이며 동시에 자신의 이해를 더합니다.
이 기사는 주로 Struts의 요청 전달 기능을 구현합니다. 다른 기능은 천천히 구성됩니다.
우선, struts2 프레임 워크에서 요청의 구현 및 점프는 주로 struts.xml로 구성됩니다. <action> 라벨은 요청의 정의를 나타냅니다. 여기에는 해당 구현 클래스가 기본적으로 "이름"을 포함합니다. <result "레이블은 '성공', '없음', '로그인', '입력', '입력', '오류'를 포함하여 결과의"이름 "유형을 정의합니다. '', '체인', '리디렉션', '리디렉션', '스트림'; struts.xml을 구성한 후 인터페이스의 양식은 해당 클래스 및 실행 메소드를 찾기 위해 작업 속성에 의해 정의 된 이름 속성 값을 통해 해당 조치 태그를 찾을 수 있습니다. 그런 다음 실행 메소드에 의해 리턴 된 문자열 문자열을 일치하여 결과 태그의 이름과 일치하고 정의 된 유형 유형에 따라 다음 요청 작업을 수행합니다.
STRUTS2가 동일한 프로그램 기능을 요청하는 인터페이스를 어떻게 연결하는지 이해 한 후에는 자체 코드를 통해 기능 의이 부분을 구현할 수 있습니다.
그래서 우리는 어떻게 시작합니까?
우리는 간단한 함수 ①Action part ②Result Part와 함께 두 부분으로 나뉩니다.
행동 부분
∎ 인터페이스의 요청에 따라 해당 클래스 및 실행 방법을 찾아야합니다.
결과 부분
''성공 ','없음 ','로그인 ','입력 '및'오류 '의 유형 문자열을 반환해야합니다.
② 다양한 유형의 요청 주소를 다른 유형의 반환에 대해 지정해야합니다.
∎ 'Dispatcher (default)', '체인', '리디렉션', '리디렉션', '스트림'을 포함하여 정의 해야하는 유형
이 기사에서는 결과의 반환 유형은 두 가지 유형의 '성공'과 '로그인'만 인식하며, 당분간 기본 디스패처 요청 전달 유형이 구현되지 않습니다. 완벽한 기능은 나중에 보충됩니다.
그런 다음 코드를 통해 위의 기능을 달성하는 방법을 살펴 보겠습니다.
첫째, 액션 분석 및 결과형의 두 가지 사용자 정의 주석은 두 가지 사용자 지정 액션 주석에 의해 반환 된 문자열의 해당 메소드와 메소드를 요청합니다.
/ ** * Action Note : ActionName은 URL -Pattern과 동일합니다 * @Author Linling */ @retention (retentionpolicy.runtime) @TargetType.Method Blic @Interface ActionSnotation {String ActionName () Default "; () default {};} /*** 주석 개체로 돌아갑니다. 이름은 'success', 'none', 'error', 'input'를 포함하여 struts 구성에서 결과의 이름과 동일합니다. 로그인;; () 기본 "index.jsp";}
그런 다음 ActionContext 클래스를 정의하여 요청에 필요한 컨텐츠를 저장합니다.
/*** 구현 시뮬레이션 스트럿 구현 구성 파일*@author linling **/public class action context {/*** web.xml의 url -pattern에 해당하는 구성 파일*@author linling **/public class action context {/*** 만* /개인 문자열 URL; *** ActionAntation 주석, 즉 동작* /개인 문자열 메소드에서 실행하는 방법; 예를 들어 : 'Success'; 개인 객체 조치; /** 메소드 매개 변수 유형* / private class <?> [] 매개 변수 이름; * / private String [] ActionParamsName; / *** 요청 된 httpservlet는* / private httpservletResponse 응답입니다.
AnalySePackage는 ActionContext를 조립하는 데 필요한 방법입니다
/** * Scan_Package 패키지 아래에서 클래스 파일을 통과하여 ActionAntation 메소드를 사용하여 분석하여 ActionContext 객체로 조립하여 URLMAP * @Param real_Path Scan_Package * @thro WS ClassNotFoundException * @throws InstantiationException *에 넣습니다. @Throws 불법 행위 exception * @throws notFoundException */ public static void analySepackage (String real_path, String scan_package foundException, InstantificationException, INSTANTIFINGEXCEPTION, INGEGALACCESSEXCEPTion, NotFoundException {파일 = 새 파일 (real_path); if (file.isdirectory ()) {] f (] f (] f (] f). ] f : f : f : file) {analysepackage (f.getabsolutepath (), if (str.indexof ( ". class"); classStype = class.forname (filename); method = classStype.getMethods (method.isan nottingpressnt) {ActionContext ActionContext (); .getAntation (ActionAntation.class); 메소드 Annitation Error! " + Method +", ActionName : " + url +", result.length : " + result.lengts.lengt h);} ActionContext.setUrl (url); ActionTexText.setMethod (method.getName ()). 맵 <res) map = new hashmap <res) (resultAntation result) {string value = result.value () {wash new runtimeexception. is null ");} map.put (result.name (), value);} actionContext.setResults (map); Act IonContext.setClasStype (classtype); ActionContext. setAction (classtype.newinstance ()); actionContext.setParamStype Method.getParameterTypes ());
getParams는 httpservletrequest 요청의 요청 내용을 기반으로 요청 매개 변수 배열입니다.
/** * 매개 변수 유형 파라 스타 타입 및 매개 변수 이름 ActInparamsName을 기반으로 매개 변수 개체를 빌드하기위한 요청 요청을 분석합니다 [] * @param request * @paramstype * @param actionparamsname * @retourn * @instantiationException * @throws 불법 행사 * @ 불법적 인 날짜를 던진다 @ @ @ @ @ @ @ @ involutionantargetexception * @throws nosuchmedhodexception * @throws securityException */ public static 객체 [] 퀘스트 요청, 클래스 <?> [] 매개 변수, strow [] actionparamsception, 불법적 인 사구, 불법적 인 사구증 invocat iiontargexception, nosuchmethodexception, securityexception {object [object] 객체 [int i = 0; i <paramstype.length; i ++); Parampe Style [i]) {객체 [i] = getParam (requestype [i], actionparamsname [i]); classStype.getDeClardFields (); 필드 : fields) {map <string, map = request.getParameterMap (); ) {string key = iterator.next (); 길이 = 2) {계속;} if (! ActionParamsName [i] .equals (strs [0]) {계속;} if (! field.getName (). String value = map.get.getMethod (field.getname ()). } 반환 객체;}
좋아, 다음. 작업 방법을 구현할 수 있습니다
public class loginaction {@ActionNotation (actionName = "login.action", results = {@resultanitation (name = resulttype.success, value = "i ndex.jsp"),@resultAntation (name = resulttype.login, value = "login . (actionName = "loginforuse.action", results = {@ResAnnotation (이름 = resultType.Success, value = "indexp") otary (name = resulttype.login, value = "login.jsp"})}) public goginforuser (int number, loginpojo loginpojo) {if ( "hello".equals (loginpojo.getusername ()) && "world".equojo.getpa ssword ()) {return resulttype.success;} retud resulttype.login;}}.
다음으로, 우리가해야 할 일은 프로그램이 작업 디렉토리의 모든 메소드를 가로 지르고 ActionAntation 메소드를 사용하여이를 ActionContext로 조립하는 것입니다. 이러한 방식으로 요청이 도착하면 요청 주소에 따라 해당 ActionContext를 찾아 반사 메커니즘으로 메소드를 호출 할 수 있습니다.
우리는 두 개의 서블릿을 설정했습니다. 하나는 초기화 프로그램을 수행하는 데 사용됩니다. 하나는 모든 작업 요청을 필터링하는 데 사용됩니다
<Servlet> <Servlet> strutsinitservlet </servlet-name> <servlet-class> com.bayern.struts.servletsinitservlet </servlet-class> <par am-name> scan_package </param-name> <param- value> com .bayern.struts.one </param-value> </init-param> <load-on-startup> 10 </load-startup>> <servlet-name> dispatcherservlet </servlet-name> <servlet-class> com.bayern.struts.one.servlet.dispatcherservlet </servlet-mapping> <servlet-name> dispatcherservlet </servlet-name> <url-pattern>*. 서블릿 맵핑>
DispatcherServlet은 사용 된 조치 요청의 필터링을 구현하고 해당 조치 방법을 실행하고 다음 점프를 할 수 있습니다.
Ublic void dopost (httpservletrequest 요청); (actionContext.getParamStype (), actionContext.getActionParamsName ()); .getAction (), params);
이제 우리는 가장 간단한 strut2 프레임 워크 요청 전달 함수를 구현했습니다. 이 기능은 매우 거칠고 많은 경우가 아직 고려되지 않았습니다
위는이 기사의 모든 내용입니다.