<% CreateServletTemplateModel model = (CreateServletTemplateModel) argument;
model.removeFlags(CreateWebClassTemplateModel.FLAG_QUALIFIED_SUPERCLASS_NAME); 
if (model.getJavaPackageName()!=null && model.getJavaPackageName()!="") { %>package <%=model.getJavaPackageName()%>;<%}%>

<% Collection<String> imports = model.getImports();
for (String anImport : imports) { %>
import <%=anImport%>;
<% } %>

/**
 * Servlet implementation class for Servlet: <%=model.getClassName()%>
 *
<% if (model.isAnnotated()) { %>
 * @web.servlet
 *   name="<%=model.getServletName()%>"
 *   display-name="<%=model.getServletName()%>"<%
 if (model.getDescription() != null && model.getDescription() != "") { %>
 *   description="<%=model.getDescription()%>"<% } %>
 *<% List mappings = model.getServletMappings();
 if (mappings != null && mappings.size() > 0) {
      for (int i = 0; i < mappings.size(); i++) {
      	 String map = model.getServletMapping(i); %>
 * @web.servlet-mapping
 *   url-pattern="<%=map%>"
 *<% } }
 List initParams = model.getInitParams();
 if (initParams != null && initParams.size() > 0) {
    for (int i = 0; i < initParams.size(); i++) {
      String name = model.getInitParam(i, CreateServletTemplateModel.NAME);
      String value = model.getInitParam(i, CreateServletTemplateModel.VALUE);
      String description = model.getInitParam(i, CreateServletTemplateModel.DESCRIPTION); %>
 * @web.servlet-init-param
 *    name="<%=name%>"
 *    value="<%=value%>"<% if (description != null && description != "") { %>
 *    description="<%=description%>"<%} %>
 *<% } } } %>
 */