You can connect browser, HTTP, servlet, service, repository, and database layers; justify design trade-offs; and verify one vertical feature across success and failure. Readiness: bring your artifacts from Labs 04, 08, 13, 14, and 15.
Build a small Course Planner: list courses, view one course, create a draft course, and search by code/title. This is an instructional application, not a production university system. It must not contain real student data.
flowchart TB
UI[Semantic HTML + responsive CSS] --> JS[Optional JavaScript enhancement]
JS --> HTTP[HTTP contract]
HTTP --> CTL[Servlet controller]
CTL --> APP[Application service]
APP --> REP[JDBC repository]
REP --> DB[(Course database)]
APP --> CTL
CTL --> HTTP
For POST /courses: accessible form -> client feedback -> server content-type/size/input validation -> authorization assumption -> application use case -> transaction -> prepared insert -> duplicate detection -> 201 Location or mapped error -> UI success/error state -> sanitized log. Every arrow has a contract and a failure mode.
Where should “course code must be unique” live? Hint 1: browser check can race. Hint 2: invariant must hold under concurrent requests. Solution: enforce with a database unique constraint, interpret the conflict in repository/service, and return a safe conflict response; client-side availability feedback is optional assistance.
Implement one complete vertical slice and demonstrate: browser interaction, raw request/response, controller, service, repository, database change, and reload. Then inject three failures. If the environment cannot run the stack, produce a compilable/reviewable project and mark each unexecuted check; do not claim a live app.
Given a bug where two users create the same code, name one insufficient fix and the durable control. Answer: disabling the button/client check is insufficient; a database uniqueness constraint plus conflict handling is durable.
Complete the Course Planner and a five-minute defense. Full specification and 100-mark rubric are in ../projects/integrated-project.md. Submit architecture, contracts, source, schema, test evidence, security review, and known limitations.
Explain the system from the user’s action to stored data and back. At every boundary ask: what enters, who trusts it, what can fail, and how is that failure represented?