This response provides Java Servlet and JSP code examples for the requested functionalities, including
user authentication, a simple counter, factorial calculation, form processing, and simulated database
interactions for product listings and employee records. Each example includes the necessary Java or JSP
code, along with explanations and expected behavior.
**Note on Execution:**
To run these examples, you will need a Java Development Kit (JDK) and a Servlet/JSP container like
Apache Tomcat.
1. **For Servlets:** Compile the `.java` files into `.class` files and place them in the `WEB-INF/classes`
directory of your web application. Configure `web.xml` as shown for each servlet.
2. **For JSPs:** Place the `.jsp` files directly in your web application's root directory or a subdirectory.
3. Deploy your web application (WAR file or exploded directory) to Tomcat.
4. Access the URLs as specified for each example in your web browser.
---
### 1. Java Servlet: Username/Password Validation
This servlet handles a POST request, validates the provided username and password against a
predefined set, and returns a success or error message.
**`LoginServlet.java`**
```java
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LoginServlet") // Using annotation for simpler configuration
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private Map<String, String> users;
@Override
public void init() throws ServletException {
super.init();
// Predefine username/password pairs
users = new HashMap<>();
users.put("admin", "password123");
users.put("user", "userpass");
users.put("test", "test1234");
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
String password = request.getParameter("password");
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Login Result</title>");
out.println("</head>");
out.println("<body>");
if (username != null && password != null && users.containsKey(username) &&
users.get(username).equals(password)) {
out.println("<h1>Login Successful!</h1>");
out.println("<p>Welcome, " + username + "!</p>");
} else {
out.println("<h1>Login Failed!</h1>");
out.println("<p>Invalid username or password.</p>");
out.println("</body>");
out.println("</html>");
out.close();
}
```
**`loginForm.html` (for testing the POST request)**
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Form</title>
</head>
<body>
<h1>User Login</h1>
<form action="LoginServlet" method="post">
<label for="username">Username:</label><br>
<input type="text" id="username" name="username" required><br><br>
<label for="password">Password:</label><br>
<input type="password" id="password" name="password" required><br><br>
<input type="submit" value="Login">
</form>
</body>
</html>
```
**Expected Output:**
* If you access `loginForm.html`, enter `admin` and `password123`, and submit, you will see "Login
Successful! Welcome, admin!".
* For any other credentials, you will see "Login Failed! Invalid username or password.".
---
### 2. Java Servlet: Simple Counter
This servlet increments and displays a counter each time it is accessed. The counter is stored as a
`ServletContext` attribute, making it application-wide.
**`CounterServlet.java`**
```java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/CounterServlet")
public class CounterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
ServletContext context = getServletContext();
Integer count = (Integer) context.getAttribute("visitCount");
if (count == null) {
count = 1;
} else {
count++;
context.setAttribute("visitCount", count);
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Page Counter</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Page Visits: " + count + "</h1>");
out.println("<p>This counter increments each time the servlet is accessed.</p>");
out.println("</body>");
out.println("</html>");
out.close();
```
**Expected Output:**
Each time you access `http://localhost:8080/YourWebApp/CounterServlet` (replace `YourWebApp` with
your actual web application context root), the displayed count will increment by one.
---
### 3. Java Servlet: Factorial Calculation
This servlet receives a GET request with a number, computes its factorial, and returns the result.
**`FactorialServlet.java`**
```java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/FactorialServlet")
public class FactorialServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String numberStr = request.getParameter("number");
long result = 0;
String message = "";
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Factorial Result</title>");
out.println("</head>");
out.println("<body>");
if (numberStr == null || numberStr.isEmpty()) {
message = "Please provide a number in the URL (e.g., ?number=5).";
} else {
try {
int number = Integer.parseInt(numberStr);
if (number < 0) {
message = "Factorial is not defined for negative numbers.";
} else if (number > 20) { // Factorial grows very fast, long might overflow
message = "Number is too large for factorial calculation (max 20 for long).";
else {
result = calculateFactorial(number);
message = "The factorial of " + number + " is " + result + ".";
} catch (NumberFormatException e) {
message = "Invalid input. Please enter a valid integer.";
out.println("<h1>" + message + "</h1>");
out.println("</body>");
out.println("</html>");
out.close();
private long calculateFactorial(int n) {
if (n == 0 || n == 1) {
return 1;
}
long fact = 1;
for (int i = 2; i <= n; i++) {
fact *= i;
return fact;
```
**Expected Output:**
* Access `http://localhost:8080/YourWebApp/FactorialServlet?number=5` to see "The factorial of 5 is
120.".
* Access `http://localhost:8080/YourWebApp/FactorialServlet?number=-3` to see "Factorial is not
defined for negative numbers.".
* Access `http://localhost:8080/YourWebApp/FactorialServlet?number=abc` to see "Invalid input.
Please enter a valid integer.".
---
### 4. JSP Page: Name and Email Form
This JSP page displays a form and, upon submission, retrieves the entered name and email to display a
welcome message.
**`welcomeForm.jsp`**
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Welcome Form</title>
</head>
<body>
<%
// Check if the form has been submitted (parameters exist)
String name = request.getParameter("userName");
String email = request.getParameter("userEmail");
if (name != null && !name.isEmpty() && email != null && !email.isEmpty()) {
%>
<h1>Welcome, <%= name %>!</h1>
<p>Your email address is: <%= email %></p>
<p><a href="welcomeForm.jsp">Go back to form</a></p>
<%
} else {
%>
<h1>Enter Your Details</h1>
<form action="welcomeForm.jsp" method="post">
<label for="userName">Name:</label><br>
<input type="text" id="userName" name="userName" required><br><br>
<label for="userEmail">Email:</label><br>
<input type="email" id="userEmail" name="userEmail" required><br><br>
<input type="submit" value="Submit">
</form>
<%
%>
</body>
</html>
```
**Expected Output:**
* Initially, you will see a form asking for Name and Email.
* After filling the form and submitting, the page will refresh and display "Welcome, [Your Name]!" and
"Your email address is: [Your Email]".
---
### 5. JSP Page: Product List and Shopping Cart (Simulated Database)
This example simulates fetching products from a database (using an `ArrayList` for simplicity) and allows
users to "add" them to a shopping cart (using session).
**`Product.java` (Helper Class)**
```java
package com.example.model; // Adjust package as needed
public class Product {
private int id;
private String name;
private double price;
public Product(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
// Getters
public int getId() { return id; }
public String getName() { return name; }
public double getPrice() { return price; }
// Setters (optional, depending on requirements)
public void setId(int id) { this.id = id; }
public void setName(String name) { this.name = name; }
public void setPrice(double price) { this.price = price; }
```
**`products.jsp`**
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.example.model.Product" %> <%-- Adjust package if you changed it --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Product Catalog</title>
<style>
table { width: 80%; border-collapse: collapse; margin: 20px 0; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.cart-summary { margin-top: 20px; padding: 10px; border: 1px solid #ccc; background-color: #f9f9f9; }
</style>
</head>
<body>
<h1>Our Products</h1>
<%
// Simulate fetching products from a database
List<Product> products = new ArrayList<>();
products.add(new Product(101, "Laptop", 1200.00));
products.add(new Product(102, "Mouse", 25.00));
products.add(new Product(103, "Keyboard", 75.00));
products.add(new Product(104, "Monitor", 300.00));
// Handle adding to cart
String productIdStr = request.getParameter("add_to_cart");
if (productIdStr != null && !productIdStr.isEmpty()) {
try {
int productId = Integer.parseInt(productIdStr);
Product productToAdd = null;
for (Product p : products) {
if (p.getId() == productId) {
productToAdd = p;
break;
if (productToAdd != null) {
// Get or create shopping cart in session
List<Product> cart = (List<Product>) session.getAttribute("shoppingCart");
if (cart == null) {
cart = new ArrayList<>();
}
cart.add(productToAdd);
session.setAttribute("shoppingCart", cart);
out.println("<p style='color: green;'>'" + productToAdd.getName() + "' added to cart!</p>");
} else {
out.println("<p style='color: red;'>Product not found!</p>");
} catch (NumberFormatException e) {
out.println("<p style='color: red;'>Invalid product ID!</p>");
%>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Price</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<% for (Product product : products) { %>
<tr>
<td><%= product.getId() %></td>
<td><%= product.getName() %></td>
<td>$<%= String.format("%.2f", product.getPrice()) %></td>
<td>
<a href="products.jsp?add_to_cart=<%= product.getId() %>">Add to Cart</a>
</td>
</tr>
<% } %>
</tbody>
</table>
<div class="cart-summary">
<h2>Your Shopping Cart</h2>
<%
List<Product> cart = (List<Product>) session.getAttribute("shoppingCart");
if (cart == null || cart.isEmpty()) {
out.println("<p>Your cart is empty.</p>");
} else {
double total = 0;
out.println("<ul>");
for (Product item : cart) {
out.println("<li>" + item.getName() + " - $" + String.format("%.2f", item.getPrice()) + "</li>");
total += item.getPrice();
out.println("</ul>");
out.println("<p><strong>Total: $" + String.format("%.2f", total) + "</strong></p>");
}
%>
<p><a href="products.jsp?clear_cart=true">Clear Cart</a></p>
<%
// Handle clearing cart
if ("true".equals(request.getParameter("clear_cart"))) {
session.removeAttribute("shoppingCart");
response.sendRedirect("products.jsp"); // Redirect to refresh the page
%>
</div>
</body>
</html>
```
**Expected Output:**
* You will see a table listing products (Laptop, Mouse, Keyboard, Monitor).
* Next to each product, there will be an "Add to Cart" link.
* Clicking "Add to Cart" will add the item to a "Your Shopping Cart" section below the table, and the
total price will update.
* The "Clear Cart" link will empty the cart.
---
### 6. JSP Page: Employee Records and Search (Simulated Database)
This example simulates fetching employee records and allows searching by name or department.
**`Employee.java` (Helper Class)**
```java
package com.example.model; // Adjust package as needed
public class Employee {
private int id;
private String name;
private String department;
private double salary;
public Employee(int id, String name, String department, double salary) {
this.id = id;
this.name = name;
this.department = department;
this.salary = salary;
// Getters
public int getId() { return id; }
public String getName() { return name; }
public String getDepartment() { return department; }
public double getSalary() { return salary; }
// Setters (optional)
public void setId(int id) { this.id = id; }
public void setName(String name) { this.name = name; }
public void setDepartment(String department) { this.department = department; }
public void setSalary(double salary) { this.salary = salary; }
```
**`employees.jsp`**
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.stream.Collectors" %>
<%@ page import="com.example.model.Employee" %> <%-- Adjust package if you changed it --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Employee Records</title>
<style>
table { width: 80%; border-collapse: collapse; margin: 20px 0; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
form { margin-bottom: 20px; }
</style>
</head>
<body>
<h1>Employee Records</h1>
<%
// Simulate fetching all employees from a database
List<Employee> allEmployees = new ArrayList<>();
allEmployees.add(new Employee(1, "Alice Smith", "HR", 60000.00));
allEmployees.add(new Employee(2, "Bob Johnson", "IT", 75000.00));
allEmployees.add(new Employee(3, "Charlie Brown", "Finance", 65000.00));
allEmployees.add(new Employee(4, "Diana Prince", "HR", 62000.00));
allEmployees.add(new Employee(5, "Eve Adams", "IT", 80000.00));
String searchName = request.getParameter("searchName");
String searchDept = request.getParameter("searchDepartment");
List<Employee> filteredEmployees = allEmployees;
// Apply filters
if (searchName != null && !searchName.trim().isEmpty()) {
String nameLower = searchName.trim().toLowerCase();
filteredEmployees = filteredEmployees.stream()
.filter(e -> e.getName().toLowerCase().contains(nameLower))
.collect(Collectors.toList());
if (searchDept != null && !searchDept.trim().isEmpty()) {
String deptLower = searchDept.trim().toLowerCase();
filteredEmployees = filteredEmployees.stream()
.filter(e -> e.getDepartment().toLowerCase().contains(deptLower))
.collect(Collectors.toList());
%>
<form action="employees.jsp" method="get">
<label for="searchName">Search by Name:</label>
<input type="text" id="searchName" name="searchName" value="<%= (searchName != null ?
searchName : "") %>">
<br><br>
<label for="searchDepartment">Search by Department:</label>
<input type="text" id="searchDepartment" name="searchDepartment" value="<%= (searchDept !=
null ? searchDept : "") %>">
<br><br>
<input type="submit" value="Search">
<input type="button" value="Clear Search" onclick="window.location.href='employees.jsp'">
</form>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Department</th>
<th>Salary</th>
</tr>
</thead>
<tbody>
<% if (filteredEmployees.isEmpty()) { %>
<tr><td colspan="4">No employees found matching your criteria.</td></tr>
<% } else { %>
<% for (Employee emp : filteredEmployees) { %>
<tr>
<td><%= emp.getId() %></td>
<td><%= emp.getName() %></td>
<td><%= emp.getDepartment() %></td>
<td>$<%= String.format("%.2f", emp.getSalary()) %></td>
</tr>
<% } %>
<% } %>
</tbody>
</table>
</body>
</html>
```
**Expected Output:**
* Initially, you will see a table listing all simulated employee records.
* Above the table, there will be a search form for "Search by Name" and "Search by Department".
* Entering text in either field and clicking "Search" will filter the table to show only matching
employees.
* Clicking "Clear Search" will reset the table to show all employees.