二、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,如下所示:
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的请求。
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模式。
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参数。
@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 属性的一部分的例子:
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的例子:
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附件是从该请求对象中读取的。