技术开发 频道

Servlet 3.0 先睹为快

  二、Servlet中的注释

  Servlet 3.0中的重大革新之一是支持注释。通过使用注释定义Servlet和过滤器,就无需在web部署描述符(web.xml)中建立Servlet/过滤器条目了。

  @WebServlet

  为了在web应用中定义Servlet组件,我们可以使用@WebServlet。我们可以将其用于继承类javax.servlet.http.HttpServlet的类。注释@WebServlet具有许多属性。例如name、urlPatterns和initParams,我们可以通过它们来定义Servlet的行为。对于url模式,我们必须规定注释本身,或者规定注释的属性。

  我们可以利用@WebServlet定义一个简单的Servlet,如下所示:

@WebServlet(name = "GetQuoteServlet",  urlPatterns = {"/getquote"} )
public class GetQuoteServlet extends HttpServlet {
    @Override
    
protected void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        PrintWriter out
= response.getWriter();
        
try {
            String symbol
= request.getParameter("symbol");
            out.println(
"<h1>Stock Price is</h1>" + StockQuoteBean.getPrice(symbol);
        }
finally {
            out.close();
        }
    }
}

public class StockQuoteBean {
private StockQuoteServiceEntity serviceEntity = new StockQuoteServiceEntity();
    
public double getPrice(String symbol) {
        
if(symbol !=null )  {
return serviceEntity.getPrice(symbol);
         }
else {
            
return 0.0;
        }
    }
}

  我们可以修改这个Servlet,让它使用注释属性处理来自多个url的请求。

@WebServlet(name = "GetQuoteServlet",  urlPatterns = {"/getquote",  "/stockquote"} )
public class GetQuoteServlet extends HttpServlet {
    @Override
    
protected void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        PrintWriter out
= response.getWriter();
        
try {
            String symbol
= request.getParameter("symbol");
            out.println(
"<h1>Stock Price is</h1>" + StockQuoteBean.getPrice(symbol);
        }
finally {
            out.close();
        }
    }
}

  @WebFilter

  我们可以使用注释@WebFilter来定义过滤器。这个注释还具有可选参数。我们可以在任何实现了javax.servlet.Filter接口的类上使用@WebFilter。类似于@WebServlet注释,我们也必须为这个注释指定url模式。

@WebFilter(filterName = "AuthenticateFilter", urlPatterns = {"/stock.jsp", "/getquote"})
public class AuthenticateFilter implements Filter {

    
public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain)    
throws IOException, ServletException {
        String username
= ((HttpServletRequest) request).getParameter("uname");
        String password
= ((HttpServletRequest) request).getParameter("password");
          
if (username == null || password == null) {
                 ((HttpServletResponse) response).sendRedirect(
"index.jsp");            }
if (username.equals("admin") && password.equals("admin")) {
                chain.doFilter(request, response);      }
else {
                ((HttpServletResponse) response).sendRedirect(
"index.jsp");         }
         }

    
public void destroy() {
    }
    
public void init(FilterConfig filterConfig) {
    }
}

  @WebInitParam

  我们可以使用注释@WebInitParam把init参数指定为Servlet或者过滤器。另外,我们还可以使用注释@WebFilter和@WebServlet 的initParam属性来规定init参数。

@WebServlet(name = "GetQuoteServlet", urlPatterns = {"/getquote"})
@WebInitParam(name
= "default_market", value = "NASDAQ")
public class GetQuoteServlet extends HttpServlet {
    @Override
    
protected void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        response.setContentType(
"text/html;charset=UTF-8");
        PrintWriter out
= response.getWriter();
        
try {
            String market
= getInitParameter("default_market");
            String symbol
= request.getParameter("symbol");
            out.println(
"<h1>Stock Price in " + market + " is</h1>" + StockQuoteBean.getPrice(symbol, market));
        }
finally {
            out.close();
        }
    }
}

  下面是一个将注释@WebInitParam用作@WebServlet和@WebFilter initParams 属性的一部分的例子:

@WebServlet(name = "GetQuoteServlet",
            urlPatterns
= {"/getquote"},
            initParams
={@WebInitParam(name="default_market",  value="NASDAQ")}
           )
public class GetQuoteServlet extends HttpServlet {
    @Override
    
protected void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        response.setContentType(
"text/html;charset=UTF-8");
        PrintWriter out
= response.getWriter();
        
try {
            String market
= getInitParameter("default_market");
            String symbol
= request.getParameter("symbol");
            out.println(
"<h1>Stock Price in " + market + " is</h1>" + StockQuoteBean.getPrice(symbol, market));
        }
finally {
            out.close();
        }
    }
}

  @WebListener

  我们可以将注释@WebListener用于充当给定web应用上下文中各种web应用事件的监听器的类。我们可以使用@WebListener来标注一个实现ServletContextListener、ServletContextAttributeListener、ServletRequestListener、ServletRequestAttributeListener、HttpSessionListener和HttpSessionAttributeListener的类。下面是一个使用ServletContextListener的例子:

@WebListener
public class QuoteServletContextListener implements ServletContextListener {
  
public void contextInitialized(ServletContextEvent sce) {
   ServletContext context
= sce.getServletContext();
context.setInitParameter(“default_market”, “NASDAQ”);
}
public void contextDestroyed(ServletContextEvent sce) {
}
}

  @MultipartConfig

  使用注释@MultipartConfig可以为Servlet指定多部分组成的MIME类型请求。MIME附件是从该请求对象中读取的。

0
相关文章