Web_Architecture–_Principles_and_Protocols_Lab_Manual[1]
Web_Architecture–_Principles_and_Protocols_Lab_Manual[1]
1
To implement session management in web applications using cookies
8.
or session tokens.
To implement the design of a basic web page using HTML, CSS, and
16.
JavaScript to manipulate page elements dynamically.
To implement client-side form validation using JavaScript for real-
17. time user input validation.
2
1. To implement the configuration of a basic HTTP server using Apache
Objective:
Requirements:
Procedure:
1. Install Apache:
o On Ubuntu/Debian:
o On CentOS/RHEL:
o On Windows:
▪ Download and install Apache from Apache Lounge.
o On Ubuntu/Debian:
o On CentOS/RHEL:
3
o Create a new configuration file for your website:
o ServerAdmin [email protected]
o DocumentRoot /var/www/mywebsite
o ServerName mywebsite.com
o ErrorLog ${APACHE_LOG_DIR}/error.log
o </VirtualHost>
o Save and exit.
5. Enable the New Virtual Host:
o On Ubuntu/Debian:
o On CentOS/RHEL:
o On CentOS:
4
2. To implement HTTP request methods (GET, POST, PUT, DELETE)
index.html
<!DOCTYPE html>
<html>
<head>
<body>
<h2>GET Request</h2>
</form>
<h2>POST Request</h2>
</form>
<h2>PUT Request</h2>
<form id="putForm">
</form>
<h2>DELETE Request</h2>
<form id="deleteForm">
<input type="text" name="id" placeholder="Enter ID to delete">
5
<button onclick="sendDeleteRequest(event)">Send DELETE</button>
</form>
<script>
function sendPutRequest(e) {
e.preventDefault();
fetch('demo', {
method: 'PUT',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: 'data=' + encodeURIComponent(data)
});
function sendDeleteRequest(e) {
e.preventDefault();
const id = document.querySelector('input[name="id"]').value;
fetch('demo', {
method: 'DELETE',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
});
}
</script>
</body>
</html>
6
DemoServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo")
@Override
response.setContentType("text/html");
PrintWriter out = response.getWriter();
@Override
response.setContentType("text/html");
PrintWriter out = response.getWriter();
7
String data = request.getParameter("data");
@Override
response.setContentType("text/html");
@Override
response.setContentType("text/html");
String id = request.getParameter("id");
out.println("DELETE request received for ID: " + id);
8
web.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
</web-app>
9
3. To implement the examination of HTTP message structures, including
request and response headers and body content.
message-inspector.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h4>Custom Headers</h4>
<input type="text" name="customHeader" placeholder="Custom header
value"><br><br>
</form>
<script>
fetch('inspector', {
headers: {
'X-Custom-Header': 'Test-Value',
'Content-Type': 'application/json'
10
}
});
</script>
</body>
</html>
HttpMessageInspectorServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collections;
import java.util.Enumeration;
import java.util.stream.Collectors;
@WebServlet("/inspector")
@MultipartConfig
@Override
11
examineRequest(request, response);
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
examineRequest(request, response);
response.setHeader("Cache-Control", "no-cache");
out.println("<html><body>");
out.println("<h2>HTTP Request Information</h2>");
out.println("<h3>Request Line</h3>");
// Request Headers
out.println("<h3>Request Headers</h3>");
12
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
// Request Parameters
out.println("<h3>Request Parameters</h3>");
});
if ("POST".equals(request.getMethod())) {
out.println("<h3>Request Body</h3>");
try {
request.getContentType().startsWith("multipart/form-data")) {
for (Part part : request.getParts()) {
} else {
.lines()
.collect(Collectors.joining(System.lineSeparator()));
13
out.println("Body Content: " + body + "<br>");
} catch (Exception e) {
// Response Information
out.println("<h3>Response Information</h3>");
out.println("</body></html>");
14
4. To implement server-side logic to handle different HTTP request
methods using programming languages such as Python, Java, or PHP.
index.html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div>
<h3>Get User</h3>
</div>
<div>
<h3>Create User</h3>
</form>
</div>
15
<!-- PUT Request - Update User -->
<div>
<h3>Update User</h3>
<form id="updateForm">
</form>
</div>
<div>
<h3>Delete User</h3>
<form id="deleteForm">
</form>
</div>
<script>
function updateUser(e) {
e.preventDefault();
const data = {
userId: document.getElementById('updateUserId').value,
name: document.getElementById('updateName').value,
email: document.getElementById('updateEmail').value
};
16
fetch('userServlet', {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
function deleteUser(e) {
e.preventDefault();
fetch(`userServlet?userId=${userId}`, {
method: 'DELETE'
})
.then(response => response.text())
</script>
</body>
</html>
UserServlet.java
package com.example;
17
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.BufferedReader;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
@Override
response.setContentType("text/plain");
if (users.containsKey(userId)) {
} else {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
response.getWriter().write("User not found");
}
}
18
@Override
users.put(userId, newUser);
response.setContentType("text/plain");
response.getWriter().write("User created with ID: " + userId);
@Override
buffer.append(line);
response.setContentType("text/plain");
if (users.containsKey(updatedUser.getUserId())) {
users.put(updatedUser.getUserId(), updatedUser);
19
response.getWriter().write("User updated successfully");
} else {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
@Override
if (users.containsKey(userId)) {
users.remove(userId);
} else {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
User.java
package com.example;
20
public User(String userId, String name, String email) {
this.userId = userId;
this.name = name;
this.email = email;
return userId;
return email;
pom.xml
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
21
5. To implement the handling and interpretation of HTTP status codes in
server-side applications.
Status.html
<!DOCTYPE html>
<html>
<head>
<style>
.result {
margin: 20px;
padding: 10px;
</style>
</head>
<body>
<div>
22
<div id="result" class="result"></div>
<script>
async function testStatus(action) {
try {
result.innerHTML = `
<h4>Response Details:</h4>
<p>Status: ${response.status} ${response.statusText}</p>
<p>Headers:</p>
<pre>${formatHeaders(response.headers)}</pre>
`;
if (response.ok) {
} catch (error) {
document.getElementById('result').innerHTML = `
<p>Error: ${error.message}</p>
`;
function formatHeaders(headers) {
let result = '';
23
for (const [key, value] of headers) {
return result;
}
</script>
</body>
</html>
StatusCodeDemoServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/status")
@Override
try {
if (action == null) {
24
// 400 Bad Request
return;
switch (action) {
case "success":
// 200 OK
response.setStatus(HttpServletResponse.SC_OK);
break;
case "created":
// 201 Created
response.setStatus(HttpServletResponse.SC_CREATED);
response.setHeader("Location", "/resource/123");
break;
case "notfound":
// 404 Not Found
case "unauthorized":
// 401 Unauthorized
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
25
response.setHeader("WWW-Authenticate", "Basic realm=\"Access to status
demo\"");
break;
case "forbidden":
// 403 Forbidden
response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access denied");
break;
case "redirect":
response.sendRedirect("/status?action=success");
break;
case "server-error":
default:
}
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Internal Server Error: " + e.getMessage());
26
private void sendResponse(HttpServletResponse response, String message) throws
IOException {
response.setContentType("text/html");
out.println("<html><body>");
out.println("</body></html>");
27
6. To implement custom HTTP headers for enhanced functionality and
security in web communication.
headers.html
<!DOCTYPE html>
<html>
<head>
<style>
.response {
margin: 20px;
padding: 10px;
background-color: #f9f9f9;
</style>
</head>
<body>
<h2>Custom Headers Demo</h2>
<div>
<script>
28
async function sendRequest() {
try {
headers: {
'X-API-Key': apiKey,
'X-Custom-Header': customHeader,
'X-Client-Version': '1.0',
'X-Device-ID': generateDeviceId()
}
});
responseDiv.innerHTML += text;
} catch (error) {
document.getElementById('response').innerHTML =
29
`<p style="color: red">Error: ${error.message}</p>`;
function generateDeviceId() {
</script>
</body>
</html>
CustomHeaderServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet("/api/*")
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
30
setSecurityHeaders(response);
response.setHeader("X-API-Version", "1.0");
response.setHeader("X-Request-ID", generateRequestId());
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
processRequest(request, response);
response.setHeader("X-Content-Type-Options", "nosniff");
response.setHeader("X-Frame-Options", "DENY");
response.setHeader("Strict-Transport-Security", "max-age=31536000;
includeSubDomains");
response.setHeader("Content-Security-Policy",
response.setHeader("Referrer-Policy", "strict-origin-when-cross-origin");
}
31
private String generateRequestId() {
return java.util.UUID.randomUUID().toString();
return "your-valid-api-key".equals(apiKey);
out.println("<html><body>");
while (headerNames.hasMoreElements()) {
out.println("</body></html>");
}
}
32
7. To implement caching control headers to manage browser and proxy
caching behavior effectively.
cache-test.html
<!DOCTYPE html>
<html>
<head>
<title>Cache Control Demo</title>
<style>
.result {
margin: 10px;
padding: 10px;
border: 1px solid #ccc;
}
.button-group {
margin: 10px 0;
}
</style>
</head>
<body>
<h2>Cache Control Testing</h2>
<div class="button-group">
<button onclick="testCache('/cache/no-cache')">Test No Cache</button>
<button onclick="testCache('/cache/public')">Test Public Cache</button>
<button onclick="testCache('/cache/private')">Test Private Cache</button>
<button onclick="testCache('/cache/etag')">Test ETag</button>
<button onclick="testCache('/cache/last-modified')">Test Last-Modified</button>
</div>
<script>
async function testCache(url) {
try {
const response = await fetch(url);
const result = document.getElementById('result');
result.innerHTML = `
<h3>Response Headers:</h3>
<pre>${formatHeaders(response.headers)}</pre>
<h3>Response Body:</h3>
33
`;
function formatHeaders(headers) {
let result = '';
for (const [key, value] of headers) {
result += `${key}: ${value}\n`;
}
return result;
}
</script>
</body>
</html>
CacheControlServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
@WebServlet("/cache/*")
public class CacheControlServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String pathInfo = request.getPathInfo();
switch (pathInfo) {
34
case "/no-cache":
setNoCacheHeaders(response);
break;
case "/public":
setPublicCacheHeaders(response);
break;
case "/private":
setPrivateCacheHeaders(response);
break;
case "/etag":
handleEtagRequest(request, response);
break;
case "/last-modified":
handleLastModifiedRequest(request, response);
break;
default:
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
// Generate content
generateContent(response, pathInfo);
}
private void setNoCacheHeaders(HttpServletResponse response) {
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
}
private void setPublicCacheHeaders(HttpServletResponse response) {
response.setHeader("Cache-Control", "public, max-age=31536000"); // Cache for one
year
response.setDateHeader("Expires", System.currentTimeMillis() + 31536000000L);
}
private void setPrivateCacheHeaders(HttpServletResponse response) {
response.setHeader("Cache-Control", "private, max-age=3600"); // Cache for one
hour
response.setDateHeader("Expires", System.currentTimeMillis() + 3600000L);
}
35
String ifNoneMatch = request.getHeader("If-None-Match");
if (ifNoneMatch != null && ifNoneMatch.equals(etag)) {
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return;
}
response.setHeader("ETag", etag);
response.setHeader("Cache-Control", "public, must-revalidate");
}
private void handleLastModifiedRequest(HttpServletRequest request,
HttpServletResponse response) {
long lastModified = 1609459200000L; // Example timestamp (2021-01-01)
long ifModifiedSince = request.getDateHeader("If-Modified-Since");
if (ifModifiedSince != -1 && ifModifiedSince >= lastModified) {
response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return;
}
response.setDateHeader("Last-Modified", lastModified);
response.setHeader("Cache-Control", "public, must-revalidate");
}
private void generateContent(HttpServletResponse response, String pathInfo) throws
IOException {
response.setContentType("text/html");
response.getWriter().println("<html><body>");
response.getWriter().println("<h2>Cache Control Demo</h2>");
response.getWriter().println("<p>Path: " + pathInfo + "</p>");
response.getWriter().println("<p>Generated at: " + getCurrentTime() + "</p>");
response.getWriter().println("</body></html>");
}
private String getCurrentTime() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
return sdf.format(new Date()) + " UTC";
}
}
36
8. To implement session management in web applications using cookies or
session tokens.
session.html
<!DOCTYPE html>
<html>
<head>
<title>Session Management Demo</title>
<style>
.container {
margin: 20px;
padding: 20px;
border: 1px solid #ccc;
}
.status {
margin-top: 10px;
padding: 10px;
border-radius: 4px;
}
.success { background-color: #dff0d8; }
.error { background-color: #f2dede; }
</style>
</head>
<body>
<div class="container">
<h2>Session Management Demo</h2>
<div>
<h3>Login</h3>
<select id="sessionType">
<option value="cookie">Cookie-based Session</option>
<option value="token">Token-based Session</option>
</select>
<br><br>
<input type="text" id="username" placeholder="Username">
<input type="password" id="password" placeholder="Password">
<button onclick="login()">Login</button>
</div>
<div>
<h3>Session Status</h3>
<button onclick="checkSession()">Check Session</button>
37
<button onclick="logout()">Logout</button>
</div>
<div id="status" class="status"></div>
</div>
<script>
async function login() {
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
const sessionType = document.getElementById('sessionType').value;
try {
const response = await fetch('/session/login', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body:
`username=${username}&password=${password}&sessionType=${sessionType}`
});
38
async function logout() {
const sessionType = document.getElementById('sessionType').value;
try {
const response = await fetch('/session/logout', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `sessionType=${sessionType}`
});
SessionManagementServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
@WebServlet("/session/*")
39
public class SessionManagementServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getPathInfo();
switch (action) {
case "/login":
handleLogin(request, response);
break;
case "/logout":
handleLogout(request, response);
break;
default:
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getPathInfo();
if ("/check".equals(action)) {
checkSession(request, response);
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
40
session.setAttribute("username", username);
session.setAttribute("loginTime", System.currentTimeMillis());
} else {
// Token-based session
String token = generateToken();
SessionData sessionData = new SessionData(username,
System.currentTimeMillis());
tokenSessions.put(token, sessionData);
response.setContentType("application/json");
response.getWriter().write("{\"status\":\"success\",\"message\":\"Login
successful\"}");
} else {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("{\"status\":\"error\",\"message\":\"Invalid
credentials\"}");
}
}
if ("cookie".equals(sessionType)) {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}
} else {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("session_token".equals(cookie.getName())) {
tokenSessions.remove(cookie.getValue());
cookie.setMaxAge(0);
41
response.addCookie(cookie);
break;
}
}
}
}
response.getWriter().write("{\"status\":\"success\",\"message\":\"Logout
successful\"}");
}
private void checkSession(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String sessionType = request.getParameter("sessionType");
boolean isValid = false;
String username = null;
if ("cookie".equals(sessionType)) {
HttpSession session = request.getSession(false);
if (session != null) {
username = (String) session.getAttribute("username");
isValid = username != null;
}
} else {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("session_token".equals(cookie.getName())) {
SessionData sessionData = tokenSessions.get(cookie.getValue());
if (sessionData != null && !isSessionExpired(sessionData)) {
isValid = true;
username = sessionData.username;
}
break;
}
}
}
}
response.setContentType("application/json");
if (isValid) {
response.getWriter().write(
String.format("{\"status\":\"success\",\"authenticated\":true,\"username\":\"%s\"}",
username)
);
} else {
42
response.getWriter().write("{\"status\":\"success\",\"authenticated\":false}");
}
}
private boolean validateCredentials(String username, String password) {
// In production, implement proper authentication
return "demo".equals(username) && "password".equals(password);
}
private String generateToken() {
return UUID.randomUUID().toString();
}
private boolean isSessionExpired(SessionData sessionData) {
return System.currentTimeMillis() - sessionData.loginTime > 1800000; // 30 minutes
}
private static class SessionData {
final String username;
final long loginTime;
43
9. To implement an analysis of HTTP protocol evolution, comparing
HTTP/1.0, HTTP/1.1, and HTTP/2.
protocol-demo.html
<!DOCTYPE html>
<html>
<head>
<title>HTTP Protocol Evolution Demo</title>
<style>
.container {
margin: 20px;
padding: 20px;
border: 1px solid #ccc;
}
.result {
margin-top: 10px;
padding: 10px;
background-color: #f5f5f5;
border: 1px solid #ddd;
white-space: pre-wrap;
}
.timing {
color: #666;
font-style: italic;
}
</style>
</head>
<body>
<div class="container">
<h2>HTTP Protocol Evolution Demo</h2>
<div>
<h3>Protocol Tests</h3>
<button onclick="testProtocol('http1.0')">Test HTTP/1.0</button>
<button onclick="testProtocol('http1.1')">Test HTTP/1.1</button>
<button onclick="testProtocol('http2')">Test HTTP/2</button>
<button onclick="loadMultipleResources()">Load Multiple
Resources</button>
</div>
44
</div>
<script>
async function testProtocol(version) {
const startTime = performance.now();
try {
const response = await fetch(`/protocol/${version}`);
const text = await response.text();
document.getElementById('result').textContent =
`${text}\n\n${headerInfo}`;
showTiming(startTime);
} catch (error) {
document.getElementById('result').textContent =
`Error: ${error.message}`;
}
}
function showTiming(startTime) {
const duration = performance.now() - startTime;
document.getElementById('timing').textContent =
`Request completed in: ${duration.toFixed(2)}ms`;
}
</script>
45
</body>
</html>
HttpProtocolDemoServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/protocol/*")
public class HttpProtocolDemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String pathInfo = request.getPathInfo();
switch (pathInfo) {
case "/http1.0":
demonstrateHttp10(response);
break;
case "/http1.1":
demonstrateHttp11(response);
break;
case "/http2":
demonstrateHttp2(response);
break;
case "/resources":
handleMultipleResources(request, response);
break;
default:
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
46
private void demonstrateHttp10(HttpServletResponse response) throws
IOException {
// HTTP/1.0 characteristics
response.setHeader("Connection", "close"); // No keep-alive
response.setContentType("text/plain");
47
private void handleMultipleResources(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
String protocol = request.getProtocol();
List<String> resources = new ArrayList<>();
48
10.To implement virtual hosting to serve multiple websites on a single web
server.
VirtualHostManager.java
package com.example;
import java.util.HashMap;
import java.util.Map;
49
VirtualHostServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/vhost/*")
public class VirtualHostServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Get the server name from the request
String serverName = request.getServerName();
String pathInfo = request.getPathInfo();
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>" + host.getSiteName() + "</title>");
out.println("</head>");
out.println("<body>");
50
out.println("<h2>Available Virtual Hosts:</h2>");
out.println("<ul>");
out.println("<li><a href='http://site1.localhost:8080/vhost/'>Site 1</a></li>");
out.println("<li><a href='http://site2.localhost:8080/vhost/'>Site 2</a></li>");
out.println("<li><a href='http://site3.localhost:8080/vhost/'>Site 3</a></li>");
out.println("</ul>");
out.println("</body>");
out.println("</html>");
}
}
web.xml
51
virtual-hosts.properties
site2.localhost.name=Site 2
site2.localhost.docroot=/sites/site2
site3.localhost.name=Site 3
site3.localhost.docroot=/sites/site3
52
11. To implement content chunking and streaming using chunked transfer
encoding.
streaming.html
<!DOCTYPE html>
<html>
<head>
<style>
.container {
margin: 20px;
padding: 20px;
.output {
margin-top: 10px;
padding: 10px;
background-color: #f5f5f5;
border: 1px solid #ddd;
min-height: 200px;
white-space: pre-wrap;
.progress {
margin-top: 10px;
width: 100%;
height: 20px;
</style>
</head>
<body>
53
<div class="container">
<div>
<h3>Streaming Options</h3>
</div>
</div>
<script>
output.textContent = '';
try {
while (true) {
const {done, value} = await reader.read();
54
if (done) break;
output.textContent += decoder.decode(value);
}
} catch (error) {
let bytesReceived = 0;
try {
while (true) {
if (done) break;
bytesReceived += value.length;
}
} catch (error) {
55
output.textContent += '\nError: ' + error.message;
function startEventStream() {
output.textContent = '';
if (eventSource) {
eventSource.close();
eventSource.onmessage = function(event) {
};
eventSource.onerror = function(error) {
};
function stopEventStream() {
if (eventSource) {
eventSource.close();
eventSource = null;
}
}
56
</script>
</body>
</html>
StreamingServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.TimeUnit;
@WebServlet("/stream/*")
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
switch (pathInfo) {
case "/text":
streamTextContent(response);
break;
case "/data":
streamLargeData(response);
57
break;
case "/events":
streamServerEvents(response);
break;
default:
response.sendError(HttpServletResponse.SC_NOT_FOUND);
response.setContentType("text/plain");
response.setHeader("Transfer-Encoding", "chunked");
writer.flush();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
58
response.setContentType("application/octet-stream");
response.setHeader("Transfer-Encoding", "chunked");
response.getOutputStream().write(buffer);
response.getOutputStream().flush();
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Connection", "keep-alive");
59
PrintWriter writer = response.getWriter();
writer.flush();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
60
12. To implement secure web server communication by configuring HTTPS
with SSL/TLS and following best security practices.
secure-test.html
<!DOCTYPE html>
<html>
<head>
<title>HTTPS Security Test</title>
<style>
.container {
margin: 20px;
padding: 20px;
border: 1px solid #ccc;
}
.status {
margin-top: 10px;
padding: 10px;
background-color: #f5f5f5;
}
</style>
</head>
<body>
<div class="container">
<h2>HTTPS Security Test</h2>
<div>
<button onclick="checkSecureConnection()">Check Connection
Security</button>
<button onclick="testSecureEndpoint()">Test Secure Endpoint</button>
</div>
<script>
async function checkSecureConnection() {
const status = document.getElementById('status');
status.innerHTML = `
<p>Protocol: ${window.location.protocol}</p>
<p>TLS Version: ${await getTLSVersion()}</p>
<p>Security Headers: ${await checkSecurityHeaders()}</p>
`;
61
}
SecurityConfigServlet.java
package com.example;
62
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/secure/*")
public class SecurityConfigServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// Verify HTTPS is configured
if (!getServletContext().getServerInfo().toLowerCase().contains("ssl")) {
throw new ServletException("HTTPS is required for this application");
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Enforce HTTPS
if (!request.isSecure()) {
String httpsUrl = "https://" + request.getServerName() +
":" + request.getServerPort() + request.getRequestURI();
response.sendRedirect(httpsUrl);
return;
}
63
"default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';");
response.setHeader("Referrer-Policy", "strict-origin-when-cross-origin");
}
server.xml
web.xml
64
<security-constraint>
<web-resource-collection>
<web-resource-name>Secure Resources</web-resource-name>
<url-pattern>/secure/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
<session-config>
<cookie-config>
<secure>true</secure>
<http-only>true</http-only>
<same-site>Strict</same-site>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
</web-app>
bash
openssl req -newkey rsa:2048 -nodes -keyout private.key -x509 -days 365 -out
certificate.crt
bash
keytool -importcert -file certificate.crt -keystore keystore.jks -alias tomcat
65
13. To implement firewall configurations to control access to HTTP servers.
firewall.html
<!DOCTYPE html>
<html>
<head>
<title>Firewall Management</title>
<style>
.container {
margin: 20px;
padding: 20px;
.form-group {
margin: 10px 0;
.result {
margin-top: 10px;
padding: 10px;
background-color: #f5f5f5;
}
</style>
</head>
<body>
<div class="container">
<div class="form-group">
66
<input type="text" id="port" placeholder="Port">
<select id="protocol">
<option value="TCP">TCP</option>
<option value="UDP">UDP</option>
</select>
</div>
<div class="form-group">
<h3>Remove Rule</h3>
<div class="form-group">
<h3>Block IP Address</h3>
</div>
<div class="form-group">
<h3>Firewall Rules</h3>
</div>
<script>
67
async function addRule() {
try {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `ruleName=${ruleName}&port=${port}&protocol=${protocol}`
});
showResult(result.message);
} catch (error) {
try {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
68
body: `ruleName=${ruleName}`
});
showResult(result.message);
} catch (error) {
const ip = document.getElementById('ipAddress').value;
try {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `ip=${ip}`
});
showResult(result.message);
} catch (error) {
69
const response = await fetch('/firewall/list');
document.getElementById('result').innerHTML =
function showResult(message) {
document.getElementById('result').textContent = message;
}
</script>
</body>
</html>
FirewallManager.java
package com.example;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
70
"netsh advfirewall firewall add rule name=\"%s\" dir=in action=allow protocol=%s
localport=%s",
);
return executeCommand(command);
} catch (Exception e) {
try {
ruleName
);
return executeCommand(command);
} catch (Exception e) {
return false;
}
try {
71
ruleName, ipAddress
);
return executeCommand(command);
} catch (Exception e) {
System.err.println("Error blocking IP: " + e.getMessage());
return false;
String line;
if (line.startsWith("Rule Name:")) {
rules.add(line);
}
} catch (Exception e) {
return rules;
72
private boolean executeCommand(String command) throws Exception {
return process.waitFor() == 0;
}
}
FirewallServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/firewall/*")
@Override
switch (action) {
case "/add":
73
handleAddRule(request, response);
break;
case "/remove":
handleRemoveRule(request, response);
break;
case "/block":
handleBlockIp(request, response);
break;
default:
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
@Override
if ("/list".equals(request.getPathInfo())) {
listRules(response);
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
throws IOException {
74
boolean success = firewallManager.addHttpRule(ruleName, port, protocol);
throws IOException {
throws IOException {
response.setContentType("text/plain");
out.println(rule);
}
75
private void sendJsonResponse(HttpServletResponse response, String message) throws
IOException {
response.setContentType("application/json");
76
14. To implement HTTP proxies for request forwarding and management.
proxy-config.html
<!DOCTYPE html>
<html>
<head>
<title>Proxy Configuration</title>
<style>
.container {
margin: 20px;
padding: 20px;
border: 1px solid #ccc;
}
.form-group {
margin: 10px 0;
}
.status {
margin-top: 10px;
padding: 10px;
background-color: #f5f5f5;
}
</style>
</head>
<body>
<div class="container">
<h2>Proxy Server Configuration</h2>
<div class="form-group">
<h3>Add Target Server</h3>
<input type="text" id="serverUrl" placeholder="Server URL">
<button onclick="addServer()">Add Server</button>
</div>
<div class="form-group">
<h3>Block URL</h3>
<input type="text" id="blockUrl" placeholder="URL to block">
<button onclick="blockUrl()">Block URL</button>
</div>
<div class="form-group">
<h3>Test Proxy</h3>
<input type="text" id="testUrl" placeholder="URL to test">
77
<button onclick="testProxy()">Test</button>
</div>
<script>
async function addServer() {
const serverUrl = document.getElementById('serverUrl').value;
try {
const response = await fetch('/proxy/config/server', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: `url=${encodeURIComponent(serverUrl)}`
});
showStatus(await response.text());
} catch (error) {
showStatus('Error: ' + error.message);
}
}
78
showStatus(`Status: ${response.status} ${response.statusText}`);
} catch (error) {
showStatus('Error: ' + error.message);
}
}
function showStatus(message) {
document.getElementById('status').textContent = message;
}
</script>
</body>
</html>
ProxyServer.java
package com.example;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public ProxyServer() {
79
public void addTargetServer(String serverUrl) {
targetServers.add(serverUrl);
blockedUrls.add(url);
return targetServers.get(index);
}
return blockedUrls.stream().anyMatch(url::contains);
ProxyServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
80
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.util.Collections;
import java.util.Enumeration;
@WebServlet("/proxy/*")
public class ProxyServlet extends HttpServlet {
private ProxyServer proxyServer;
@Override
public void init() throws ServletException {
proxyServer = new ProxyServer();
// Add your target servers here
proxyServer.addTargetServer("http://localhost:8081");
proxyServer.addTargetServer("http://localhost:8082");
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
81
// Forward the response
forwardResponse(connection, response);
}
// Copy headers
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = request.getHeader(headerName);
connection.setRequestProperty(headerName, headerValue);
}
82
values.forEach(value -> response.setHeader(key, value));
}
});
83
15. To implement an analysis of browser functionality and the HTTP
request-response processing flow.
browser-analysis.html
<!DOCTYPE html>
<html>
<head>
<title>Browser and HTTP Analysis</title>
<style>
.container {
margin: 20px;
padding: 20px;
border: 1px solid #ccc;
}
.analysis-section {
margin: 15px 0;
padding: 10px;
background-color: #f5f5f5;
}
.request-info {
font-family: monospace;
white-space: pre-wrap;
}
.timing-info {
color: #666;
font-style: italic;
}
</style>
</head>
<body>
<div class="container">
<h2>Browser and HTTP Analysis Tool</h2>
<div class="analysis-section">
<h3>Request Analysis</h3>
<button onclick="analyzeGet()">Analyze GET Request</button>
<button onclick="analyzePost()">Analyze POST Request</button>
<button onclick="analyzeAjax()">Analyze AJAX Request</button>
<button onclick="analyzeHeaders()">Analyze Headers</button>
</div>
<div class="analysis-section">
84
<h3>Performance Analysis</h3>
<button onclick="analyzeLoadTime()">Analyze Load Time</button>
<button onclick="analyzeResources()">Analyze Resource Loading</button>
</div>
<script>
async function analyzeGet() {
const startTime = performance.now();
try {
const response = await fetch('/analyze/get');
const html = await response.text();
showResult(html, startTime);
} catch (error) {
showError(error);
}
}
85
'X-Requested-With': 'XMLHttpRequest'
}
});
const html = await response.text();
showResult(html, startTime);
} catch (error) {
showError(error);
}
}
function analyzeLoadTime() {
const timing = window.performance.timing;
const result = {
'DNS Lookup': timing.domainLookupEnd - timing.domainLookupStart,
'TCP Connection': timing.connectEnd - timing.connectStart,
'Request Time': timing.responseStart - timing.requestStart,
'Response Time': timing.responseEnd - timing.responseStart,
'DOM Processing': timing.domComplete - timing.domLoading,
'Total Time': timing.loadEventEnd - timing.navigationStart
};
showResult(JSON.stringify(result, null, 2));
}
function analyzeResources() {
const resources = window.performance.getEntriesByType('resource');
const analysis = resources.map(resource => ({
name: resource.name,
type: resource.initiatorType,
duration: Math.round(resource.duration),
86
size: resource.transferSize
}));
showResult(JSON.stringify(analysis, null, 2));
}
function showError(error) {
document.getElementById('result').innerHTML =
`<div style="color: red">Error: ${error.message}</div>`;
}
</script>
</body>
</html>
BrowserAnalyzerServlet.java
package com.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet("/analyze/*")
public class BrowserAnalyzerServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
analyzeRequest(request, response);
}
87
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
analyzeRequest(request, response);
}
// Browser Information
out.println("<h3>Browser Information</h3>");
String userAgent = request.getHeader("User-Agent");
out.println("User Agent: " + userAgent + "<br>");
out.println("Accept Types: " + request.getHeader("Accept") + "<br>");
out.println("Accept Language: " + request.getHeader("Accept-Language") +
"<br>");
out.println("Accept Encoding: " + request.getHeader("Accept-Encoding") +
"<br>");
// Request Details
out.println("<h3>Request Details</h3>");
out.println("Method: " + request.getMethod() + "<br>");
out.println("Protocol: " + request.getProtocol() + "<br>");
out.println("Scheme: " + request.getScheme() + "<br>");
out.println("Server Name: " + request.getServerName() + "<br>");
out.println("Server Port: " + request.getServerPort() + "<br>");
out.println("Request URI: " + request.getRequestURI() + "<br>");
out.println("Query String: " + request.getQueryString() + "<br>");
// Request Headers
out.println("<h3>Request Headers</h3>");
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
out.println(headerName + ": " + request.getHeader(headerName) + "<br>");
}
88
// Client Capabilities
out.println("<h3>Client Capabilities</h3>");
out.println("Cookies Enabled: " + (request.getCookies() != null) + "<br>");
out.println("Session ID: " + request.getRequestedSessionId() + "<br>");
}
}
89
16. To implement the design of a basic web page using HTML, CSS, and
JavaScript to manipulate page elements dynamically.
Index.html
<!DOCTYPE html>
<html>
<head>
<title>Dynamic Web Page</title>
<style>
/* Basic styling */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f0f0f0;
}
.container {
max-width: 800px;
margin: 0 auto;
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.header {
text-align: center;
margin-bottom: 30px;
}
.content-section {
margin: 20px 0;
padding: 15px;
border: 1px solid #ddd;
border-radius: 4px;
}
.button {
background-color: #4CAF50;
color: white;
padding: 10px 20px;
90
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
.button:hover {
background-color: #45a049;
}
.input-field {
width: 100%;
padding: 8px;
margin: 8px 0;
border: 1px solid #ddd;
border-radius: 4px;
box-sizing: border-box;
}
.theme-dark {
background-color: #333;
color: white;
}
/* Responsive design */
@media (max-width: 600px) {
.container {
padding: 10px;
}
.button {
width: 100%;
margin-bottom: 10px;
}
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>Dynamic Web Page</h1>
<button class="button" onclick="toggleTheme()">Toggle Theme</button>
</div>
91
<div class="content-section">
<h2>Add Content</h2>
<input type="text" id="contentInput" class="input-field" placeholder="Enter
content">
<button class="button" onclick="addContent()">Add</button>
</div>
<div class="content-section">
<h2>Dynamic List</h2>
<ul id="dynamicList"></ul>
</div>
<div class="content-section">
<h2>Interactive Form</h2>
<form id="userForm" onsubmit="handleSubmit(event)">
<input type="text" class="input-field" id="nameInput" placeholder="Name"
required>
<input type="email" class="input-field" id="emailInput" placeholder="Email"
required>
<button type="submit" class="button">Submit</button>
</form>
</div>
<div class="content-section">
<h2>User Information</h2>
<div id="userInfo"></div>
</div>
</div>
<script>
// Theme toggle functionality
function toggleTheme() {
const container = document.querySelector('.container');
container.classList.toggle('theme-dark');
}
92
const listItem = document.createElement('li');
listItem.textContent = input.value;
listItem.appendChild(deleteButton);
list.appendChild(listItem);
input.value = '';
}
}
// Clear form
event.target.reset();
}
// Initial setup
window.onload = function() {
// Add some sample content
93
const list = document.getElementById('dynamicList');
['Item 1', 'Item 2', 'Item 3'].forEach(text => {
const li = document.createElement('li');
li.textContent = text;
list.appendChild(li);
});
};
</script>
</body>
</html>
94
17.To implement client-side form validation using JavaScript for real-time
user input validation.
form-validation.html
<!DOCTYPE html>
<html>
<head>
<title>Form Validation</title>
<style>
.form-container {
max-width: 500px;
margin: 30px auto;
padding: 20px;
border: 1px solid #ddd;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.form-group {
margin-bottom: 15px;
}
.form-group label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
.form-group input {
width: 100%;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
box-sizing: border-box;
}
95
.error {
color: #dc3545;
font-size: 0.85em;
margin-top: 5px;
display: none;
}
.invalid {
border-color: #dc3545;
}
.valid {
border-color: #28a745;
}
.submit-button {
background-color: #007bff;
color: white;
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.submit-button:disabled {
background-color: #ccc;
cursor: not-allowed;
}
.password-strength {
height: 5px;
margin-top: 5px;
background-color: #eee;
border-radius: 2px;
}
96
.strength-medium { background-color: #ffc107; width: 66%; }
.strength-strong { background-color: #28a745; width: 100%; }
</style>
</head>
<body>
<div class="form-container">
<h2>Registration Form</h2>
<form id="registrationForm" novalidate>
<div class="form-group">
<label for="username">Username</label>
<input type="text" id="username" name="username" required
pattern="^[a-zA-Z0-9_]{4,20}$">
<div id="usernameError" class="error">
Username must be 4-20 characters and contain only letters,
numbers, and underscores
</div>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" name="email" required>
<div id="emailError" class="error">
Please enter a valid email address
</div>
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" id="password" name="password"
required>
<div class="password-strength" id="passwordStrength"></div>
<div id="passwordError" class="error">
Password must be at least 8 characters with letters, numbers,
and symbols
</div>
</div>
97
<div class="form-group">
<label for="confirmPassword">Confirm Password</label>
<input type="password" id="confirmPassword"
name="confirmPassword" required>
<div id="confirmPasswordError" class="error">
Passwords do not match
</div>
</div>
<div class="form-group">
<label for="phone">Phone Number</label>
<input type="tel" id="phone" name="phone" required
pattern="^\+?[\d\s-]{10,}$">
<div id="phoneError" class="error">
Please enter a valid phone number
</div>
</div>
<script>
const form = document.getElementById('registrationForm');
const submitButton = form.querySelector('button[type="submit"]');
const inputs = form.querySelectorAll('input');
// Real-time validation
inputs.forEach(input => {
input.addEventListener('input', () => {
validateInput(input);
checkFormValidity();
});
input.addEventListener('blur', () => {
validateInput(input);
98
});
});
function validateInput(input) {
const errorElement = document.getElementById(`${input.id}Error`);
let isValid = true;
case 'email':
if (!input.value.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {
showError(input, errorElement);
isValid = false;
}
break;
case 'password':
const strength = checkPasswordStrength(input.value);
updatePasswordStrength(strength);
if (strength === 'weak') {
99
showError(input, errorElement);
isValid = false;
}
validateConfirmPassword();
break;
case 'confirmPassword':
if (input.value !==
document.getElementById('password').value) {
showError(input, errorElement);
isValid = false;
}
break;
case 'phone':
if (!input.value.match(/^\+?[\d\s-]{10,}$/)) {
showError(input, errorElement);
isValid = false;
}
break;
}
if (isValid) {
input.classList.add('valid');
}
return isValid;
}
100
function checkPasswordStrength(password) {
const hasLetters = /[a-zA-Z]/.test(password);
const hasNumbers = /\d/.test(password);
const hasSymbols = /[^a-zA-Z\d]/.test(password);
const isLongEnough = password.length >= 8;
function updatePasswordStrength(strength) {
const strengthBar = document.getElementById('passwordStrength');
strengthBar.className = 'password-strength';
if (strength !== 'weak') {
strengthBar.classList.add(`strength-${strength}`);
}
}
function validateConfirmPassword() {
const confirmPassword =
document.getElementById('confirmPassword');
if (confirmPassword.value) {
validateInput(confirmPassword);
}
}
function checkFormValidity() {
let isValid = true;
inputs.forEach(input => {
if (!validateInput(input)) {
isValid = false;
}
101
});
submitButton.disabled = !isValid;
}
102
18. To implement image rollover effects using JavaScript for interactive
user experiences.
image-rollover.html
<!DOCTYPE html>
<html>
<head>
<style>
.gallery {
display: flex;
flex-wrap: wrap;
gap: 20px;
padding: 20px;
justify-content: center;
.image-container {
position: relative;
width: 300px;
height: 200px;
overflow: hidden;
border-radius: 8px;
cursor: pointer;
.image-container img {
width: 100%;
height: 100%;
object-fit: cover;
103
transition: transform 0.3s ease, filter 0.3s ease;
.overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
color: white;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
.image-container:hover img {
transform: scale(1.1);
.image-container:hover .overlay {
opacity: 1;
.zoom-effect img:hover {
transform: scale(1.2);
}
104
.blur-effect img:hover {
filter: blur(3px);
.grayscale-effect img:hover {
filter: grayscale(100%);
.brightness-effect img:hover {
filter: brightness(150%);
}
.controls {
text-align: center;
margin: 20px;
.control-button {
padding: 8px 16px;
margin: 0 5px;
border: none;
border-radius: 4px;
background-color: #007bff;
color: white;
cursor: pointer;
}
.control-button:hover {
105
background-color: #0056b3;
</style>
</head>
<body>
<div class="controls">
</div>
<div class="image-container">
<img src="https://picsum.photos/300/200?1" alt="Sample Image 1">
</div>
<div class="image-container">
</div>
<div class="image-container">
<img src="https://picsum.photos/300/200?3" alt="Sample Image 3">
</div>
<div class="image-container">
106
</div>
</div>
<script>
const gallery = document.getElementById('imageGallery');
function setEffect(effect) {
containers.forEach(container => {
container.className = 'image-container';
if (effect) {
container.classList.add(`${effect}-effect`);
}
});
containers.forEach(container => {
});
107
img.style.transform = '';
});
});
containers.forEach(container => {
img.style.transform = 'scale(1.1)';
});
img.style.transform = '';
});
});
containers[currentFocus].focus();
}
});
108
// Add lazy loading
const imageOptions = {
threshold: 0.5,
rootMargin: '0px 0px 50px 0px'
};
entries.forEach(entry => {
if (entry.isIntersecting) {
if (img.dataset.src) {
img.src = img.dataset.src;
img.removeAttribute('data-src');
observer.unobserve(img);
});
}, imageOptions);
</body>
</html>
109
19. To implement JSON data parsing and manipulation using JavaScript.
json-parser.html
<!DOCTYPE html>
<html>
<head>
<title>JSON Parser and Manipulator</title>
<style>
.container {
max-width: 800px;
margin: 20px auto;
padding: 20px;
font-family: Arial, sans-serif;
}
.json-input {
width: 100%;
height: 200px;
margin: 10px 0;
font-family: monospace;
}
.result {
background-color: #f5f5f5;
padding: 15px;
border-radius: 4px;
margin-top: 10px;
white-space: pre-wrap;
font-family: monospace;
}
.error {
color: #dc3545;
margin-top: 10px;
}
110
.button-group {
margin: 10px 0;
}
button {
padding: 8px 16px;
margin-right: 8px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
</style>
</head>
<body>
<div class="container">
<h2>JSON Parser and Manipulator</h2>
<div>
<textarea id="jsonInput" class="json-input" placeholder="Enter
JSON data here..."></textarea>
</div>
<div class="button-group">
<button onclick="parseJSON()">Parse JSON</button>
<button onclick="formatJSON()">Format JSON</button>
<button onclick="validateJSON()">Validate JSON</button>
<button onclick="transformJSON()">Transform Data</button>
</div>
<div>
<h3>Result:</h3>
111
<div id="result" class="result"></div>
</div>
</div>
<script>
function parseJSON() {
const input = document.getElementById('jsonInput').value;
const resultDiv = document.getElementById('result');
try {
const parsed = JSON.parse(input);
displayResult(parsed);
} catch (error) {
showError('Invalid JSON: ' + error.message);
}
}
function formatJSON() {
const input = document.getElementById('jsonInput').value;
try {
const parsed = JSON.parse(input);
const formatted = JSON.stringify(parsed, null, 2);
document.getElementById('jsonInput').value = formatted;
displayResult('JSON formatted successfully');
} catch (error) {
showError('Invalid JSON: ' + error.message);
}
}
function validateJSON() {
const input = document.getElementById('jsonInput').value;
try {
JSON.parse(input);
displayResult('JSON is valid');
112
// Additional validation checks
const validation = validateJSONStructure(input);
if (validation.issues.length > 0) {
displayResult('Validation Issues:\n' +
validation.issues.join('\n'));
}
} catch (error) {
showError('Invalid JSON: ' + error.message);
}
}
function transformJSON() {
const input = document.getElementById('jsonInput').value;
try {
const data = JSON.parse(input);
const transformed = transformData(data);
displayResult(transformed);
} catch (error) {
showError('Transformation error: ' + error.message);
}
}
function validateJSONStructure(jsonString) {
const result = {
issues: []
};
try {
const obj = JSON.parse(jsonString);
113
function checkNulls(obj) {
for (let key in obj) {
if (obj[key] === null) {
result.issues.push(`Warning: Null value found for key
"${key}"`);
} else if (typeof obj[key] === 'object') {
checkNulls(obj[key]);
}
}
}
checkNulls(obj);
} catch (error) {
result.issues.push('Error: ' + error.message);
}
return result;
}
function transformData(data) {
if (Array.isArray(data)) {
return transformArray(data);
} else if (typeof data === 'object') {
return transformObject(data);
}
return data;
114
}
function transformArray(arr) {
return {
type: 'array',
length: arr.length,
items: arr.map(item => transformData(item)),
summary: {
numbers: arr.filter(item => typeof item === 'number').length,
strings: arr.filter(item => typeof item === 'string').length,
objects: arr.filter(item => typeof item === 'object' && item !==
null).length
}
};
}
function transformObject(obj) {
const transformed = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
transformed[key] = {
value: obj[key],
type: typeof obj[key],
nested: typeof obj[key] === 'object' && obj[key] !== null
};
}
}
return transformed;
}
function displayResult(data) {
const resultDiv = document.getElementById('result');
resultDiv.className = 'result';
resultDiv.textContent = typeof data === 'string' ?
data : JSON.stringify(data, null, 2);
}
115
function showError(message) {
const resultDiv = document.getElementById('result');
resultDiv.className = 'result error';
resultDiv.textContent = message;
}
116
20. implement styling and layout control of web pages using Cascading
Style Sheets (CSS).
styles-demo.html
<!DOCTYPE html>
<html>
<head>
<title>CSS Styling Demo</title>
<style>
/* Reset and base styles */
*{
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Arial, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f4f4f4;
}
/* Layout containers */
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
/* Grid layout */
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
margin: 20px 0;
}
.grid-item {
background: white;
padding: 20px;
117
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
transition: transform 0.3s ease;
}
.grid-item:hover {
transform: translateY(-5px);
}
/* Flexbox layout */
.flex-container {
display: flex;
flex-wrap: wrap;
gap: 15px;
margin: 20px 0;
}
.flex-item {
flex: 1 1 200px;
padding: 15px;
background: white;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
/* Navigation */
.nav {
background: #333;
padding: 1rem;
position: sticky;
top: 0;
z-index: 100;
}
.nav ul {
display: flex;
justify-content: center;
list-style: none;
gap: 20px;
}
.nav a {
color: white;
118
text-decoration: none;
padding: 5px 10px;
border-radius: 4px;
transition: background-color 0.3s;
}
.nav a:hover {
background-color: #555;
}
/* Cards */
.card {
background: white;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
.card-image {
width: 100%;
height: 200px;
object-fit: cover;
}
.card-content {
padding: 20px;
}
/* Buttons */
.button {
display: inline-block;
padding: 10px 20px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s;
}
.button:hover {
background-color: #0056b3;
}
119
/* Form styles */
.form-group {
margin-bottom: 15px;
}
.form-group label {
display: block;
margin-bottom: 5px;
}
.form-group input,
.form-group textarea {
width: 100%;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
}
/* Animations */
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.animate-fade {
animation: fadeIn 0.5s ease-in;
}
/* Media Queries */
@media (max-width: 768px) {
.nav ul {
flex-direction: column;
align-items: center;
}
.grid-container {
grid-template-columns: 1fr;
}
}
/* Custom Properties */
:root {
120
--primary-color: #007bff;
--secondary-color: #6c757d;
--success-color: #28a745;
--danger-color: #dc3545;
}
/* Utility Classes */
.text-center { text-align: center; }
.mt-2 { margin-top: 2rem; }
.mb-2 { margin-bottom: 2rem; }
.p-2 { padding: 2rem; }
</style>
</head>
<body>
<nav class="nav">
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="#services">Services</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
<div class="container">
<h1 class="text-center mt-2 mb-2">CSS Styling Demo</h1>
<div class="grid-container">
<div class="grid-item animate-fade">
<h2>Grid Item 1</h2>
<p>This demonstrates grid layout and animations.</p>
</div>
<div class="grid-item animate-fade">
<h2>Grid Item 2</h2>
<p>Responsive grid with auto-fit.</p>
</div>
<div class="grid-item animate-fade">
<h2>Grid Item 3</h2>
<p>Hover effects and transitions.</p>
</div>
</div>
<div class="flex-container">
<div class="card">
121
<img src="https://picsum.photos/300/200" alt="Sample" class="card-image">
<div class="card-content">
<h3>Card Title</h3>
<p>Card description with flexbox layout.</p>
<button class="button mt-2">Learn More</button>
</div>
</div>
<div class="card">
<img src="https://picsum.photos/300/201" alt="Sample" class="card-image">
<div class="card-content">
<h3>Card Title</h3>
<p>Responsive card design.</p>
<button class="button mt-2">Learn More</button>
</div>
</div>
</div>
<form class="p-2">
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" required>
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" id="email" required>
</div>
<div class="form-group">
<label for="message">Message</label>
<textarea id="message" rows="4"></textarea>
</div>
<button type="submit" class="button">Submit</button>
</form>
</div>
</body>
</html>
122