`

Servlet 3.0(收藏)

    博客分类:
  • j2ee
阅读更多
                                    Servlet 3.0 先睹为快 发布者:IT168  


【内容导航】

    * 第1页:Servlet 3.0新特性简述
    * 第2页:Servlet中的注释
    * 第3页:元数据和通用注释
    * 第4页:针对Web框架的可插性

    * 第5页:Servlet中的异步处理
    * 第6页:现有API的改进及小结
    *

展开全部

  二、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附件是从该请求对象中读取的。

三、元数据和通用注释

  除了上面描述的特定于Servlet的注释之外,Servlet 3.0还支持所有定义为JSR 175(Java元数据规范)和JSR 250(用于Java平台通用注释) 的一部分的注释,包括:

    * 与安全有关的注释,诸如@DeclareRoles 和@RolesAllowed
    * 使用EJB的注释,诸如@EJB和@EJBs
    * 用于资源注入的注释,诸如@resource和@Resources
    * 使用JPA的注释,诸如@PersistenceContext、@PersistenceContexts、@PersistenceUnit和@PersistenceUnits
    * 生命周期注释,诸如@PostConstruct 和@PreDestroy
    * 提供web服务索引的注释,诸如@WebServiceRef 和@WebServiceRefs

  四、注释,还是web.xml?

  注释的引入使得web部署描述符(web.xml)成为配置web组件时的可选项,而非强制性的。然而,如果您必须对配置进行修改或者更新的话,您可能仍然会使用部署描述符。容器将根据描述符web.xml中的metadata-complete元素的值来决定使用web.xml或者注释。如果该属性的值为true,那么容器就不会处理注释和web片段;部署描述符是所有的元数据信息的唯一来源。只有当该元素metadata-complete不存在或其值不为true时才,容器才会处理注释和web片段。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics