/**
 * Servlet implementation class <%= model.getClassName() %>
<% 
	if (model.isAnnotated()) { 
%>
 *
 * @web.servlet
 *   name="<%= model.getServletName() %>"
 *   display-name="<%= model.getServletName() %>"
<% 
		if (model.getDescription() != null && model.getDescription().length() > 0) { 
%>
 *   description="<%= model.getDescription() %>"
<% 
		} 
		
		List<String[]> 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<String[]> 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.length() > 0) { 
%>
 *    description="<%= description %>"
<%
				}
			} 
		} 
	} 
%>
 */