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">
Related
I am new to springboot and thymeleaf and I'm trying to understand the form handling methods that interact with the code. Below you will find my html documents linked to a Users class. I am trying to change them to link to a customer class amongst other things, but anytime I change the th:object=${users} to match the new entity 'customerentity' it gives me the error below. What more do I have to do to get the bean(?) to register my new attribute? Any help or links to other answers is greatly appreciated.
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'customerentity' available as request attribute
Here is my entity class
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.springframework.lang.NonNull;
#Entity
public class Users {
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
private long id;
#NonNull
private String name;
#NonNull
private String email;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// standard constructors / setters / getters / toString
}
The controller class
#Controller
public class UserController {
//set up a UserRepositoty variable
#Autowired
private UserRepository userRepository;
//create an UserRepository instance - instantiation (new) is done by Spring
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
//Mapping for the /index URL when initiated through Tomcat
#RequestMapping({"/index"})
public String showUserList(Model model) {
model.addAttribute("customers", userRepository.findAll());
return "index";
}
//Mapping for the /signup URL - calls the add-user HTML, to add a user
#RequestMapping({"/signup"})
public String showSignUpForm(Users user) {
return "add-user";
}
//Mapping for the /signup URL - to add a user
#RequestMapping({"/adduser"})
public String addUser(#Validated Users users, BindingResult result, Model model) {
if (result.hasErrors()) {
return "add-user";
}
userRepository.save(users);
return "redirect:/index";
}
//Mapping for the /edit/user URL to edit a user
#GetMapping("/edit/{id}")
public String showUpdateForm(#PathVariable("id") long id, Model model) {
Users user = userRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id));
model.addAttribute("customer", user);
return "update-user";
}
//Mapping for the /update/id URL to update a user
#PostMapping("/update/{id}")
public String updateUser(#PathVariable("id") long id, #Validated Users user,
BindingResult result, Model model) {
if (result.hasErrors()) {
user.setId(id);
return "update-user";
}
userRepository.save(user);
return "redirect:/index";
}
//Mapping for the /delete/id URL to delete a user
#GetMapping("/delete/{id}")
public String deleteUser(#PathVariable("id") long id, Model model) {
Users user = userRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id));
userRepository.delete(user);
return "redirect:/index";
}
}
The html documents
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>Add User</title>
</head>
<body>
<form action="#" th:action="#{/adduser}" th:object="${users}" method="post">
<label for="name">Name</label>
<input type="text" th:field="*{name}" id="name" placeholder="Name">
<span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span>
<label for="email">Email</label>
<input type="text" th:field="*{email}" id="email" placeholder="Email">
<span th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></span>
<input type="submit" value="Add User">
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>Add User</title>
</head>
<body>
<div th:switch="${users}">
<h2 th:case="null">No users yet!</h2>
<div th:case="*">
<h2>Users</h2>
<table>
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>Edit</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
<tr th:each="user : ${users}">
<td th:text="${user.name}"></td>
<td th:text="${user.email}"></td>
<td><a th:href="#{/edit/{id}(id=${user.id})}">Edit</a></td>
<td><a th:href="#{/delete/{id}(id=${user.id})}">Delete</a></td>
</tr>
</tbody>
</table>
</div>
<p>Add a new user</p>
</div>
</body>
</html>
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
}
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>
I am displaying checkboxes on a page and want to only update values in the db for which the values were changed. Also I would like to display an error if nothing was changed and form was submitted.
This is what i have so far. Any suggestion?
View
public class PersonView {
private List<Person> personList;
public List<Person> getPersonList() {
return personList;
}
public void setPersonList(List<Person> personList) {
this.personList = personList;
}
}
Domain
public class Person {
private String fullName;
private Boolean isSupervisor;
private Boolean isManager;
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public Boolean isSupervisor() {
return isSupervisor;
}
public void setSupervisor(Boolean isSupervisor) {
this.isSupervisor = isSupervisor;
}
public Boolean isManager() {
return isManager;
}
public void setManager(Boolean isManager) {
this.isManager = isManager;
}
}
Controller
#Controller
#RequestMapping("/person.html")
public class PersonsController {
#Autowired
private PersonService personService;
#RequestMapping(method = RequestMethod.GET)
public String initForm() {
return "member";
}
#RequestMapping(method = RequestMethod.POST)
public String submitForm(#ModelAttribute PersonView personView) {
model.addAttribute("persons", personView);
return "successMember";
}
#ModelAttribute
public PersonView getPersonView(){
List<Person> persons= personService.getPersonList();
PersonView pv = new PersonView();
pv.setPersonList(persons);
return pv;
}
}
JSP
<html>
<title>Persons Information</title>
</head>
<body>
<form:form method="POST" modelAttribute="personView">
<table>
<tr>
<th>Full Name</th>
<th>Supervisor</th>
<th>Manager</th>
</tr>
<c:forEach var="person" items="${personView.personList}"
varStatus="row">
<tr>
<td>{person.fullName}</td>
<td><form:checkbox path="personList[row.index].supervisor" value="true" />
</td>
<td><form:checkbox path="personList[row.index].manager" value="true" />
</td>
</tr>
</c:forEach>
<tr>
<td><input type="submit" name="submit" value="Submit">
</td>
</tr>
<tr>
</table>
</form:form>
</body>
</html>
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