Servlet是sun公司提供的一种用于开发动态web资源的技术
##tmocat和servlet的关系
tomcat是web应用服务器,是一个servlet/jsp的容器
##servlet的创建和servlet的web.xml配置
<!--告诉tomca,应用里有这个servlet,名字叫做xxxx
具体的路径是xxxx-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.Servlet.Servletdemo</servlet-class>
</servlet>
<!-- 注册servlet的映射 url-pattern地址栏上地址 -->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
###url-paren的配置(通配符)
###缺省servlet
在tomcat的安装目录\config\web.xml文件中,注册了一个org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。我们在访问静态资源就是在使用这个缺省的servlet
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
##servlet的访问过程运行过程
servlet程序是由web服务器调用,web服务器接收到客户端的servlet请求后
servlet的访问过程
##servlet接口及其实现类
###为什么要有两个接口
servlet(接口)
GenericServlet(重写了5个接口) httpservlet(用于处理http的请求)
##servlet的生命周期
###生命周期
###生命周期方法
service 方法
doGet和doPost不算生命周期方法,生命周期方法只指,从对象创建到销毁一定会执行的方法,但这两个方法不一定会执行
###创建的时机,前提
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>com.Servlet.Demo</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
##servlet的线程安全问题
当多个tomcat并发的访问同一个servlet时,web服务器为每一个客户端的访问请求创建一个线程,并在这个线程上调用servlet的service方法,如果service方法访问了同一个资源的话就看你引发多线程安全问题
##servletConfig
###配置servletconfig
<servlet>
<servlet-name>ServletConfigDemo1</servlet-name>
<servlet-class>study.ServletConfigDemo1</servlet-class>
<!--配置ServletConfigDemo1的初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>gacl</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
###获取servletconfig
public void init(ServletConfig config) throws ServletException {
this.config = config;
}
ServletConfig config = getServletConfig()
###获取配置的初始化参数
servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将初始化参数封装到servletConfig对象中,在调用init方法时,会将servletConfig对象传递给servlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取在web.xml中配置的初始化参数
String paramVal = this.config.getInitParameter("name");//获取指定的初始化参数
response.getWriter().print(paramVal);
response.getWriter().print("<hr/>");
//获取所有的初始化参数
Enumeration<String> e = config.getInitParameterNames();
while(e.hasMoreElements()){
String name = e.nextElement();
String value = config.getInitParameter(name);
response.getWriter().print(name + "=" + value + "<br/>");
}
}
###servletchongfig的方法
###servletconfig的作用
##servletcontext
###什么是servletcongtext
有叫上下文,域对象,简单的说一个web项目有一个servletcontext实例,每个servlet都可以访问他
###获取servletcontext
###配置参数
<contxet-param>
<param-name>add</param-name>
<param-value>123</param-value>
</context-param>
###作用
####实现数据共享
####获取配置的参数
String add = servletContext.getInitParameter("add");
####实现请求转发
ServletContext context = this.getServletContext();//获取ServletContext对象
RequestDispatcher rd = context.getRequestDispatcher("要去的界面");//获取请求转发对象(RequestDispatcher)
rd.forward(request, response);//调用forward方法实现请求转发
####读取资源文件--获得路径
getServltContext().getRealPath("")
;获得到D:\apache-tomcat-9.0.12\wtpwebapps\项目名\
getServltContext().getRealPath("文件名")
getServltContext().getRealPath("/WEB-INF/classes/文件名")
getServletContext().getRealPath("/WEB-INF/classes/db/config/文件名");
为什么在classes下呢
####读取资源文件--获得流
getResourceAsStream
获取资源的流对象####读取资源文件--class类加载器
//获取到装载当前类的类装载器
ClassLoader loader = ServletContextDemo1.class.getClassLoader();
//用类装载器读取src目录下的文件
InputStream in = loader.getResourceAsStream("文件名");
//获取到装载当前类的类装载器
ClassLoader loader = ServletContextDemo1.class.getClassLoader();
//用类装载器读取src目录下的servlet.study包中的文件
InputStream in = loader.getResourceAsStream("servlet/study/db4.properties");
//获取到装载当前类的类装载器
ClassLoader loader = ServletContextDemo1.class.getClassLoader();
//用类装载器读取webContent下的文件
classLoader.getResourceAsStream("../../Config.properties");
###控制浏览器缓存
添加Expires头可以有效减少Http请求次数,只要浏览器中有缓存,并且相应的资源未过期,均可以使用缓存中的资源,无须再发送请求到服务器
public class ResponseDemo6 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 设置数据合理的缓存时间值,以避免浏览器频繁向服务器发送请求,提升服务器的性能
* 这里是将数据的缓存时间设置为1小时
*/
response.setDateHeader("expires", System.currentTimeMillis()+1000*3600);
String data = "aaaaaaaaaa";
response.getWriter().write(data);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
原文:http://blog.51cto.com/10760006/2177791