Struts2 - мне нужен своего рода EL, я думаю - PullRequest
0 голосов
/ 07 декабря 2010

У меня есть страница, которая должна показывать некоторые div или некоторые другие в соответствии со значением из bean / action.

Я имею в виду, что-то вроде этого:

*** EL if action.isLogged=true ***
    div 1
*** EL if action.isLogged=false ***
    div 2

Но на Struts2Я думаю, что я не могу делать эти вещи.Как я могу это сделать?Перехватчики?

Приветствия

ОБНОВЛЕНИЕ

public class UserManager extends ActionSupport {
    private String nickname;
    private String password;
    private boolean loggedOn;

    @Override
    public String execute() throws Exception {
        // somethings
        return SUCCESS;
    }

    public String getNickname() { return nickname; }
    public void setNickname(String newValue) { nickname=newValue; }

    public String getPassword() { return password; }
    public void setPassword(String newValue) { password=newValue; }

    public boolean isLoggedOn() {
        return loggedOn;
    }
}

КОД ОШИБКИ ОБНОВЛЕНИЯ

java.lang.NullPointerException
    model.UserManager.checkLogin(UserManager.java:76)
    model.UserManager.execute(UserManager.java:26)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
    com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
    org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
    org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
    org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
    org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
    java.lang.Thread.run(Thread.java:619)

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

Вам понадобится метод get для вашего действия с именем isLoggedOn().

<c:choose>
    <c:when test="${action.loggedOn}">
        div 1
    </c:when>
    <c:otherwise>
        div 2
    </c:otherwise>
</c:choose>

c:if, но JSTL использует нотацию выбора / когда / иного из XSL для своих if / else и if/ else if / else функциональность.

Обновлено :

Как я указал в моем примере кода, вам нужно использовать ${action.loggedOn}.EL не меняется в зависимости от имени вашего действия.Также используйте слово not вместо !.

1 голос
/ 08 декабря 2010

При использовании struts2 я бы придерживался тегов struts2:

http://struts.apache.org/2.2.1/docs/tag-reference.html

<s:if test="%{false}">
   <div>Will Not Be Executed</div>
</s:if>
<s:elseif test="%{true}">
   <div>Will Be Executed</div>
</s:elseif>
<s:else>
   <div>Will Not Be Executed</div>
</s:else>

Заметным отличием является то, что Struts2 использует OGNL.Его довольно просто использовать.

Я использую перехватчик, чтобы решить проблему проверки, вошел ли пользователь в систему или нет, и затем позволяет ему перейти на нужную страницу или направить его на экран входа в систему.

Основная процедура такова: создайте вход в действие, который помещает объект User в сеанс.Создайте журнал в перехватчике, который проверяет, есть ли в сеансе объект User, если перехватчик пропустит выполнение, если нет, он вернет «login», потребуется глобальное сопоставление «login» длядействие входа в систему ... тогда вы сделали.Ну, конечно, вам нужно добавить действие входа в этот стек, который будет использоваться в пакете «безопасных» действий.

Редактировать : Вот как я могу контролировать, если пользовательвидит ссылку «войти» или «выйти из имени пользователя» на странице:

<s:if test="#session['User']==null">
  <s:a namespace="/public" action="welcome" >Login</s:a>
</s:if>
<s:else>
  <s:a namespace="/public" action="logout" >Logout <s:property value="#session['User'].name"/></s:a>
</s:else>

Перехватчик поможет вам отслеживать, на каких страницах должен быть зарегистрирован пользователь, чтобы вы не заходилипроверяйте это в каждом действии (если не авторизованный пользователь просто вводит URL защищенной паролем страницы), но это не поможет при рендеринге.

Редактировать: Попробуйте выполнить следующее:

1) Ниже приведен предпочтительный путь struts2 для условных выражений в вашем jsp.Я проверил это на вашем bean-компоненте, поэтому он работает точно как есть =)

<s:div>
  <s:if test="loggedOn">
    DIV1
  </s:if>
  <s:else>
    DIV2
  </s:else>
</s:div>

2) Если ваше условное выражение работает, возможно, вы хотите, чтобы несколько jsp отвечали, если вы вошли в систему... вы не можете заставить их входить в систему для каждой страницы, только чтобы она забыла, что вы вошли в систему ... Я полагаю, вы могли , поэтому давайте рассмотрим тот факт, что вы вошли в сеанс, чтобы каждыйjsp в вашем приложении может проверить это ...

Чтобы сделать это, все, что вам нужно сделать, это добавить интерфейс "SessionAware" к вашему действию, и ваша IDE должна заставить вас добавить абстрактный метод (установщик) ивы будете использовать этот установщик для установки переменной сеанса ... Или, проще говоря, в коде:

package struts2;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
public class test extends ActionSupport implements SessionAware{
    private Map<String, Object> session;
    @Override
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }
}

Теперь, когда вы добавили интерфейс "SessionAware", чтобы вы могли установить поле сеанса в своем классе, тогдаВы можете добавить ...

public void setLoggedOn(boolean loggedOn) {
    //this.loggedOn = loggedOn;
    session.put("isLoggedOn", true);
}

Теперь в любом jsp ... вы можете посмотреть переменную сеанса для объектов, которые вы положили в карту ...

Так что мы должныТеперь можно изменить свой условный показ на...

<s:div>
  <s:if test="#session['isLoggedOn'] == true">
    DIV1
  </s:if>
  <s:else>
    DIV2
  </s:else>
</s:div>
1 голос
/ 07 декабря 2010

Попробуйте использовать c: если tag

...