diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java b/jee7/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java
new file mode 100644
index 0000000000..e3f1667595
--- /dev/null
+++ b/jee7/src/main/java/com/baeldung/javaeeannotations/AccountServlet.java
@@ -0,0 +1,57 @@
+package com.baeldung.javaeeannotations;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.annotation.HttpConstraint;
+import javax.servlet.annotation.HttpMethodConstraint;
+import javax.servlet.annotation.ServletSecurity;
+import javax.servlet.annotation.WebInitParam;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@WebServlet(
+ name = "BankAccountServlet",
+ description = "Represents a Bank Account and it's transactions",
+ urlPatterns = {"/account", "/bankAccount" },
+ initParams = { @WebInitParam(name = "type", value = "savings") }
+ )
+@ServletSecurity(
+ value = @HttpConstraint(rolesAllowed = {"admin"}),
+ httpMethodConstraints = {@HttpMethodConstraint(value = "POST", rolesAllowed = {"admin"})}
+ )
+public class AccountServlet extends javax.servlet.http.HttpServlet {
+
+ String accountType = null;
+
+ @Override
+ public void init(ServletConfig config) throws ServletException {
+ accountType = config.getInitParameter("type");
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ PrintWriter writer = response.getWriter();
+ writer.println("Hello, I am an AccountServlet!");
+ writer.flush();
+ }
+
+ public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
+ double accountBalance = 1000d;
+ double interestRate = Double.parseDouble(request.getAttribute("interest").toString());
+
+ String paramDepositAmt = request.getParameter("dep");
+ double depositAmt = Double.parseDouble(paramDepositAmt);
+
+ accountBalance = accountBalance + depositAmt;
+
+ PrintWriter writer = response.getWriter();
+ writer.println(" Balance of " + accountType + " account is: " +
+ accountBalance + "
This account bares an interest rate of " + interestRate +
+ " % ");
+ writer.flush();
+
+ }
+}
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java b/jee7/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java
new file mode 100644
index 0000000000..6b43dd8a84
--- /dev/null
+++ b/jee7/src/main/java/com/baeldung/javaeeannotations/BankAppServletContextListener.java
@@ -0,0 +1,17 @@
+package com.baeldung.javaeeannotations;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+
+@WebListener
+public class BankAppServletContextListener implements ServletContextListener {
+
+ public void contextInitialized(ServletContextEvent sce) {
+ sce.getServletContext().setAttribute("ATTR_DEFAULT_LANGUAGE", "english");
+ }
+
+ public void contextDestroyed(ServletContextEvent sce) {
+ System.out.println("CONTEXT DESTROYED");
+ }
+}
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/LoggingFilter.java b/jee7/src/main/java/com/baeldung/javaeeannotations/LoggingFilter.java
new file mode 100644
index 0000000000..97de5ec0de
--- /dev/null
+++ b/jee7/src/main/java/com/baeldung/javaeeannotations/LoggingFilter.java
@@ -0,0 +1,36 @@
+package com.baeldung.javaeeannotations;
+
+import java.io.IOException;
+
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@WebFilter(
+ urlPatterns = "/bankAccount/*",
+ filterName = "LoggingFilter",
+ description = "Filter all account transaction URLs"
+ )
+public class LoggingFilter implements javax.servlet.Filter {
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ HttpServletRequest req = (HttpServletRequest) request;
+ HttpServletResponse res = (HttpServletResponse) response;
+
+ res.sendRedirect(req.getContextPath() + "/login.jsp");
+ chain.doFilter(request, response);
+ }
+
+ @Override
+ public void destroy() {
+ }
+
+}
diff --git a/jee7/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java b/jee7/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java
new file mode 100644
index 0000000000..8a6c709b81
--- /dev/null
+++ b/jee7/src/main/java/com/baeldung/javaeeannotations/UploadCustomerDocumentsServlet.java
@@ -0,0 +1,29 @@
+package com.baeldung.javaeeannotations;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.annotation.MultipartConfig;
+import javax.servlet.annotation.WebServlet;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.Part;
+
+@WebServlet(urlPatterns = { "/uploadCustDocs" })
+@MultipartConfig(
+ fileSizeThreshold = 1024 * 1024 * 20,
+ maxFileSize = 1024 * 1024 * 20,
+ maxRequestSize = 1024 * 1024 * 25,
+ location = "D:/custDocs"
+ )
+public class UploadCustomerDocumentsServlet extends HttpServlet {
+
+ protected void doPost(
+ HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ for (Part part : request.getParts()) {
+ part.write("myFile");
+ }
+ }
+
+}
diff --git a/jee7/src/main/webapp/WEB-INF/web.xml b/jee7/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000000..0a3d84d2d4
--- /dev/null
+++ b/jee7/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,11 @@
+