Struts 2 : Unable to access Model properties in JS

2019-03-05 23:14发布

问题:

I have problem with accessing Model properties (ProcessSolution) in my JSP , I'm not getting what is wrong with my following codes :

This is my model Class 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 + "]";
    }
}

This is My Action Class 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;
    }
}

In Action class's editProcessSolution() I am able to get My model , and getting Printed correctly after Method call but not able to access My Model Class's properties in JSP

Here is How I accessing properties in 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>

Whats wrong with my code ?

Than you

Updated code

If I access My model by using getter I'm able to access model properties

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

but directly I can't access My Model

this is my 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>

回答1:

When you use ModelDriven interface, the model type should be initialized in the action. In your case, change ProcessSolutionAction, line:

private ProcessSolution processSolution;

to

private ProcessSolution processSolution = new ProcessSolution();

Initializing the model type in prepare() method is not applicable with ModelDriven because they are invoked from two different interceprtors. And Model Driven Interceptor must become first. Here is some documentation: Model Driven Interceptor



回答2:

You need to change your result type of your action to dispatch in your ProcessSolutionAction in struts.xml.

Sample:

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

or you remove the type on your result because the default value of type is dispatcher

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

Maybe your result type is redirect that's why you can't take a value on your action class to your jsp.