struts2에서 동작 부분, 즉 컨트롤러 층은 낮은 침입 방법을 채택합니다. 왜 그렇게 말합니까? struts2에서 행동 클래스에서 기본 클래스를 상속하거나 인터페이스를 구현할 필요가 없으며 서블릿 API와 직접 결합되지 않기 때문입니다. 일반적으로 일반적인 POJO (일반적으로 매개 변수가없는 실행 메소드를 포함해야 함)와 비슷하며 컨텐츠에서 일련의 메소드 (매개 변수 메소드 없음)를 정의 할 수 있으며 구성을 통해 독립적 인 동작으로 사용할 수 있으므로 코드 재사용을 실현할 수 있습니다.
예를 들어:
패키지 예제; public class userAction {private String username; 개인 문자열 비밀번호; public String execute ()는 예외 {// ……… .. "성공"을 반환합니다. } public String getUserName () {return username; } public void setusername (String username) {this.username = username; } public String getPassword () {return password; } public void setpassword (문자열 비밀번호) {this.password = password; }}액세스 액세스 서블리
이 조치 클래스의 속성은 매개 변수 및 프로세스 결과를 캡슐화 할 수 있습니다. 시스템은 그것들을 엄격하게 구별하지 않습니다.
그러나 사용자가 개발 한 액션 클래스를보다 표준화하기 위해 STRUTS2는 인터페이스 작업을 제공하며 다음과 같이 정의됩니다.
publicinterface action {publicstaticfinal String error = "error"; publicstaticfinal String input = "입력"; publicstaticfinal String none = "none"; publicstaticfinal 문자열 로그인 = "로그인"; publicstaticfinal String success = "success"; public string execute ()는 예외를 던집니다;}그러나 조치를 작성할 때 일반적으로 인터페이스를 구현하지 않고 인터페이스의 구현 클래스 조치 업적을 상속합니다.
이 클래스의 코드는 다음과 같습니다.
공개 집단 업무 업포는 행동, 유효한, ValidationAware, TextProvider, LocalEprovider, Serializable {............. Public void setActionErrors (collection errormessages) {validationAware.setActionErrors (errormessages)를 구현합니다. } public collection getActionErrors () {return validationAware.getActionErrors (); } public void setActionMessages (수집 메시지) {validationAware.SetActionMessages (메시지); } public collection getActionMessages () {return validationAware.getActionMessages (); } public collection getErrorMessages () {return getActionErrors (); } public map getErrors () {return getFielDerrors (); } // 양식 필드 검증 오류 설정 공용 void setfielderrors (map errormap) {validationAware.setfielderrors (errormap); } public map getFielDerrors () {return validationAware.getFielderrors (); } public locale getLocale () {ActionContext CTX = ActionContext.getContext (); if (ctx! = null) {return ctx.getLocale (); } else {log.debug ( "조치 컨텍스트 초기화되지 않음"); 널 리턴; }} // 국제 정보를 얻는 메소드 공개 문자열 getText (String atextName) {return textProvider.getText (atextName); } public String getText (String atextName, String defaultValue) {return textProvider.getText (atextName, defaultValue); } public String getText (String atextName, String defaultValue, String obj) {return textProvider.getText (atextName, defaultValue, obj); } ......... // 국제 리소스 패키지에 액세스하는 데 사용되는 방법 공개 자원 bundle getTexts () {return textProvider.getTexts (); } public resourceBundle getTexts (String AbundLename) {return textProvider.getTexts (AbundLename); } // 동작 오류 메시지 추가 공개 void addactionError (String anerrorMessage) {validationAware.AddActionError (anerrorMessage); } // 작업의 일반 정보 추가 공개 void addactionMessage (String Amessage) {validationAware.AdDactionMessage (Amessage); } public void addfielderror (String fieldName, String errorMessage) {validationAware.addfielderror (FieldName, errormessage); } public void validate () {} public object clone ()는 clonenotsupportedException {return super.clone (); } .........}앞에서 언급했듯이 struts2는 서블릿 API와 직접 결합되지 않으므로 Servlet API에 어떻게 액세스합니까?
struts2는 servlet API를 시뮬레이션하는 ActionContext 클래스를 제공합니다. 주요 방법은 다음과 같습니다.
1) 개체 get (Object Key) :이 메소드는 httpservletrequest.getAttribute (String Name) 메소드를 시뮬레이션합니다.
2) map getApplication () ServletContext 인스턴스를 시뮬레이션하는 맵 객체를 반환합니다.
3) 정적 ActionContext getContext () : 시스템의 ActionContext 인스턴스를 가져옵니다.
4) map getsession () : httpsession 인스턴스를 시뮬레이션하는 맵 객체를 반환합니다.
5) map getParameters () : 모든 요청 매개 변수 가져 오기, 시뮬레이션 된 httpservletrequest.getParameterMap ()
이 방법들이 왜 항상지도를 반환하는지 궁금 할 것입니다. 이것은 주로 테스트의 용이성을위한 것입니다. struts2에는이 변환을 완료하는 데 도움이되는 내장 인터셉터가 있기 때문에 맵 객체를 실제 서블릿 API 인스턴스로 변환하는 방법에 대해서는 전혀 걱정하지 않습니다.
Servlet API를 직접 사용하기 위해 Struts2는 다음 인터페이스를 제공합니다.
1) ServletContextAware :이 인터페이스를 구현하는 동작은 ServletContext 인스턴스에 직접 액세스 할 수 있습니다.
2) servletrequestaware :이 인터페이스를 구현하는 동작은 httpservletrequest 인스턴스에 직접 액세스 할 수 있습니다.
3) ServletReponseaware :이 인터페이스를 구현하는 조치는 httpservletresponse 인스턴스에 직접 액세스 할 수 있습니다.
위의 것은 주로 액션 액세스 서블릿에 대해 이야기합니다. Struts2의 행동이 코드 재사용을 어떻게 구현하는지 살펴 보겠습니다. 예를 들어 userAction을 사용하십시오. 이 조치가 사용자 등록 및 로그인 (Longin)을 모두 처리하도록하면이 작업을 어떻게 다시 작성해야합니까? 다시 작성된 사용자 Actional은 다음과 같습니다.
패키지 예제; public class useraction은 ActionSupport {private String username; 개인 문자열 비밀번호; 공개 문자열 등록 ()은 예외 {// ………… .. 반환 성공; } public string login ()은 예외를 던졌습니다 {// ……… .. 반환 성공; } public String getUserName () {return username; } public void setusername (String username) {this.username = username; } public String getPassword () {return password; } public void setpassword (문자열 비밀번호) {this.password = password; }} struts.xml의 조치 구성
이런 식으로 쓰는 것이 좋습니까? 물론 작동하지 않습니다. 또한 struts.xml 파일로 구성해야합니다. 두 가지 구성 방법이 있습니다.
1) 일반 방법을 사용하여 동작 요소의 메소드 속성을 지정하십시오.
<action name =”loginaction”class =”example.useraction”method =”로그인”> <결과 이름 =”성공”>/결과 .jsp> </action> <action name =”registaction”class =”example.useraction”> <result name =”success”>/success.jsp </action>
2) 와일드 카드를 사용하여 동작 요소의 메소드 속성을 지정하십시오.
<action name =”*action”class =”example.userAction”메서드 =”{1}”> <결과 이름 =”성공”>/success.jsp </resent> </action>와일드 카드를 사용하는 방법은 너무 유연하며 다음은 더 복잡한 구성 상황입니다.
<action name =”*_*”class =”example. {1} action”method =”{2}”> ………. </action>여기서 자리 표시 자 {1}은 이전 *의 _와 일치하고 {2}는 다음 *과 일치합니다.
주석 방법을 기반으로 한 조치 구성 :
아래에서 이야기하고 싶은 동작 구성은 SRC/Struts.xml에 있지 않지만 주석을 사용하여 구성하기위한 전제 조건은 기본 6 개의 JAR 패키지 외에도 Struts-2.1.8.1/lib/lib/lib/lib/lib/lib/lib/lib/lib/lib가 필요하다는 것입니다.
그러나 struts.xml에는 여전히 구체적인 예가 필요합니다
login.jsp
<%@ page language = "java"import = "java.util.*"pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtml 4.01 전환 // en"> <html> <head> <title> struts2log in verification </title> content = "keyword1, keyword2, keyword3"> <meta http-equiv = "description"content = "이것은 내 페이지입니다"> <!-<link rel = "stylesheet"type = "text/css"href = "styles.cs">-> </head> <h3> struts2login </h3> action = "$ {pagecontext.request.contextpath} /user/login.qqi"method = "post"> <table> <tr> <td> username </td> <td> <입력 유형 = "text"name = "loginname"/> </td> 이름 = "pwd"/> </td> </td> </tr> <tr> <td colspan = "2"> <입력 유형 = "제출"value = "login"/> </td> </tr> </table> </body> </html> src/struts.xml
<span style = "font-size : large;"> <? xml version = "1.0"encoding = "utf-8"?> <! doctype struts public "-// apache 소프트웨어 재단 // dtd struts configuration 2.1.7 // en" "http://struts.apache.org/dttds-2.1.7.dtd>. 요청 매개 변수 인코딩 메소드-> <constant name = "struts.i18n.encoding"value = "utf-8"/> <!-Struts2에서 처리 한 요청 접근 유형을 지정하십시오. 쉼표로 분리 된 다중-> <constant name = "struts.action.extension"value = "action, do, go, qqi"/<!-struts.xml이 변경 될 때, 다시로드할지 여부. 기본값은 False (생산 환경에서 사용)이며 개발 단계를 열는 것이 가장 좋습니다-> <constant name = "struts.configuration.xml.reload"value = "true"/> <!-스트럿의 개발 모드를 사용하는지 여부. 개발 모델에는 더 많은 디버깅 정보가 있습니다. 기본값은 False (생산 환경에서 사용)이며 개발 단계를 열는 것이 가장 좋습니다-> <constant name = "struts.devmode"value = "false"/> <!-브라우저가 정적 컨텐츠를 캐시하는지 여부를 설정하십시오. 기본값은 사실입니다 (생산 환경에서 사용)는 개발 단계를 닫는 것이 가장 좋습니다-> <constant name = "struts.serve.static.browsercache"value = "false" /> <!-스프링이 액션 객체의 생성을 담당한다고 지정하십시오 <constant name = "struts.object-factory"value = "spring" /> --> <! name = "struts.enable.dynamicmethodinvocation"value = "false"/> </struts> </span>
loginaction.java
패키지 com.javacrazyer.web.action; import org.apache.struts2.convention.annotation.action; import org.apache.struts2.convention.annotation.exceptionmapping; import org.apache.struts2.convention.annotation.exceptionmappings; import org.apache.struts2.convention.annotation.namespace; import org.apache.struts2.convention.annotation.parentpackage; import org.apache.struts2.convention.annotation.result; import org.apache.struts2.convention.annotation.results; com.opensymphony.xwork2.actionSupport 가져 오기; /** * 주석을 사용하여 액션을 구성하기 위해 */@parentPackage ( "struts-default") // 부모 패키지 @namespace ( "/user") @results ({@result (name = "success", location = "/msg.jsp"), @Result (name = "error", location = "/error.jsp")) @Exmapting (@Exmaptings = "java.lange.runtimeexception", result = "error")}) public class loginaction actionSupport {private static final long serialversionuid = -2554018432709689579L; 개인 문자열 loginname; 개인 문자열 pwd; @Action (value = "login") public string login ()은 예외를 던져 {if ( "qq".equals (loginname) && "123".equals (pwd)) {return success; } else {return error; }}} @Action (value = "add", results = {@result (이름 = "success", location = "/index.jsp")}) public String add () throws exception {return success; } public String getLoginName () {return loginName; } public void setLoginName (String loginName) {this.loginName = loginName; } public String getPwd () {return pwd; } public void setpwd (문자열 pwd) {this.pwd = pwd; }}
성공하지 못할 것입니다 .jsp 및 error.jsp
주석 구성에 대한 설명
1) @parentPackage 부모 패키지를 지정합니다
2) @namespace 네임 스페이스를 지정합니다
3) @Results 결과 배열
4) @Result (이름 = "성공", 위치 = "/msg.jsp") 결과 매핑
5) @Action (value = "로그인") 요청 처리 방법에 대한 요청 URL을 지정합니다. 액션 클래스, 메소드에 추가 할 수 없습니다.
6) @ExceptionMappings 예외의 첫 번째 수준 선언 배열
7) @exceptionmapping 맵 선언 예외
이 방법은 일반적으로 사용되지 않으므로 이해할 수 있습니다.