Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法解析变量struts2中的错误_Struts2 - Fatal编程技术网

无法解析变量struts2中的错误

无法解析变量struts2中的错误,struts2,Struts2,我的要求是,我试图从项目表中填充pid(projectid),从userdetails表中填充名称,作为表单的下拉列表。我是struts框架的新手。请有人给我们介绍一下这个问题好吗 代码如下: sprintform.jsp: <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="

我的要求是,我试图从项目表中填充pid(projectid),从userdetails表中填充名称,作为表单的下拉列表。我是struts框架的新手。请有人给我们介绍一下这个问题好吗

代码如下:

sprintform.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<link href="css/jquery.ui.datepicker.css" rel="stylesheet"
    type="text/css" />
<script src="js/jquery-1.7.1.min.js" type="text/javascript"></script>
<script src="js/jquery-ui-1.8.17.custom.min.js" type="text/javascript"></script>
<script type="text/javascript"> 
            $(function(){$('.dateTxt').datepicker({
                dateFormat : 'yy-mm-dd'
            }); }); 
        </script>
</head>
<body>
    <h1 style="color: green">Sprint</h1>
    <s:form action="sprintInsert" namespace="/" method="post"
        name="sprintForm" theme="xhtml">
        <s:textfield name="title:" size="40" maxlength="40" required="true"
            label="Title" />
        <p>
            Begin Date: <input id="one" class="dateTxt" type="text"
                name="begindate" />
        </p>
        <p>
            End Date: <input id="two" class="dateTxt" type="text" name="enddate" />
        </p>
        <s:select label="ProjectId" headerKey="-1"
            headerValue="Select Project Id" list="projectidList" name="pid" />
<%--        <s:select label="Owner" headerKey="-1"
            headerValue="Select Sprint Owner" list="sprintownerList"
            name="sprintowner" /> --%>
        <tr>
            <td>State:</td>
            <td><select name="state">
                    <option value="">Choose a state..</option>
                    <option value="A">Active</option>
                    <option value="F">Future</option>
                    <option value="C">Close</option>
            </select></td>
        </tr>
        <s:textfield name="targetestimatedpoints" size="40" maxlength="40"
            required="true" label="Target Estimate pts:" />
        <s:textfield name="totalestimatedpoints" size="40" maxlength="40"
            required="true" label="Total Estimate pts:" />
        <s:textfield name="totaldefaultestimatedhours" size="40"
            maxlength="40" required="true" label="Total Detail Estimate Hrs: " />
        <s:textfield name="todohours:" size="40" maxlength="40"
            required="true" label="Total To Do Hrs:" />
        <s:textfield name="description: :" size="40" maxlength="40"
            required="true" label="Description: " />
        <tr align="right">
            <td><div align="center">
                    <input type="submit" value="save">
                </div>
            <td align="center"><input type="reset" value="Reset"></td>
        </tr>
    </s:form>
    <s:if test="hasActionErrors()">
        <div id="fieldErrors">
            <s:actionerror />
        </div>
    </s:if>
</body>
</html>
package com.bits.sprintanalyzer.action;

import java.util.List;

import org.apache.log4j.Logger;

import com.bits.sprintanalyzer.ResourceException;
import com.bits.sprintanalyzer.dao.SprintDAO;
import com.opensymphony.xwork2.ActionSupport;

public class SprintAction extends ActionSupport {
    private static final Logger LOG = Logger.getLogger(SprintAction.class);
    /**
     * 
     */
    private static final long serialVersionUID = -6257623073537028210L;

