问题
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.
来源:https://stackoverflow.com/questions/40583282/struts-2-unable-to-access-model-properties-in-jsp