Passing parameter from controller to jsp in spring

2019-06-24 03:55发布

问题:

I have a controller method as follow.

@RequestMapping("/edit/{jobId}")
public String editJob(@PathVariable("jobId") Integer jobId,Model model){
    model.addAttribute("id",jobId);
    return "edit";
}

in which i am passing the jobId to get the instance of the job by id and returning "edit" string so that it maps to edit.jsp as per the InternalResourceViewResolver. But when i click on the link it goes to /edit/44 in which case 44 would be the id of the job for which the edit link belongs to. Finally i got the error stating no resource found.

home.jsp

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

<%@ page session="false"%>
<html>
<head>
<link rel="stylesheet" type="text/css"
href="<c:url value="/resources/css/style.css"/>" />
<link rel="stylesheet"
href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" />
<title>Home</title>
</head>
<body id="main">
<div class="container">
    <h2 style="color:white">All posted jobs</h2>
    <c:if test="${empty jobList}">
        <h6>No Job Post Yet</h6>
    </c:if>
    <c:if test="${!empty jobList}">
        <c:forEach items="${jobList}" var="job">
            <div class="panel panel-info">
                <div class="panel-heading">
                    <h3 class="panel-title">${job.title }</h3>
                </div>
                <div class="panel-body">${job.description }</div>
                <div class="panel-footer">
                    <a id="link" href="delete/${job.id }">Delete</a> 
                    <a id="link" href="edit/${job.id}">Edit</a>
                </div>
            </div>
        </c:forEach>
    </c:if>
    <section>
        <form:form method="post" action="add" modelAttribute="job"
            class="form-horizontal">
            <div class="form-group" id="addForm">

                <form:label class="control-label" path="title">Title:</form:label>
                <form:input class="form-control" path="title"/>



                <form:label class="control-label" path="description">Description</form:label>
                <form:textarea class="form-control" rows="5" path="description" />



                <button class="btn btn-success">
                    <span class="glyphicon glyphicon-plus-sign"></span> Add a Job
                </button>
            </div>
            <a id="addJob" href="add">+</a>
        </form:form>
    </section>
</div>

JobController.java

package com.job.src;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.job.src.model.Job;
import com.job.src.services.JobService;

@Controller
public class JobController {

@Autowired
private JobService jobService;

@RequestMapping(value= "/")
public String listJobs(Map<String,Object> map){
    map.put("job", new Job());
    map.put("jobList", jobService.listJobs());
    return "home";
}

@RequestMapping(value= "/add", method=RequestMethod.POST)
public String addJob(Job job){
    jobService.addJob(job);
    return "redirect:/";
}

@RequestMapping("/delete/{jobId}")
public String deleteJob(@PathVariable("jobId") Integer jobId){
    jobService.removeJob(jobId);
    return "redirect:/";
}


@RequestMapping("/edit/{jobId}")
public String editJob(@PathVariable("jobId") Integer jobId,Model model){
    model.addAttribute("id",jobId);  
    return "edit";
}
}

edit.jsp

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ 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">
<html>
<head>
<link rel="stylesheet" type="text/css"
href="<c:url value="/resources/css/style.css"/>" />
<link rel="stylesheet"
href="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" />
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form:form method="post" action="editSuccess" modelAttribute="job"
    class="form-horizontal">
    <div class="form-group" id="addForm">

        <form:label class="control-label" path="title">Title:    </form:label>
        <form:input class="form-control" path="title" />



        <form:label class="control-label" path="description">Description</form:label>
        <form:textarea class="form-control" rows="5" path="description" />

        <button class="btn btn-success">
            <span class="glyphicon glyphicon-plus-sign"></span> Add a Job
        </button>
    </div>
</form:form>

回答1:

In editJob method your are returning only id of job with model attribute to edit.jsp. But actually on edit.jsp page you need job object so you need to get job object by id add it as model attribute.

@RequestMapping("/edit/{jobId}")
public String editJob(@PathVariable("jobId") Integer jobId,Model model){
    //model.addAttribute("id",jobId); this is wrong
    Job job = jobService.getJobById(jobId);
    //write method in jobservice to get job by id i.e. getJobById(Integer jobId);
    model.addAttribute("job",job)
    return "edit";
}