【问题标题】:Unable to set jsp form values to class variables无法将 jsp 表单值设置为类变量
【发布时间】:2016-11-08 14:33:17
【问题描述】:

当我尝试从在 jsp 中设置的类中获取值时,会显示 null。

在开发模式下观察到以下错误:

ERROR ParametersInterceptor Developer Notification(将 struts.devMode 设置为 false 以禁用此消息): 在“class org.ravi.EmployeeAction”上设置“name”时出现意外异常:设置表达式“name”时出错,值为“t”

下面是我的各个页面

struts.xml

<!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.devMode" value="true" />
    <package name="default" extends="struts-default">
        <action name="addEmployeeAction" class="org.ravi.EmployeeAction">
            <interceptor-ref name="params" />
            <interceptor-ref name="modelDriven"/>
            <result name="success">/Add.jsp</result>
        </action>
        <action name="EmployeeAction" class="org.ravi.EmployeeAction" method="execute">
            <interceptor-ref name="params" />
            <interceptor-ref name="modelDriven"/>
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

index.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" import="java.util.*,java.io.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>

    <s:form action="Add.jsp" name="addForm">
        <table border="1" cellpadding="5">
            <tr>
                <th>Select</th>
                <th>EmpID</th>
                <th>Name</th>
                <th>City</th>
                <th>DoB</th>
            </tr>

            <tr>
                <th><input type="radio" name="record"
                    onClick="radioValidate(this, 'record')" value="%{var}">
                </th>
                <th><s:property value="empid"/></th>
                <th><s:property value="name"/></th>
                <th><s:property value="city"/></th>
                <th><s:property value="dob"/></th>
    </s:form>
</body>
</html>

添加.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <h1>Add New User</h1>
    <s:form action="EmployeeAction" >
    <s:textfield label="Emp Id" name="empid" />
    <s:textfield label="Name" name="name" />
    <s:textfield label="City" name="city" />
    <s:textfield label="DoB" name="dob" />          
    <s:submit />
    </s:form>
</body>
</html>

EmployeeAction.java

package org.ravi;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class EmployeeAction extends ActionSupport implements ModelDriven<Employee> {
    private static final long serialVersionUID = -8136507522861159378L;

    private Employee employee=new Employee();

    public Employee getEmployee()
    {
        return employee;

    }

    public void setEmployee(Employee employee)
    {
        this.employee=employee;
    }

    public String execute() throws Exception 
    {
        return SUCCESS;
    }

    @Override
    public Employee getModel() 
    {
        return employee;
    }
}

Employee.java

package org.ravi;

import java.io.Serializable;

public class Employee implements Serializable{

     static final long serialVersionUID = 1L;
     private String empid;
     private String name;
     private String city;
     private String dob;

    public void setempid(String empid) {
        this.empid = empid;
    }

    public void setname(String name) {
        this.name = name;
    }

    public void setcity(String city) {
        this.city = city;
    }

    public void setdob(String dob) {
        this.dob = dob;
    }

    public String getempid() {
        return this.empid;
    }

    public String getname() {
        return this.name;
    }

    public String getcity() {
        return this.city;
    }

    public String getdob() {
        return this.dob;
    }


}

【问题讨论】:

    标签: java jsp jakarta-ee struts2 getter-setter


    【解决方案1】:
       public void setname(String name) {
            this.name = name;
        }
    

    您需要正确命名所有这些,即 setName(String name) setEmpId 等也是如此。 Struts 找不到您的 getter/setter,因为它们不遵循命名约定。

    【讨论】:

      【解决方案2】:

      你犯了几个错误,最糟糕的是

      • 你手动生成getter和setter(很多无用的工作),你也做错了:变量名的第一个字母必须大写:

        setName( 代替 setname( 用于变量 name

        应该(为了简单和一致)也为你的变量中的每个单词都这样做:

        setEmpId( 用于变量 empId

        您还应该考虑尽可能避免冗余。如果你在类Employee 上有一个ID 字段,就叫它id,而不是empId...如果它在Emp 里面,很明显它是emp id 而不是别的id。

      • 仅当您享受痛苦时才使用ModelDriven。对于任何其他目的,面对一群饥饿的流浪狗时,它就像口袋里的香肠一样有用。

      • 如果您针对的是旧浏览器,也可以使用 HTML5 DTD &lt;!DOCTYPE html&gt;,现在无需使用 4.01

      • 永远不要像在第一个表单中那样直接调用 JSP,始终先通过操作。

      从这个开始。还有很多。


      必读

      【讨论】:

      • 还有拦截器栈。
      • 这需要BeanCamelCase链接才能完成。
      • 非常感谢 Andrea 的回答和非常有见地的意见。都注意到了。一定会有所帮助。
      • 正如 AleksandrM 所建议的,您的操作只使用了两个拦截器。除非您确切知道该做什么,否则最好的选择是暂时使用 defaultStack 拦截器堆栈
      • 是的,因为对于这种简单的情况,只需要 Parameters 和 ModelDriven 拦截器。但是如果你添加一个准备方法,你将需要 Prepare 拦截器,如果你尝试进行一些验证,你将需要 Validation 拦截器,如果有转换错误,你将需要 ConversionErrors 和 Workflow 拦截器等......你'在这个简单的案例中放弃了大部分框架机制,它按原样工作,因为它几乎没有任何东西。你的 webapp 会增长,你会需要很多你不知道你已经通过避免 defaultStack 删除的东西。放回去;)
      猜你喜欢
      • 2018-10-31
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      相关资源
      最近更新 更多