populating thymeleaf dropdown with data of another table - java

i'm new to spring-boot. In my system there are two models named subject,course(two databases with the same names and connected by the foreign key course_id).I need to make it possible to select course name in a dropdown list in the addSubject thymeleaf form. Can someone please tell me how to do this
Subject.DAO file
#Service
public class SubjectDAO {
#Autowired
SubjectRepository subjectRepository;
//to save a subject
public Subject save(Subject subject){
return subjectRepository.save(subject);
}
//to search all subjects
public List<Subject> findAll(){
return subjectRepository.findAll();
}
//get a subject by id
public Subject findById(Long id){
return subjectRepository.findById(id).orElse(null);
}
//delete a subject
public void delete(Long id){
subjectRepository.deleteById(id);
}
}
Course.DAO file
#Service
public class CourseDAO {
#Autowired
CourseRepository courseRepository;
//to save a course
public Course save(Course course){
return courseRepository.save(course);
}
//to search all courses
public List<Course> findAll(){
return courseRepository.findAll();
}
//get a course by id
public Course findById(Long id){
return courseRepository.findById(id).orElse(null);
}
//delete a course
public void delete(Long id){
courseRepository.deleteById(id);
}
}
Subject Controller
#Controller
public class SubjectController {
#Autowired
private SubjectDAO subjectDAO;
#RequestMapping("/subject")
public String viewHomePage(Model model){
List<Subject> subjectDetails= subjectDAO.findAll();
model.addAttribute("subjectDetails",subjectDetails);
return "subject";
}
#RequestMapping("/subject/new")
public String addSubject(Model model){
Subject subject =new Subject();
model.addAttribute("subject",subject);
return "addSubject";
}
#RequestMapping(value="/subject/save",method= RequestMethod.POST)
public String saveCourse(#ModelAttribute("subject") Subject subject){
subjectDAO.save(subject);
return "redirect:/subject";
}
#RequestMapping("/subject/edit/{id}")
public ModelAndView updateSubjcet(#PathVariable(name="id")Long id){
ModelAndView mav=new ModelAndView(("updateSubject"));
Subject subject=subjectDAO.findById(id);
mav.addObject("subject",subject);
return mav;
}
#RequestMapping("/subject/delete/{id}")
public String deleteProduct(#PathVariable(name="id") Long id){
subjectDAO.delete(id);
return "redirect:/subject";
}
}
Subject html file
<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Adding a Subject</title>
</head>
<body>
<div align="center">
<h1>Add a new Subject</h1>
<br/>
<form action="#" th:action="#{/subject/save}" th:object="${subject}" method="post">
<table border="0" cell[adding="10">
<tr>
<td>Subject code:</td>
<td><input type="text" th:field="*{course_code}" /></td>
</tr>
<tr>
<td>Subject Name:</td>
<td><input type="text" th:field="*{name}" /></td>
</tr>
<tr>
<td>Course:</td>
<td>
<select>
<option value=""></option>
</select>
Z
</td>
</tr>
<tr>
<td colspan="2"><button type="submit">Save</button></td>
</tr>
</table>
</form>
</div>
</body>
</html>

So you want to load Course combo inside subject html
You need to modify subject controller
#RequestMapping("/subject")
public String viewHomePage(Model model){
List<Subject> subjectDetails= subjectDAO.findAll();
List<Course> courseDetail= courseDAO.findAll();
model.addAttribute("subjectDetails",subjectDetails);
model.addAttribute("courses",courseDetail);
return "subject";
}
In HTML
<tr>
<td>Course:</td>
<td>
<select th:field="*{course_code}">
<option value="">Choose..</option>
<option th:each="course: ${courses}" th:value="${course.id}" th:text="${course.name}" />
</select>
</td>
</tr>
<tr>
Edit 1:
I think you are loading addSubject.html
In that case you need to modify addSubject controller
#RequestMapping("/subject/new")
public String addSubject(Model model){
Subject subject =new Subject();
model.addAttribute("subject",subject);
List<Course> courseDetail= courseDAO.findAll();
model.addAttribute("courses",courseDetail);
return "addSubject";
}
Edit 2:
As per your code in Git I can see
#Autowired
private SubjectDAO subjectDAO;
private CourseDAO courseDAO;
It should be
#Autowired
private SubjectDAO subjectDAO;
#Autowired
private CourseDAO courseDAO;

First add all courses to the ModelMap
model.addAttribute("cources",courseDao.findAll());
Then use th:each attribute to populate select options
<select th:field="*{course}">
<option value="">Choose..</option>
<option th:each="c: ${cources}" th:value="${c.id}" th:text="${c.name}" />
</select>

Related

Spring MVC new row in database is created while want to update

I write my first form using Spring MVC pattern and Hibernate.
I have a problem when I want to update existing row in table.
After click "Edit" Buttno in a table, correct row is found in db. Then I can update "name" field and click SAVE button. Than in database i created new row with new ID.
I have wrote two System.out to check current values of object.
My Controller class:
#Controller
//#RequestMapping("/")
public class InterventionController {
#Autowired
private InterventionService interventionService;
#GetMapping("/")
public String viewHomePage(Model model){
List<InterventionModel> interventionList = interventionService.listAll();
model.addAttribute("interventionList", interventionList);
return "index";
}
#GetMapping("/new")
public String addInterventionForm(Model model){
InterventionModel interventionModel = new InterventionModel();
model.addAttribute("interventionModel", interventionModel);
System.out.println(model.toString());
return "new_intervention";
}
#RequestMapping(value="/save", method = RequestMethod.POST)
public String saveIntervention(#ModelAttribute("interventionModel")InterventionModel interventionModel){
System.out.println("Object retreived from editing view "+interventionModel); // <- just to check in console object attributes
interventionService.save(interventionModel);
return "redirect:/";
}
#RequestMapping("/edit/{id}")
public ModelAndView showEditInterventionForm(#PathVariable(name="id") Long id){
ModelAndView mav = new ModelAndView("edit_intervention");
InterventionModel interventionModel = interventionService.get(id).get(); // <-- Optional received from service layer
mav.addObject("interventionModel", interventionModel);
System.out.println("Object retrieved from database : "+interventionModel); // <- just to check in console object attributes
return mav;
}
#GetMapping("/delete/{id}")
public String deleteIntervention(#PathVariable(name="id") Long id){
interventionService.delete(id);
return "redirect:/";
}
My InterventionModel class doesn't contain any annotation. I don't know if that is a mistake, but that object is DTO between controller and service layer. In the service layer, it is mapped to the entity which is annotated #Entity.
public class InterventionModel {
private Long id;
private String name;
public InterventionModel() {
}
public InterventionModel(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
#Override
public String toString() {
return "InterventionModel{" +
"id=" + id +
", name='" + name + '\'' +
'}';
} }
index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>Interventions</title>
</head>
<body>
<div align="center">
<h1>Interventions</h1>
Create new Intervention
<br><br>
<table border="2" cellpadding="10">
<thead>
<tr>
<th>Intervention Id</th>
<th>Name</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr th:each="intervention :${interventionList}">
<td th:text="${intervention.id}">Intervention Id</td>
<td th:text="${intervention.name}">Name</td>
<td>
<a th:href="#{'/edit/' + ${intervention.id}}">Edit</a>
<a th:href="#{'/delete/' + ${intervention.id}}">Delete</a>
</td>
</tr>
</tbody>
</table>
</div>
</body>
</html>
and edit_intervention.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>Edit Intervention</title>
</head>
<body>
<div align="center">
<h1>Edit Intervention</h1>
<br/>
<form action="#" th:action="#{/save}" th:object="${interventionModel}" method="post">
<table border="0" cellpadding="10">
<tr>
<td>Intervention ID</td>
<!-- <td><input type="text" th:field="*{id}" readonly="readonly"/></td>-->
<td><input type="text" th:field="*{id}" readonly="readonly"/></td>
</tr>
<tr>
<td>Intervention name</td>
<td><input type="text" th:field="*{name}"/></td>
</tr>
<tr>
<td colspan="2"><button type="submit">Save</button> </td>
</tr>
</table>
</form>
</div>
</body>
</html>
What is curious for me. Object when is retrieved from DB has proper attributes (id, name) than Model is created and sent to edit_intervention.html form. After changing name, it goes back to save method but there ID number is "null", instead of name which contains changed new value.
For me (as a beginner) it looks like no all attributes are transferred from the view to the save method in controller. When we have ID set to "null" it's a sign for hibernate to create new row.
I guess there is a minor failure which I cannot find.
Logs from terminal when I call update form:
and view how table after modification looks like:
Thank you in advance for help.
As you see your id field is null. Because probably the Long value wasn't set.
In entity class you should mark id property as #Id, also you can always add the #GeneratedValue annotation above.

How to save selected for loop data in mysql database?

I'm new to spring boot and struck in a prob for some time now. In my thymeleaf page i have used a for loops and i need to save currently iterating item in the database.(ex:im using days of the week in a for loop and a user can select a subject for each item in my for loo, then 5 sql rows should be saved with day and subject) but currently it doesn't save the date and save 2 selected subjects in 1 sql row
Add time Table thymeleaf view
<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head>
<link rel="stylesheet" type="text/css" href="static/css/timeTableMapping.css" th:href="#{/css/timeTableMapping.css}">
<meta charset="UTF-8">
<title>Time Table</title>
</head>
<body>
</form>
<div class="container2">
<form action="#" th:action="#{/timeTableMapping/save}" th:object="${timeTableMapping}" method="post">
<table border="0" cell[adding="10">
<tr>
<td><h1>Time Table:</h1></td>
<td>
<select th:field="*{time_table_code}">
<option value="">Choose..</option>
<option th:each="timeTable: ${timeTables}" th:value="${timeTable.name}" th:text="${timeTable.name}"/>
</select>
</td>
</tr>
</table>
<table border="1" >
<thead>
<tr>
</tr>
<br>
<th:block th:each="day : ${days}">
<th th:value="${day.name}" th:text="${day.name}"></th>
</th:block>
</thead>
<tbody>
<th:block th:each="day : ${days}">
<td>
<select th:field="*{subject_code}">
<option value=""></option>
<option th:each="subject: ${subjects}" th:value="${subject.subject_code}" th:text="${subject.name}"/>
</select>
</td>
</th:block>
<tr>
<td colspan="2">
<button type="submit">Save</button>
</td>
</tr>
</tbody>
</table>
</form>
</div>
</body>
</html>
Time Table Mapping Controller
#Controller
public class TimeTableMappingController {
#Autowired
private TimeTableMappingDAO timeTableMappingDAO;
#Autowired
private TimeTableDAO timeTableDAO;
#Autowired
private SubjectDAO subjectDAO;
#Autowired
private StudentGroupDAO studentGroupDAO;
#Autowired
private DayDAO dayDAO;
#RequestMapping("/timeTableMapping")
public String viewHomePage(Model model){
List<TimeTableMapping> timeTableMappingDetails= timeTableMappingDAO.findAll();
model.addAttribute("timeTableMappingDetails",timeTableMappingDetails);
return "timeTableMapping";
}
#RequestMapping("/timeTableMapping/new")
public String addTimeTableMapping(Model model){
System.out.println("hey");
System.out.println("hey");
TimeTableMapping timeTableMapping =new TimeTableMapping();
model.addAttribute("timeTableMapping",timeTableMapping);
List<TimeTable> timeTableDetail = timeTableDAO.findAll();
model.addAttribute("timeTables", timeTableDetail);
List<Subject> subjectDetail = subjectDAO.findAll();
model.addAttribute("subjects", subjectDetail);
List<Day> dayDetails = dayDAO.findAll();
model.addAttribute("days",dayDetails);
List<Time> timeDetails = timeDAO.findAll();
model.addAttribute("times",timeDetails);
return "addTimeTableMapping";
}
#RequestMapping(value="/timeTableMapping/save",method= RequestMethod.POST)
public String saveTimeTable(#ModelAttribute("timeTableMapping") TimeTableMapping timeTableMapping){
timeTableMappingDAO.save(timeTableMapping);
return "redirect:/timeTableMapping";
}
/*
#RequestMapping(value="/timeTableMapping/saveAll",method= RequestMethod.POST)
public String saveAll(#ModelAttribute("timeTableMapping") TimeTableMapping timeTableMapping){
timeTableDAO.saveAll(timeTableMapping);
return "redirect:/timeTableMapping";
}*/
#RequestMapping("/timeTableMapping/edit/{id}")
public ModelAndView updateTimeTable(#PathVariable(name="id")Long id){
ModelAndView mav=new ModelAndView(("updateTimeTable"));
TimeTable timeTable = timeTableDAO.findById(id);
mav.addObject("timeTable",timeTable);
List<Subject> subjectDetails = subjectDAO.findAll();
mav.addObject("subjects", subjectDetails);
List<StudentGroup> studentGroupDetails = studentGroupDAO.findAll();
mav.addObject("studentGroups",studentGroupDetails);
List<Day> dayDetails = dayDAO.findAll();
mav.addObject("days",dayDetails);
List<Time> timeDetails = timeDAO.findAll();
mav.addObject("times",timeDetails);
return mav;
}
#RequestMapping("/timeTableMapping/delete/{id}")
public String deleteProduct(#PathVariable(name="id") Long id){
timeTableDAO.delete(id);
return "redirect:/timeTable";
}
}
Add Time Table DAO
#Service
public class TimeTableMappingDAO {
#Autowired
TimeTableRepository timeTableRepository;
#Autowired
TimeTableMappingRepository timeTableMappingRepository;
//to save a time table
public TimeTableMapping save(TimeTableMapping timeTableMapping){
return timeTableMappingRepository.save(timeTableMapping);
}
//#Override
public void saveAll(List<TimeTableMapping> timeTableMapping) {
List<TimeTableMapping> timetable=new ArrayList<>();
timeTableMappingRepository.saveAll(timetable).forEach(timeTableMapping::add); // TimeTable repository
}
/*
public TimeTableMapping saveAll(TimeTableMapping timeTableMapping){
return timeTableMappingRepository.saveAll(timeTableMapping);
}
*/
//to search all
public List<TimeTableMapping> findAll(){
return timeTableMappingRepository.findAll();
}
//get by id
public TimeTableMapping findById(Long id){
return timeTableMappingRepository.findById(id).orElse(null);
}
//delete
public void delete(Long id){
timeTableMappingRepository.deleteById(id);
}
}
Time Table Mapping Repository
#Repository
public interface TimeTableMappingRepository extends JpaRepository<TimeTableMapping, Long> {
}
Before auto wiring TimeTableMappingRepository in your DAO, you should add #Repository on interface TimeTableMappingRepository.
Just like this
#Repository
public interface TimeTableMappingRepository extends JpaRepository {}
By Adding #Repository on the interface, spring-data-jpa will create a proxy object of this interface on runtime and you will be able to autowired it.
You are getting more than one data. So you should use List<TimeTableMapping> timeTableMapping
In your service Implementation, you can pass the list that you got adn save all
#Override
public void saveAll(List<TimeTableMapping> timeTableMapping) {
List<TimeTableMapping> timetable=new ArrayList<>();
repository.saveAll(timetable).forEach(timeTableMapping::add); // TimeTable repository
}

CRUD in controller is not deleting row correctly

I was able to create values and store into my db, which displays a view of the list of values stored and additional values that is written into a input will automatically show in the table.
Controller
#Controller
public class AppPortController {
private ApServerService apServerService;
#Autowired
public void setApServerService(ApServerService apServerService) {
this.apServerService = apServerService;
}
#RequestMapping(value = "/editApServer", method = RequestMethod.GET)
public String list(Model model) {
model.addAttribute("apList", apServerService.listAllApServerModels());
return "editApServer";
}
#RequestMapping("editApServer/update/{id}")
public String update(#PathVariable String id, Model model) {
model.addAttribute("apList", apServerService.getApServerModelById(id));
return "editApServer";
}
#RequestMapping("editApServer/new")
public String newServer(Model model){
model.addAttribute("apServer", new ApServerModel());
return "editApServer";
}
#RequestMapping(value = "/addServer", method = RequestMethod.POST)
public String addServer(#ModelAttribute ApServerModel apServerModel) {
apServerService.saveApServerModel(apServerModel);
return "redirect:editApServer";
}
#RequestMapping("editApServer/delete")
public String delete(#PathVariable String host){
apServerService.deleteApServerModel(host);
return "redirect:editApServer";
}
Repository
public interface AppPortRepository extends CrudRepository<ApServerModel, String> {}
POJO
#Document(collection = "apDBServer")
public class ApServerModel {
#Id
private String id;
private String host;
private String port;
//getters and setters
HTML SNIPPET
<table>
<thead>
<tr>
<th> Host Name </th>
<th> Port Name</th>
<th>Id</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr th:each="ApServerModel : ${apList}">
<td th:text ="${ApServerModel.host}"></td>
<td th:text ="${ApServerModel.port}"></td>
<td th:text ="${ApServerModel.id}"></td>
<td><a th:href="${'editApServer/update/' + ApServerModel.id}">Edit</a></td>
<td><a th:href="${'editApServer/delete'}">Delete</a></td>
</tr>
</tbody>
</table>
<br />
<h2>Add AppPortServer</h2>
<form action="/addServer" method="POST">
Host <input type="text" id="host" name="host" /><br />
Port <input type="text" id="port" name="port" /><br />
<input type="submit" />
</form>
Problem
In my controller the delete would not execute(it is not doing what I want it to do). but line below it redirects me back to the same page.
What am I doing wrong? I have been savaging through the internet trying to find the crud functions for mongodb using springboot. Logically speaking why wouldn't my delete work if I follow the logic of the create?
I followed Tutorial, for posting to a table. Then I followed
Tutorial 2 That implements my delete and update. But It does not delete the values.

Spring MVC Hibernate Application loading database table

I created a simple web application with SpringMVC and Hibernate. Everything works fine, my employees are added to database (using MySQL) but page don't show the list of them:
Also logger don't show any output message when I'm adding the object when it should show something like: "Employee add successfully, Employee details: ..."
Here's the page:
<%# taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%# taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%# taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%# page session="false" %>
<html>
<head>
<title>Employee Page</title>
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;border-color:#ccc;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#fff;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#f0f0f0;}
.tg .tg-4eph{background-color:#f9f9f9}
</style>
</head>
<body>
<h1>
Add a Employee
</h1>
<c:url var="addAction" value="/employee/add" ></c:url>
<form:form action="${addAction}" commandName="employee">
<table>
<c:if test="${!empty employee.name}">
<tr>
<td>
<form:label path="id">
<spring:message text="ID"/>
</form:label>
</td>
<td>
<form:input path="id" readonly="true" size="8" disabled="true" />
<form:hidden path="id" />
</td>
</tr>
</c:if>
<tr>
<td>
<form:label path="name">
<spring:message text="Name"/>
</form:label>
</td>
<td>
<form:input path="name" />
</td>
</tr>
<tr>
<td colspan="2">
<c:if test="${!empty employee.name}">
<input type="submit"
value="<spring:message text="Edit Employee"/>" />
</c:if>
<c:if test="${empty employee.name}">
<input type="submit"
value="<spring:message text="Add Employee"/>" />
</c:if>
</td>
</tr>
</table>
</form:form>
<br>
<h3>List of Employees</h3>
<c:if test="${!empty listEmployees}">
<table class="tg">
<tr>
<th width="80">Employee ID</th>
<th width="120">Employee Name</th>
<th width="60">Edit</th>
<th width="60">Delete</th>
</tr>
<c:forEach items="${listEmployee}" var="employee">
<tr>
<td>${employee.id}</td>
<td>${employee.name}</td>
<td><a href="<c:url value='/edit/${employee.id}' />" >Edit</a></td>
<td><a href="<c:url value='/remove/${employee.id}' />" >Delete</a></td>
</tr>
</c:forEach>
</table>
</c:if>
</body>
</html>
#Qualifier(value = "employeeDAO")
public class EmployeeDAOImpl implements EmployeeDAO {
private static final Logger logger = LoggerFactory.getLogger(EmployeeDAOImpl.class);
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sf){
this.sessionFactory = sf;
}
#Override
public void addEmployee(Employee e) {
Session session = this.sessionFactory.getCurrentSession();
session.persist(e);
logger.info("Employee saved successfully, Employee details: " + e);
}
#Override
public void updateEmployee(Employee e) {
Session session = this.sessionFactory.getCurrentSession();
session.update(e);
logger.info("Employee updated successfully, Employee details: " + e);
}
#SuppressWarnings("uncheked")
#Override
public List<Employee> listEmployee() {
Session session = this.sessionFactory.getCurrentSession();
List<Employee> employeeList = session.createQuery("FROM Employee").list();
for (Employee e: employeeList){
logger.info("Employee List::" + e);
}
return employeeList;
}
#Override
public Employee getEmployeeById(int id) {
Session session = this.sessionFactory.getCurrentSession();
Employee e = (Employee) session.load(Employee.class, new Integer(id));
logger.info("Employee loaded successfully, Employee details: " + e);
return null;
}
#Override
public void removeEmployee(int id) {
Session session = this.sessionFactory.getCurrentSession();
Employee e = (Employee) session.load(Employee.class, new Integer(id));
if(e != null){
session.delete(e);
}
logger.info("Employee delete successfully, Employee details: " + e);
}
}
My Service class:
#Service
#Qualifier(value = "employeeService")
public class EmployeeServiceImpl implements EmployeeService{
public EmployeeServiceImpl() {
}
private EmployeeDAO employeeDAO;
public EmployeeServiceImpl(EmployeeDAO employeeDAO) {
this.employeeDAO = employeeDAO;
}
#Override
#Transactional
public void addEmployee(Employee e) {
this.employeeDAO.addEmployee(e);
}
#Override
#Transactional
public void updateEmployee(Employee e) {
this.employeeDAO.updateEmployee(e);
}
#Override
#Transactional
public List<Employee> listEmployee() {
return this.employeeDAO.listEmployee();
}
#Override
#Transactional
public Employee getEmployeeById(int id) {
return this.employeeDAO.getEmployeeById(id);
}
#Override
#Transactional
public void removeEmployee(int id) {
this.employeeDAO.removeEmployee(id);
}
public void setEmployeeDAO(EmployeeDAOImpl employeeDAO) {
this.employeeDAO = employeeDAO;
}
}
Here I create the mapping:
#Entity
#Table(name = "Employee")
public class Employee {
#Column(name = "Name")
private String name;
#Id
#Column(name = "Employee ID")
#GeneratedValue(strategy = GenerationType.IDENTITY)
private int employeeID;
public Employee(String name) {
this.name = name;
}
public Employee() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getEmployeeID() {
return employeeID;
}
public void setEmployeeID(int employeeID) {
this.employeeID = employeeID;
}
#Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", employeeID=" + employeeID +
'}';
}
}
Controller class:
#Controller
public class EmployeeController {
private EmployeeService employeeService;
#Autowired(required = true)
#Qualifier("employeeService")
public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
}
#RequestMapping(value = "/employee", method = RequestMethod.GET)
public String employeeList(Model model) {
model.addAttribute("employee", new Employee());
model.addAttribute("listEmployee", this.employeeService.listEmployee());
return "employee";
}
//For add and update person both
#RequestMapping(value = "/employee/add", method = RequestMethod.GET)
public String addEmployee(#ModelAttribute("person") Employee e){
if (e.getEmployeeID() == 0){
//new employee, add it
this.employeeService.addEmployee(e);
}else {
//existing employee, call update
this.employeeService.updateEmployee(e);
}
return "redirect:/employee";
}
#RequestMapping(value = "employees/remove/{id}")
public String removeEmployee(#PathVariable("id") int id){
this.employeeService.removeEmployee(id);
return "redirect:/employees";
}
#RequestMapping(value = "/employees/edit{id}")
public String editEmployee(#PathVariable("id") int id, Model model){
model.addAttribute("employee", this.employeeService.getEmployeeById(id));
model.addAttribute("listEmployees", this.employeeService.listEmployee());
return "employee";
}
}
In JSP Page your checking condition listEmployees , but in Controller You have added as model attribute listEmployee. remove last character s from listEmployees in Jsp. It should work. Otherwise everything is fine.
<c:if test="${!empty listEmployees}">
In Controller
model.addAttribute("listEmployee", this.employeeService.listEmployee());
change
<c:forEach items="${listEmployee}" var="employee">
to
<c:forEach items="${listEmployees}" var="employee">

How to handle data from form in Spring MVC

I have jsp that show all posts in blog
<body>
<table>
<c:forEach var="post" items="${posts}">
<tr>
<td>${post.id}</td>
<td>${post.text}</td>
<td>Show author</td>
</tr>
</c:forEach>
</table>
<div>
JSON XML
</div>
</body>
I have controller to handle it
#Controller
public class PostsController {
#Autowired
private PostDAO postDao;
#RequestMapping("/posts")
public String showAllPosts(ModelMap model) {
List<Post> posts = postDao.findAll();
model.addAttribute("posts", posts);
return "posts";
}
#RequestMapping("/posts/get")
public List<Post> getAllPosts() {
List<Post> posts = postDao.findAll();
return posts;
}
}
Now I want to add form to save new post.
I add form in my jsp
<form:form method="POST" action="/posts/add" modelAttribute="post">
<table>
<tr>
<td><form:label path="id">Id:</form:label></td>
<td><form:input path="id" /></td>
</tr>
<tr>
<td><form:label path="text">Text:</form:label></td>
<td><form:input path="text" /></td>
</tr>
</table>
<input type="submit" value="Save" />
</form:form>
Also I add to controller.
#RequestMapping( value = "/posts/add", method = RequestMethod.POST)
public String saveAdd(#ModelAttribute("post") Post post, ModelMap model) {
model.addAttribute("posts", postDao.addPost(post));
return "posts";
}
Domain model Post.java
public class Post {
private int id;
private String author;
private String text;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
But I get
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'post' available as request attribute
Because your JSP contains the new form for adding a new post, it will need the model attribute post to be present when you go to /posts.
#RequestMapping("/posts")
public String showAllPosts(ModelMap model) {
List<Post> posts = postDao.findAll();
model.addAttribute("post", new Post()); // Add empty form backing object
model.addAttribute("posts", posts);
return "posts";
}
You could even split out model creation to a separate method if you find you're having to create the model in multiple places. This will ensure that its always available.
#ModelAttribute("post")
public Post createModel() {
return new Post();
}
From Controller:
#RequestMapping(value = "createcustomer",method = RequestMethod.GET)
public String customer(Model model)
{
Customer cus=new Customer();
cus.setCustomerNumber("Test");
model.addAttribute("customer",cus);
return "createcustomer";
}
In View:
<%#taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%# taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<div class="cl">
<form:form commandName="customer" method="POST">
<p>Name: <c:out value="${customer.CustomerNumber}"></c:out></p>
</form:form>
<div>
Output:
Name: Test

Categories