Struts 2: невозможно получить доступ к свойствам модели в JSP

У меня проблема с доступом к свойствам модели (ProcessSolution) в моем JSP я не понимаю, что не так с моими следующими кодами:

Это моя модель класса ProcessSolution.java

package POJO;

import java.util.Arrays;

public class ProcessSolution {
    private long processId;
    private String processName;
    private String processSolutionSteps [];
    private String processRemark;
    private String processNote;

    public ProcessSolution() {
        // TODO Auto-generated constructor stub
    }

    public ProcessSolution(long processId, String processName,
            String[] processSolutionSteps, String processRemark, String processNote) {
        this.processId = processId;
        this.processName = processName;
        this.processSolutionSteps = processSolutionSteps;
        this.processRemark = processRemark;
        this.processNote = processNote;
    }
    public long getProcessId() {
        return processId;
    }
    public void setProcessId(long processId) {
        this.processId = processId;
    }
    public String getProcessName() {
        return processName;
    }
    public void setProcessName(String processName) {
        this.processName = processName;
    }
    public String[] getProcessSolution() {
        return processSolutionSteps;
    }
    public void setProcessSolution(String[] processSolutionSteps) {
        this.processSolutionSteps = processSolutionSteps;
    }
    public String getProcessRemark() {
        return processRemark;
    }
    public void setProcessRemark(String processRemark) {
        this.processRemark = processRemark;
    }
    public String getProcessNote() {
        return processNote;
    }
    public void setProcessNote(String processNote) {
        this.processNote = processNote;
    }

    @Override
    public String toString() {
        return "ProcessSolution [processId=" + processId + ", processName="
                + processName + ", processSolutionSteps="
                + Arrays.toString(processSolutionSteps) + ", processRemark="
                + processRemark+ ", processNote=" + processNote + "]";
    }
}

Это мой класс действий ProcessSolutionAction

public class ProcessSolutionAction extends ActionSupport implements Preparable, ModelDriven<ProcessSolution>,
                                    SessionAware, ServletRequestAware, ServletContextAware{

    private static final long serialVersionUID = 1L;

    private ProcessSolution processSolution;
    private ProcessService processService;
    private short opType;
    private String nsec;
    private UserClass user;
    private Jmain jmain;
    private ProcessSolution processSolutions[];

    private HttpServletRequest request;
    private Map<String, Object> sesstion;
    private ServletContext servletContext;

    /* (non-Javadoc)
     * @see com.opensymphony.xwork2.Preparable#prepare()
     */
    @Override
    public void prepare() throws Exception {
        this.processSolution = new ProcessSolution();
        this.jmain = new Jmain();
    }
    /*public void prepareAddProcessSolution() throws Exception {
        this.processService = new ProcessService();
    }
    public void prepareListProcessSolutions() throws Exception {
        System.out.println("prepareListProcessSolution()");
        this.jmain = new Jmain();
    }
    public void prepareEditProcessSolution() throws Exception {
        System.out.println("prepareEditProcessSolution()");
        this.jmain = new Jmain();
    }*/

    @Override
    public ProcessSolution getModel() {
        return this.processSolution;
    }

    /* (non-Javadoc)
     * @see com.opensymphony.xwork2.ActionSupport#execute()
     */
    @Override
    public String execute() throws Exception {
        System.out.println("ProcessSolution#execute()");

        /*System.out.println("Process ID :- "+this.request.getParameter("processId"));
        System.out.println("this.processSolution Before :- "+this.processSolution);
        if( Long.parseLong( this.request.getParameter("processId") ) != 0 )
            this.processSolution = this.jmain.getProcessSolution(Long.parseLong( this.request.getParameter("processId") ));
        System.out.println("this.processSolution After  :- "+this.processSolution);*/
        return SUCCESS;
    }

    public String editProcessSolution() throws Exception {
        System.out.println("ProcessSolution#editProcessSolution()");

        System.out.println("Process ID :- "+this.request.getParameter("processId"));
        System.out.println("this.processSolution Before :- "+this.processSolution);
        if( Long.parseLong( this.request.getParameter("processId") ) != 0 )
            setProcessSolution( (ProcessSolution) this.jmain.getProcessSolution(Long.parseLong( this.request.getParameter("processId") ) ) );
        System.out.println("this.processSolution After  :- "+this.processSolution);
        return SUCCESS;
    }

    public ProcessSolution getProcessSolution() {
        return processSolution;
    }
    public void setProcessSolution(ProcessSolution processSolution) {
        this.processSolution = processSolution;
    }
    public short getOpType() {
        return opType;
    }
    public void setOpType(short opType) {
        this.opType = opType;
    }
    public String getNsec() {
        return nsec;
    }
    public void setNsec(String nsec) {
        this.nsec = nsec;
    }
    public UserClass getUser() {
        return user;
    }
    public void setUser(UserClass user) {
        this.user = user;
    }
    public ProcessSolution[] getProcessSolutions() {
        return processSolutions;
    }
    public void setProcessSolutions(ProcessSolution[] processSolutions) {
        this.processSolutions = processSolutions;
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }

    @Override
    public void setSession(Map<String, Object> sesstion) {
        this.sesstion = sesstion;
    }
    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }
}

