Локальная переменная должна звучать вне цикла while, потому что вам нужно это значение после цикла while.
<%
try {
dbConnect dbConnect = new dbConnect();
Connection currentCon = dbConnect.Connect();
System.out.println("Connection sucess");
String sql = "SELECT * FROM categories";
PreparedStatement ps = currentCon.prepareStatement(sql);
ResultSet rs = ps.executeQuery();%>
String cname = null;
String id = null;
<td><select name="category" class="form-control" required>
<%
while (rs.next()) {
cname = rs.getString("category_name");
id = rs.getString("category_id");
System.out.println(id);
%>
Кроме того, я предлагаю вам использовать язык выражений вместо <%= id%>
изменить <option value="<%= id%>"><%= cname%></option>
на
<option value="${id}">${name}</option>
И не забудьте кнопку отправки.