1. Servlet注解:类似于@WebServlet({value="/xxx","/ooo"}, //value可以写成urlPatterns,value可以省略
name="####", //设置ServletName
initParams={@WebInitParam(name="####",value="###")}, //设置初始化参数
loadOnStartup=2 //应用启动时创建当前Servlet实例
)
2. Filter注解: @WebFilter("/*") //过滤所有请求
@WebFilter(servletNames="Some-Servlet") //过滤指定的servlet
@WebFilter(value="/*",dispatcherTypes=DispatcherType.FORWARD)//过滤带有forward请求转发的servlet
3.Listener注解:@WebListener
注意:<web-app/>中的属性metadata-complete的值若为true,则表示对三大组件的注解方式,只有web.xml中的注册起作用,将忽略注解的注册,若为false,则表示两种注册方式同时起作用。其值默认为false。
//获取服务端保存上传文件的目录路径
String path = this.getServletContext().getRealPath("/###");
//从请求中获取Multipart请求中的上传文件"部分对象"
Part part = request.getPart("/###");
//获取指定的头部属性
String header=part.getHeader("Content-Disposition");
//解析出原始文件名
int index = header.lastIndexOf("=");
String fileName = header.substring(index+2,header.length()-1);
//完成文件上传
part.write(path+"/"+fileName);
Servlet的一般性工作:
1. 接受并解析用户请求
2.根据用户请求调用Service层代码进行计算(耗时 )
3. 将计算结果响应给客户端
asyncSupported=true表示当前Servlet支持异步处理
//获取异步上下文对象
AsyncContext ac = request.startAsync();
//设置异步上下文的超时时限,和complete()差不多,都关闭了流和销毁了异步上下文对象
ac.setTimeout(3000);
//开启异步上下文对象
ac.start(Runnable对象);
//通知主线程异步子线程执行完毕
ac.complete();
ac.dispatch("/show.jsp");
对于异步上下文对象ac的结束方式总结:
1.在异步子线程中使用ac.complete()方法:该方法用于结束异步操作,并将与当前异步对象相关的request与response对象销毁
2. 在异步子线程中使用ac.dispatch()方法:该方法在结束异步操作的同时,会将参数所指定的页面包含到当前异步对象相关的标准输出流中。其执行效果相当于RequestDispatcher对象的include()方法的执行效果
3.在异步Servlet主线程中设置ac的超时时限,当超时时限到达时,异步对象及其相关的request与response对象销毁
- Servlet3.0的组件可插性:
先创建一个Web Fragment Project片段项目,然后export成jar包,然后再创建一个web工程,将jar包插入,即可运行。
- Servlet3.0三大组件动态注册
1. Servlet动态注册:
创建一个类去实现ServletContextListener接口,然后通过ServletContext中的方法去动态注册Servlet。
2. Filter动态注册:
创建一个Filter,然后配置Filter
3.动态注册Listener:
例如创建一个class去实现ServletRequestListener接口,然后用addListener方法注册即可。
源码附上:
动态注册类 :
package com.bjpowernode.listeners;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.WebListener;
@WebListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
// 获取ServletContext
ServletContext sc = sce.getServletContext();
// 下面两个变量的值一般是从配置文件读取来的
String servletName = "Some-Servlet";
String className = "com.bjpowernode.servlets.SomeServlet";
// --------------动态注册Servlet---------
ServletRegistration.Dynamic srd = sc.addServlet(servletName, className);
// 为Servlet添加动态参数
srd.setInitParameter("ls", "帅哥");
srd.setInitParameter("ls", "帅哥");
// 为Servlet指定url-pattern
srd.addMapping("/some");
// ---------------动态注册Filter---------
String filterName = "Some-Filter";
String filterClassName = "com.bjpowernode.filters.SomeFilter";
FilterRegistration.Dynamic frd = sc.addFilter(filterName, filterClassName);
//配置当前Filter的映射信息
frd.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
//---------------动态注册Listener--------
// 下面两个变量的值一般是从配置文件读取来的
String listenerClassName = "com.bjpowernode.listeners.MyRequestListener";
sc.addListener(listenerClassName);
}
}
1.Servlet类
package com.bjpowernode.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SomeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("SomeServlet已被动态注册<br>");
Enumeration<String> names = this.getInitParameterNames();
while(names.hasMoreElements()) {
String name = names.nextElement();
String value = this.getInitParameter(name);
out.print(name+"="+value+"<br>");
}
}
}
2.Filter类
package com.bjpowernode.filters;
import java.io.IOException;
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;
public class SomeFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("动态注册Filter成功");
chain.doFilter(request, response);
}
}
3.Listener类
package com.bjpowernode.listeners;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class MyRequestListener implements ServletRequestListener {
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("Listener动态注册成功");
}
}