Knowledge Prerequisites
Understanding of:
Core Java
o Classes, Objects, Inheritance, Interfaces, Collections
Servlets & JSP
o Request/response lifecycle, web.xml,filter, RequestDispatcher, form
handling
Spring Framework Basics
o Inversion of Control (IoC), Dependency Injection (DI), MVC pattern
JDBC (Java Database Connectivity)
o Establishing DB connections, executing SQL queries
HTML, CSS, and Bootstrap
o For structuring and styling the UI
JavaScript & jQuery
o DOM manipulation, event handling, and AJAX basics
SQL
o Writing CREATE, INSERT, SELECT, UPDATE, and DELETE statements
📁 Project Structure
src/main/java
├── controller
├── service
├── dao
├── model
├── config
src/main/webapp
├── WEB-INF
│ ├── jsp
│ ├── web.xml
│ ├── spring-config.xml
└── static
├── css
├── js
💾 Database Table
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100),
country VARCHAR(100)
);
⚙️Spring Configuration
web.xml
<web-app>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</
servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
spring-config.xml
<context:component-scan base-package="com.example" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<tx:annotation-driven />
🧩 Model Class
public class User {
private int id;
private String name;
private String email;
private String country;
// Getters and Setters
}
DAO Layer
Interface
public interface UserDao {
List<User> getAllUsers();
void saveUser(User user);
User getUserById(int id);
void updateUser(User user);
void deleteUser(int id);
}
Implementation
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<User> getAllUsers() {
return jdbcTemplate.query("SELECT * FROM users", new
BeanPropertyRowMapper<>(User.class));
}
public void saveUser(User user) {
String sql = "INSERT INTO users (name, email, country) VALUES (?, ?, ?)";
jdbcTemplate.update(sql, user.getName(), user.getEmail(),
user.getCountry());
}
public User getUserById(int id) {
return jdbcTemplate.queryForObject("SELECT * FROM users WHERE id=?",
new Object[]{id},
new BeanPropertyRowMapper<>(User.class));
}
public void updateUser(User user) {
String sql = "UPDATE users SET name=?, email=?, country=? WHERE id=?";
jdbcTemplate.update(sql, user.getName(), user.getEmail(),
user.getCountry(), user.getId());
}
public void deleteUser(int id) {
jdbcTemplate.update("DELETE FROM users WHERE id=?", id);
}
}
🧠 Service Layer
public interface UserService {
List<User> getAllUsers();
void saveUser(User user);
User getUserById(int id);
void updateUser(User user);
void deleteUser(int id);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
public List<User> getAllUsers() { return userDao.getAllUsers(); }
public void saveUser(User user) { userDao.saveUser(user); }
public User getUserById(int id) { return userDao.getUserById(id); }
public void updateUser(User user) { userDao.updateUser(user); }
public void deleteUser(int id) { userDao.deleteUser(id); }
}
🧭 Controller Layer
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/")
public String listUsers(Model model) {
model.addAttribute("users", userService.getAllUsers());
return "list";
}
@GetMapping("/new")
public String showNewForm(Model model) {
model.addAttribute("user", new User());
return "form";
}
@PostMapping("/save")
public String saveUser(@ModelAttribute("user") User user) {
userService.saveUser(user);
return "redirect:/users/";
}
@GetMapping("/edit/{id}")
public String editForm(@PathVariable int id, Model model) {
model.addAttribute("user", userService.getUserById(id));
return "form";
}
@GetMapping("/delete/{id}")
public String deleteUser(@PathVariable int id) {
userService.deleteUser(id);
return "redirect:/users/";
}
}
JSP Views
<table class="table table-bordered">
<tr><th>ID</th><th>Name</th><th>Email</th><th>Actions</th></tr>
<c:forEach items="${users}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.email}</td>
<td>
<a href="/users/edit/${user.id}" class="btn btn-warning">Edit</a>
<a href="/users/delete/${user.id}" class="btn
btn-danger">Delete</a>
</td>
</tr>
</c:forEach>
</table>
form.jsp
<form action="/users/save" method="post">
<input type="hidden" name="id" value="${user.id}" />
<input type="text" name="name" value="${user.name}"
placeholder="Name" />
<input type="email" name="email" value="${user.email}"
placeholder="Email" />
<input type="text" name="country" value="${user.country}"
placeholder="Country" />
<button type="submit" class="btn btn-success">Save</button>
</form>
🧩 jQuery Interactivity
<script>
$(".btn-danger").click(function(e){
if(!confirm("Are you sure?")) e.preventDefault();
});
</script>