一。javaweb的三大组件
*servlet
*fileter
*listener
二。servlet处理模式
·接受请求的数据
·处理请求
·完成响应
三。Servlet单例对象注意事项
*实现servlet
·实现servlet的接口
·集成httpServlet类
·servlet由tomcat调用
·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来改变加载的时刻。