Servlet3.0学习总结

 

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动态注册成功");
	}
}

  

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值