В редакторе класса ActionProcessSolution() я могу получить мою модель и правильно распечатать ее после вызова метода, но не могу получить доступ к свойствам класса моей модели в JSP

Вот как я обращаюсь к свойствам в JSP

    <s:property value="%{[0].processName}" />
    <s:property value="%{[1].processName}" />
    <s:property value="processId" />
    <s:property value="nsec" />
    <s:property value="#processSolution.processName" />
    <s:property value="%{processSolution.processName}" />
    <s:property value="processSolution.processName" />
    <s:property value="%{processName}" />
    <s:property value="processRemark" />
    <s:property value="processNote" />
    <s:property value="processSolution.getProcessName()" />
    <s:property value="processSolution.getProcessId()" />
    <s:if test="%{processName == null}">
        NULL
    </s:if>
    <s:else>
        NOT NULL
    </s:else>

Что не так с моим кодом?

Чем ты

Обновленный код

Если я получу доступ к своей модели с помощью геттера, я смогу получить доступ к свойствам модели

        <s:property value="getProcessSolution().getProcessName()" />

но напрямую я не могу получить доступ к моей модели

это мое xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.multipart.maxSixe" value="1000000"/>

    <package name="shantaram" extends="struts-default">
        <!-- Process Solution Actions -->
        <action name="load-process-solution" class="actions.ProcessSolutionAction">
            <result name="success">process_solution_entry.jsp</result>
            <result name="error">Error.jsp</result>
            <result name="login">Login.jsp</result>
        </action>
        <action name="list-process-solution" class="actions.ProcessSolutionAction" method="listProcessSolutions">
            <result name="success">process_solution_list.jsp</result>
            <result name="error">Error.jsp</result>
            <result name="login">Login.jsp</result>
        </action>
        <action name="add-process-solution" class="actions.ProcessSolutionAction" method="addProcessSolution">
            <result name="success">process_solution_entry.jsp</result>
            <result name="error">Error.jsp</result>
            <result name="login">Login.jsp</result>
        </action>
        <action name="edit-process-solution" class="actions.ProcessSolutionAction" method="editProcessSolution">
            <result name="success">process_solution_entry.jsp</result>
            <result name="error">Error.jsp</result>
            <result name="login">Login.jsp</result>
        </action>
        <action name="update-process-solution" class="actions.ProcessSolutionAction" method="addProcessSolution">
            <result name="success">process_solution_entry.jsp</result>
            <result name="error">Error.jsp</result>
            <result name="login">Login.jsp</result>
        </action>
        <action name="delete-process-solution" class="actions.ProcessSolutionAction" method="deleteProcessSolution">
            <result name="success">process_solution_list.jsp</result>
            <result name="error">Error.jsp</result>
            <result name="login">Login.jsp</result>
        </action>
    </package>
</struts>

2 ответа

При использовании интерфейса ModelDriven тип модели должен быть инициализирован в действии. В вашем случае измените ProcessSolutionAction, строка:

private ProcessSolution processSolution;

в

private ProcessSolution processSolution = new ProcessSolution();

Инициализация типа модели в методе prepare() неприменима к ModelDriven, поскольку они вызываются из двух разных перехватчиков. И Model Driven Interceptor должен стать первым. Вот некоторая документация: Модель, управляемая перехватчиком

Вам нужно изменить тип результата действия на dispatch в вашем ProcessSolutionAction в Struts.xml.

Образец:

<result name="success" type="dispatcher">sample.jsp</result>

или вы удалите type на ваш результат, потому что значение по умолчанию типа dispatcher

<result name="success">sample.jsp</result>

Возможно, ваш тип результата - перенаправление, поэтому вы не можете перенести значение из вашего класса действий в ваш jsp.

Другие вопросы по тегам