【问题标题】:Getting value from dropdownlist in jsp to spring mvc controller using hibernate annottations使用休眠注释从jsp中的下拉列表中获取值到spring mvc控制器
【发布时间】:2014-09-30 07:56:43
【问题描述】:

您好,我正在编写一个使用 spring mvc hibernate 和 mysql 作为数据库的程序。我在 mysql db 中有两个表 employeeteam。我使用 jsp 作为我的视图.在我的jsp中,我将团队名称从团队表加载到下拉列表中。当我从下拉列表中选择特定团队并单击提交按钮时,我想显示特定团队中的所有员工

这是我的jsp

<%@page import="java.sql.ResultSet"%>
<%@page import="com.mysql.jdbc.PreparedStatement"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
      <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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>
</head>
<body>
  <form:form method="POST" action="Search.html" modelAttribute="command">

  <table>
    <tr>
                    <form:label path="teams.teamId">Team Name</form:label>

                    <td>
                        <form:select path="teams.teamId" cssStyle="width: 150px;">    
                            <option value="-1">Select a type</option>
                            <c:forEach items="${teamKey}" var="teams">
                            <option value="${teams.teamId}">${teams.teamName}</option>
                            </c:forEach>
                        </form:select>
                    </td>
                </tr>

    <tr>



    <td colspan="2"><input type="submit"  value="submit">  </td>

    </tr>



  </table>

 </form:form>
 <h1><a href="retunTohome.html">Home</a></h1>
</body>
</html>

我的jsp视图

控制器代码

@RequestMapping(value="/Search",method = RequestMethod.POST)
public ModelAndView fromSearch(@ModelAttribute("command") Resource resource,BindingResult result){
    return new ModelAndView("redirect:/searchResult.html");
}

@RequestMapping(value="/searchResult",method = RequestMethod.GET)
    public String getValue(@ModelAttribute("command") Resource resource ,Model m){


    m.addAttribute("command", "Got value here"+resource.toString());
    return "Search";
}

资源类

   @Entity
        @Table(name="Employee")
        public class Resource implements Serializable {

            private static final long serialVersionUID = -723583058586873479L;   


            @Id
            @Column(name="empid")
            private Integer empId;

            @Column(name="empname")
            private String empName;

            @Column(name="empexp")
            private Integer empExp;


            @Column(name="empskills")
            private String empSkills;



             @ManyToOne
             @JoinColumn(name="teamId",referencedColumnName="teamId")
             private AddTeam teams;



            public Integer getEmpId(){
                return empId;
            }
            public void setEmpId(Integer empId){
                this.empId=empId;
            }


            public String getEmpName(){
                return empName;
            }
            public void setEmpName(String empName){
                this.empName=empName;
            }

            public Integer getEmpExp(){
                return empExp;
            }
            public void setEmpExp(Integer empExp){
                this.empExp=empExp;
            }


            public String getEmpSkills(){
                return empSkills;
            }
            public void setEmpSkills(String empSkills){
                this.empSkills=empSkills;
            }



            public AddTeam getTeams() {
                  return teams;
                 }

                 public void setTeams(AddTeam teams) {
                  this.teams = teams;
                 }

        }


AddTeam.class

    @Entity
@Table(name="Team")

public class AddTeam {


    @Id
    @Column(name="teamId")
    private Integer teamId;

    @Column(name="teamName")
    private String teamName;

    public Integer getTeamId() {
          return teamId;
         }

         public void setTeamId(Integer teamId) {
          this.teamId = teamId;
         }

         public String getTeamName() {
          return teamName;
         }

         public void setTeamName(String teamName) {
          this.teamName = teamName;
         }

     }

ResourceDao 实现类

@Override
    public void serchResources(int teamid) {
        // TODO Auto-generated method stub
        sessionfactory.getCurrentSession().createQuery(" FROM Resource WHERE teamId=" +teamid);


    }

错误

