Javaweb之Servlet组件

一。javaweb的三大组件

        *servlet
*fileter

*listener

二。servlet处理模式

    ·接受请求的数据
·处理请求

·完成响应

三。Servlet单例对象注意事项

        *实现servlet
·实现servlet的接口
·集成httpServlet类
·servlet由tomcat调用
·servlet对象由服务器创建
·servlet是单例的,一个类只有一个对象

·servlet线程不是安全的。(为什么Servlet是不安全的)

                servlet的是单例模式,当出现并发性访问时,调用的是同一个servlet的,若servlet中存在成员变量,那么在相互调用成员变量是会出现相互影响。所以初学者在使用servlet事不要声明成员变量,可以使用局部变量

·不要在servlet中创建成员变量
·使用 <load-on-startup></load-on-startup>控servlet中什么时候加载(讲解)

·默认是在首次访问时servlet时创建单例servlet的对象

四。servlet简单demo

    (1)demo的目录结构

    

(2)直接上代码

package com.demo.test;

import java.io.IOException;
import javax.servlet.ServletConfig;
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;

/*
 * @urlPatterns 访问的路径 http://lcoalhost:8080/Study/BServlet
 * @initparams 初始化参数  调用的是init(ServletConfig config) 方法。
 * @WebInitParam 参数 key - value的形式
 * */
@WebServlet(
		urlPatterns = { "/BServlet" }, 
		initParams = { 
				@WebInitParam(name = "ignor", value = "a,b,c")
		})
public class BServlet extends HttpServlet {
	
	//这里主要是模拟一下初始化参数问题,存在并发性问题。
	private String [] ignor;
	private static final long serialVersionUID = 1L;
	//初始化参数
	public void init(ServletConfig config) throws ServletException {
		ignor = config.getInitParameter("ignor").split(",");
	}
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println(ignor[0]+"\t"+ignor[1]);
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

        访问:http://lcoalhost:8080/Study/BServlet

        结果:


    

        eclipse打印台输出的结果是由于本人还做了Filter的测试。从控制台我们可以看出,我们通过url地址访问后,能够打印出我们的赋值,就说我们赋值是成功。那么servlet是通过什么方法给成员变量赋值的呢?下面我们做另一个测试。

        

package com.demo.test;

import java.io.IOException;
import javax.servlet.ServletConfig;
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;

/*
 * @urlPatterns 访问的路径 http://lcoalhost:8080/Study/BServlet
 * @initparams 初始化参数  调用的是init(ServletConfig config) 方法。
 * @WebInitParam 参数 key - value的形式
 * */
@WebServlet(
		urlPatterns = { "/BServlet" }, 
		initParams = { 
				@WebInitParam(name = "ignor", value = "a,b,c")
		})
public class BServlet extends HttpServlet {
	
	//这里主要是模拟一下初始化参数问题,存在并发性问题。
	private String [] ignor;
	private static final long serialVersionUID = 1L;
	//初始化参数
//	public void init(ServletConfig config) throws ServletException {
//		ignor = config.getInitParameter("ignor").split(",");
//	}
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		if(ignor!=null) {
			for (String string : ignor) {
				System.out.println(string);
			}
		}
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

    我们将init(......)方法注释掉访问:http://lcoalhost:8080/Study/BServlet

    结果

    很明显,eclipse并没有打印出ignor的参数。那么我们就可以得出结论,初始化参数的地方在init(.....)方法内

五。servlet加载问题。

(1)

package com.demo.test;

import java.io.IOException;
import javax.servlet.ServletConfig;
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;

/*
 * @urlPatterns 访问的路径 http://lcoalhost:8080/Study/BServlet
 * @initparams 初始化参数  调用的是init(ServletConfig config) 方法。
 * @WebInitParam 参数 key - value的形式
 * */
@WebServlet(
		urlPatterns = { "/BServlet" }, 
		initParams = { 
				@WebInitParam(name = "ignor", value = "a,b,c")
		})
public class BServlet extends HttpServlet {
	
	//这里主要是模拟一下初始化参数问题,存在并发性问题。
	private String [] ignor;
	private static final long serialVersionUID = 1L;
	//初始化参数
	public void init(ServletConfig config) throws ServletException {
		System.out.println("B开始加载了。。。。。");
		ignor = config.getInitParameter("ignor").split(",");
	}
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		if(ignor!=null) {
			for (String string : ignor) {
				System.out.println(string);
			}
		}
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

    

    (2)

package com.demo.test;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class EServlet
 */
@WebServlet(loadOnStartup = 1,
		urlPatterns = { "/EServlet" } )
public class EServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	
	
	public void init(ServletConfig config) throws ServletException {
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

    

结论:由(1)和(2)比较可知,servlet加载默认为首次访问servlet对象时创建,可以通过loadOnStartup来改变加载的时刻。

猜你喜欢

转载自blog.csdn.net/mister_yang/article/details/80438325