    private String title;
    private String begindate;
    private String enddate;
    private String pid;
    private String sprintowner;
    private String state;
    private int targetestimatedpoints;
    private int totalestimatedpoints;
    private int totaldefaultestimatedhours;
    private int todohours;
    private String description;

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }


    public String getSprintowner() {
        return sprintowner;
    }

    public void setSprintowner(String sprintowner) {
        this.sprintowner = sprintowner;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public int getTargetestimatedpoints() {
        return targetestimatedpoints;
    }

    public void setTargetestimatedpoints(int targetestimatedpoints) {
        this.targetestimatedpoints = targetestimatedpoints;
    }

    public int getTotalestimatedpoints() {
        return totalestimatedpoints;
    }

    public void setTotalestimatedpoints(int totalestimatedpoints) {
        this.totalestimatedpoints = totalestimatedpoints;
    }

    public int getTotaldefaultestimatedhours() {
        return totaldefaultestimatedhours;
    }

    public void setTotaldefaultestimatedhours(int totaldefaultestimatedhours) {
        this.totaldefaultestimatedhours = totaldefaultestimatedhours;
    }

    public int getTodohours() {
        return todohours;
    }

    public void setTodohours(int todohours) {
        this.todohours = todohours;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String display() throws Exception {
        return INPUT;
    }

    public String getBegindate() {
        return begindate;
    }

    public void setBegindate(String begindate) {
        this.begindate = begindate;
    }

    public String getEnddate() {
        return enddate;
    }

    public void setEnddate(String enddate) {
        this.enddate = enddate;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<String> getpidList() throws ResourceException {
        return SprintDAO.getpidList();
    }

    public List<String> getOwnerList() throws ResourceException {
        return SprintDAO.getOwnerList();
    }

    @Override
    public void validate() {

    }

    @Override
    public String execute() throws Exception {
        LOG.info("title" + title);
        LOG.info("begindate" + begindate);
        LOG.info("enddate" + enddate);
        LOG.info("pid" + pid);
        LOG.info("sprintowner" + sprintowner);
        LOG.info("state" + state);
        LOG.info("targetestimatedpoints" + targetestimatedpoints);
        LOG.info("totalestimatedpoints" + totalestimatedpoints);
        LOG.info("totaldefaultestimatedhours" + totaldefaultestimatedhours);
        LOG.info("todohours" + todohours);
        LOG.info("description" + description);
        // ProjectDAO.insert(projectname,description,scrummaster,productowner,begindate,enddate);
        int i = SprintDAO.save(this);
        if (i > 0) {
            return "success";
        }
        return "error";
    }

}
package com.bits.sprintanalyzer.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.bits.sprintanalyzer.ResourceException;
import com.bits.sprintanalyzer.action.SprintAction;
import com.bits.sprintanalyzer.util.ConnectionUtil;

public class SprintDAO {
    private static final String PROJECTQUERY = "select pid from project";
    private static final String USERQUERY = "select name from userdetail";

    public static List<String> getpidList() throws ResourceException{
        List<String> projectidList = new ArrayList<String>();
        // this should be populated from DB

        try (Connection con = ConnectionUtil.INSTANCE.getConnection();
                PreparedStatement st = con.prepareStatement(PROJECTQUERY)){
                ResultSet rs =st.executeQuery();
                while(rs.next()){
                    projectidList.add(rs.getString(1));
                }
        return projectidList;
}
        catch (SQLException | ResourceException e) {
            throw new ResourceException("Failed to validate project id", e);
        }
}
    public static List<String> getOwnerList() throws ResourceException{
        List<String> sprintownerList = new ArrayList<String>();
        // this should be populated from DB

        try (Connection con = ConnectionUtil.INSTANCE.getConnection();
                PreparedStatement st = con.prepareStatement(USERQUERY)){
                ResultSet rs =st.executeQuery();
                while(rs.next()){
                    sprintownerList.add(rs.getString(1));
                }
        return sprintownerList;
}
        catch (SQLException | ResourceException e) {
            throw new ResourceException("Failed to validate productowner", e);
        }
}

    //insert into database
        public static int save(SprintAction SA) throws Exception{ 
            int status=0;
            try{
            Connection con = ConnectionUtil.INSTANCE.getConnection();
            PreparedStatement ps = con.prepareStatement("insert into sprint(pid,title,begindate,enddate,owner,state,targetestimatedpoints,totalestimatedpoints,totaldefaultestimatedhours,todohours,description) values(?,?,?,?,?,?,?,?,?,?,?)");
            ps.setString(1, SA.getPid());
            ps.setString(2, SA.getTitle());
            ps.setString(3, SA.getBegindate());
            ps.setString(4, SA.getEnddate());
            ps.setString(5, SA.getSprintowner());
            ps.setString(6, SA.getState());
            ps.setInt(7, SA.getTargetestimatedpoints()); 
            ps.setInt(8, SA.getTotalestimatedpoints());
            ps.setInt(9, SA.getTotaldefaultestimatedhours());
            ps.setInt(10, SA.getTodohours());
            ps.setString(11, SA.getDescription());
            status=ps.executeUpdate();
        }catch(Exception e){
        e.printStackTrace();}  
        return status;  
        }  


}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "/WEB-INF/classes/struts-2.1.7.dtd">

<struts>
    <!--
    You could also set the constants in the struts.properties file
    placed in the same directory as struts.xml
    -->
    <constant name="struts.devMode" value="true" />

    <package name="sprintanalyzer" extends="struts-default" namespace="/">

        <!--
        If no class attribute is specified the framework will assume success and
        render the result index.jsp
        If no name value for the result node is specified the success value is the default
        -->
        <action name="">
            <result>/jsp/login.jsp</result>
        </action>
        <!--
        If the URL is hello.action then call the execute method of class HelloWorldAction.
        If the result returned by the execute method is success render the HelloWorld.jsp
        -->
        <action name="login" class="com.bits.sprintanalyzer.action.LoginAction"
            method="execute">
            <result name="success">/jsp/sprintanalyzer.jsp</result>
            <result name="input">/jsp/login.jsp</result>
        </action>
        <action name="projectform" class="com.bits.sprintanalyzer.action.ProjectAction"
            method="display">
            <result name="input">/jsp/projectform.jsp</result>
        </action>
        <action name="projectInsert" class="com.bits.sprintanalyzer.action.ProjectAction"
            method="execute">
            <result name="success">/jsp/sprintanalyzer.jsp</result>
        </action>   
            <action name="sprintform" class="com.bits.sprintanalyzer.action.SprintAction"
            method="display">
            <result name="input">/jsp/sprintform.jsp</result>
        </action>
        <action name="sprintInsert" class="com.bits.sprintanalyzer.action.SprintAction"
            method="execute">
            <result name="success">/jsp/sprintanalyzer.jsp</result>
        </action>   

    </package>

</struts>
以下是登录代码:

package com.bits.sprintanalyzer.action;

import org.apache.log4j.Logger;

import com.bits.sprintanalyzer.ResourceException;
import com.bits.sprintanalyzer.dao.LoginDAO;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{

    private static final Logger LOG = Logger.getLogger(LoginAction.class);
    /**
     * 
     */
    private static final long serialVersionUID = 6877145894906143530L;

    private String username;

    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }



    @Override
    public void validate(){
        if (username==null || username.length()==0 || password ==null || password.length() ==0 )
            addActionError(getText("User name or Password cannot be null"));
    }

    @Override
    public String execute() throws Exception {
        try{
            if( LoginDAO.isValidUser(username, password) ){
                return SUCCESS;
            }
            else
            {
                addActionError(getText("Invalid Username or Password"));
            }
        }catch(ResourceException e){
            LOG.error("Failed to valid User", e);
            addActionError(getText("Something Went wrong with DBConnection"));
        }
        return INPUT;
    }

}
更改连接字符串后的最新stacktrace:

2016-10-01T18:55:04.396+0530|Warning: Servlet.service() for servlet jsp threw exception
tag 'select', field 'list', name 'pid': The requested list key 'projectidList' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
    at org.apache.struts2.components.Component.fieldError(Component.java:237)
    at org.apache.struts2.components.Component.findValue(Component.java:358)
    at org.apache.struts2.components.ListUIBean.evaluateExtraParams(ListUIBean.java:80)
    at org.apache.struts2.components.Select.evaluateExtraParams(Select.java:105)
    at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:856)
    at org.apache.struts2.components.UIBean.end(UIBean.java:510)
    at org.apache.struts2.views.jsp.ComponentTagSupport.doEndTag(ComponentTagSupport.java:42)
    at va:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