org.springframework.beans.NotReadablePropertyException: Invalid property 'teams' of bean class [java.lang.String]: Bean property 'teams' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:665)
    org.springframework.beans.BeanWrapperImpl.getNestedBeanWrapper(BeanWrapperImpl.java:518)
    org.springframework.beans.BeanWrapperImpl.getBeanWrapperForPropertyPath(BeanWrapperImpl.java:495)
    org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:655)
    org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:147)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:174)
    org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:194)
    org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129)
    org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:119)
    org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89)
    org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
    org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
    org.apache.jsp.WEB_002dINF.views.Search_jsp._jspx_meth_form_005flabel_005f0(Search_jsp.java:306)
    org.apache.jsp.WEB_002dINF.views.Search_jsp._jspService(Search_jsp.java:117)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1060)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我是 Spring Hibernate 应用程序的新手,我被困在这里。有什么方法可以显示所选团队的员工...

感谢您的建议...

【问题讨论】:

  • 什么是 AddTeam ?你是从这个javacodegeeks.com/2013/04/… 扩展这个例子吗
  • 您只显示了控制器的GET部分,错误似乎在POST部分...请也显示出来。
  • @SanKrish 感谢您调查此问题。 AddTeam 是一个处理另一个 jsp addTeam.jsp 的类,它提供了添加和删除团队的功能
  • @SergeBallesta 感谢您调查我添加 POST 部分的问题。请查看我编辑的代码

标签: mysql jsp jakarta-ee spring-mvc hibernate-annotations


【解决方案1】:

这里有一些更改可能会解决您的问题,

在jsp文件中

当前

<form:select path="teams.teamId" cssStyle="width: 150px;">

必须改变

<form:select path="teams" cssStyle="width: 150px;">

在您的控制器类中

当前

public String getValue(@ModelAttribute("command") Resource resource ,Model m)

必须改变

public String getValue(@ModelAttribute("command") Resource resource ,Model m,
 @RequestParam("teams") String teamId)

在您的控制器类中添加以下代码

@InitBinder
protected void initBinder(WebDataBinder binder) {

    binder.registerCustomEditor(AddTeam.class, new PropertyEditorSupport() {

        @Override
        public void setAsText(String text) {
            AddTeam teams = new AddTeam();
            teams.setTeamId(Integer.valueOf(text));
            this.setValue(teams);
        }
    });
}

希望这能解决您的问题。 :)

【讨论】:

    【解决方案2】:

    您的代码将难以维护:

    • 您调用Resource 可以称为Employee 的类(表名是Employee
    • 您调用AddTeam 可以称为Team 的类(表名是Team
    • 你调用teams(复数)一个AddTeam元素
    • 您使用完整的Resource 对象来简单地获得一个团队
    • 所有这些都没有评论

    我想你只是想在那个 jsp 中建立一个团队,并且表单正确地发送了一个 teamId。它可以这样工作,这要归功于 spring 魔术,但您需要声明一个 Converter&lt;String, AddTeam&gt; 以将浏览器发送的字符串(teamId 的表示)转换为具有该 id 的 AddTeam。

    要让它在春季正确集成,您必须:

    • 声明一个FormattingConversionServiceFactoryBean bean(如果不这样做,您将失去所有默认转换)
    • 为转换 String -> Integer -> AddTeam 声明一个Converter&lt;String, AddTeam&gt; bean,并将其注册到上面的 ConversionService 中

    在你的表单中,选择的路径应该只是teams

    <form:select path="teams" ...
    

    这是一个相当高级的配置,但它可以工作。


    如果您喜欢不那么神奇的东西,请使用真实的形式(不是模型对象):

    class TeamCommand {
        private int teamId;
        // getter and setter ommitted for bievety
    }
    

    在你的控制器中:

    @RequestMapping(value="/Search",method = RequestMethod.POST)
    public ModelAndView fromSearch(@ModelAttribute("command") TeamCommand command,BindingResult result){
        AddTeam team = service.method(command.getTeamId);
        ...
        return new ModelAndView("redirect:/searchResult.html");
    }
    

    在您的 JSP 中:

    <form:select path="teamId" ...>
    

    【讨论】:

      猜你喜欢
      • 2014-09-27
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 2012-12-08
      相关资源
      最近更新 更多