您的位置:首页 > 编程语言

Servlet编程专题10之Servlet3.0注解

2017-10-31 15:13 357 查看
- Servlet3.0规范是JavaEE6.0规范中的子规范。其要求运行环境最低是JDK6.0,Tomcat7.0。而之前学习的是Servlet2.5版本的规范,其是JavaEE5.0规范的子规范。其要求运行环境最低是JDK5.0,Tomcat5.0。
- 在Eclipse中使用Serlvet3.0规范,则需要在创建动态Web工程时就要指定。其具体用法是,在Eclipse中创建动态Web工程时,指定创建的“动态Web模块版本”为3.0版本。此时创建的Web工程中默认是没有web.xml文件的。

1、Servlet3.0的注解:
- Servlet3.0中允许在定义Servlet、Filter与Listener三大组件时使用注解,而不用在web.xml进行注册。Servlet3.0规范允许Web项目没有web.xml配置文件。
a、Servlet3.0规范中使用@WebServlet()注解来注册自定义的Servlet类。该注解具有多个属性,常用属性的类型与意义如下表所示:(需要注意的是,能够省略的只有value属性,其他属性一概不能够省略)




- 示例代码:
- 使用@WebServlet()注解自定义Servlet类:
package com.geeklicreed.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//@WebServlet("/someServlet") 此处完整写法为:@WebServlet(value="/someServlet")
/*
@WebServlet(value={"/some","/xxx", "/yyy"})
这种写法可以使用http://localhost:8080/annotation-servlet/xxx、 http://localhost:8080/annotation-servlet/yyy和 http://localhost:8080/annotation-servlet/yyy三种方式访问这个Servlet
*/
@WebServlet(value="/some", //设置属性urlPattern与属性value功能相同
name="some-servlet", //设置ServletName
initParams={@WebInitParam(name="username", value="geeklicreed"),  //设置初始化参数
@WebInitParam(name="password", value="888888")},
loadOnStartup=2  //默认是-1,如果设置为大于0,则在应用启动时创建Servlet实例(参看之前专题)
)
public class SomeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取ServletName
String servletName = this.getServletName();
//获取初始化参数
Enumeration<String> names = this.getInitParameterNames();

response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.append("Servlet at Servlet3.0 <br/>");
out.append("servletName = " + servletName + "<br/>");
while(names.hasMoreElements()){
String name = names.nextElement();
String value = this.getInitParameter(name);
out.print(name + " = " + value + "<br/>");
}

}
}
- 启动web应用,访问该servlet,在浏览器中的显示结果如下:



- 需要注意的是,如果注解编写错误(如value="some"),则会无法启动tomcat服务器。




b、Servlet3.0规范中使用@WebFilter()注解来注册自定义的Filter类。该注解具有多个属性,常用属性的类型与意义如下表所示:




- 示例代码:
- 使用@WebFilter()注解自定义Filter类:
package com.geeklicreed.fillter;

import java.io.IOException;

import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(value = "/*", dispatcherTypes = DispatcherType.REQUEST)
public class SomeFilter implements Filter {

public SomeFilter() {
}

public void destroy() {
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//System.out.println("执行Servlet前的请求过滤代码");
chain.doFilter(request, response);
//System.out.println("执行Servlet后的响应过滤代码");
}

public void init(FilterConfig fConfig) throws ServletException {
}

}
- 启动web应用,可以发现已经在控制台中打印如下内容:




c、Servlet3.0规范中使用@WebListener注解来注册自定义的Listener类。(该注解没有任何属性,在自定义Listener类中使用@WebListener注解即可)
- 示例代码:
- 使用@WebListener注解自定义Listener类:
package com.geeklicreed.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class MyServletContextListener implements ServletContextListener {

public MyServletContextListener() {
}

public void contextDestroyed(ServletContextEvent sce) {
}

public void contextInitialized(ServletContextEvent sce) {
System.out.println("应用启动");
}

}
- 当应用启动时,可以看到控制台打印如下信息,说明该Listener已经起作用:




d、采用Servlet2.5规范的web.xml配置和Servlet3.0的注解两种方式同时存在的情况,需要注意的问题:
- 注册Servlet:若两种方式的url-pattern值相同,则应用无法启动;若两种方式的url-pattern值不同,那么相当于该Servlet具有两个url-pattern。
- 注册Filter:若对于Filter采用这两种方式同时进行注册,无论url-pattern的值是否相同,其都是作为两个独立的Filter出现的。

- 注册Listener:若对于Listener采用这两种方式同时进行注册,其仅仅相当于一个Listener。
- <web-app/>中的属性metadata-complete的值若为true,则表示对三大组件的注册方式,只有web.xml的注册起作用,将忽略注解的注册;若为false,则表示两种注册方式同时起作用。(默认)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Servlet 特性 WebServlet