1)您有如下MySQL连接异常:

Establishing SSL connection without server's identity verification is not recommended.  
According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. 
要解决此问题,请使用如下连接字符串:(将db名称更改为现有的db名称)

这需要首先排序,这就是为什么变量的值没有被呈现的原因

2)在最新跟踪中,无法将请求的列表键“ProjectdList”解析为集合/数组/映射/枚举/迭代器类型

尝试访问尚未创建的列表/集合时会发生此错误

尝试在类级别初始化集合对象
列表投影列表

当此时触发特定操作时,JSP页面不知道字段的类型,在本例中,当您编写
List projectdlist=new ArrayList()时
将其改为
ArrayList projectdlist=new ArrayList()

确保在实例化action类后访问列表,即调用相应的action。
如果您想在调用操作之前直接访问它,请将其设置为静态并在jsp中访问。

请添加您获得的异常堆栈。无法解析的变量不够,需要检查哪个变量。嗨,Rohit,这是堆栈跟踪。在原始的post Rohit中粘贴了stacktrace。您的操作类是com.bits.sprintanalyzer.action.LoginAction,不知道其中发生了什么,请也添加它。还添加了MySQL数据库连接字符串。添加了登录代码。我添加了Rohit,但仍然失败,出现了相同的错误。您使用的是netbeans吗?NetBeans的默认设置是使用SSL。尝试使用以下“jdbc:mysql://localhost:3306/dbname?characterEncoding=UTF-8&useSSL=false“我使用eclipse IDE,想共享我的屏幕一次,并询问您实际使用的方法我在1个屏幕上工作过,但没有在这个屏幕上工作。我使用String url=“jdbc:mysql://localhost:3305/scrumdb?autoReconnect=true&useSSL=false";
Establishing SSL connection without server's identity verification is not recommended.  
According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. 
jdbc:mysql://localhost:3306/dbname?autoReconnect=true&useSSL=false