1。什么是Servlet?
A servlet is a small Java program that runs within a Web server.
翻译:
2.作用?
Servlets receive and respond to requests from Web clients,
usually across HTTP, the HyperText Transfer Protocol.
翻译:
3.写法?
myapp
WEB-INF:
classes
servlet编译之后代码放到这个包下
lib
web.xml
css
html
img
js
1.类的写法?
package com.itheima.servlet;
import javax.servlet.*;
import java.io.*;
public class HelloWorldServlet extends GenericServlet
{
public void service(ServletRequest req,ServletResponse res)throws ServletException,IOException{
res.getWriter().write("Hello World");
}
}
2.编译
set classpath=%classapth%;C:\apache-tomcat-6.0.37\lib\servlet-api.jar
javac -d . HelloWorldServlet.java
3.配置文件
在web.xml中添加servlet的配置
<servlet>
<!--自己配的一个名称-->
<servlet-name>hello</servlet-name>
<!--一定是servlet类所对应全路径-->
<servlet-class>com.itheima.servlet.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--自己配的一个名称-->
<servlet-name>hello</servlet-name>
<!--映射的一个URL,一定是/开头(具体路径)-->
<url-pattern>/cgx/aj</url-pattern>
</servlet-mapping>
4.Eclipse的写法
1.新建web项目
src开发目录下的内容,在部署到tomcat后,会放到WEB-INF/classes目录下
WebRoot开发目录下的内容 ,在部署到tomcat后,会完整的放入到当前应用名下
2.新建一个Servlet
3.部署
4.运行
替换Servlet模板
·1.到MyEclipse安装目录下 *wizard*.jar
2.替换templates/Servlet.java
思考 : doGet()能处理get请求,
doPost()可以处理post请求
它们与Service()方法的关系 ?
当用户发起请求起,始终调用的是service()方法,而这个方法内部会进行判断
并决定是调用 doGet(),还是doPost()
而咱们自己定义的Servlet又重写了doGet(),doPost()
结论:不要自己重写service()方法,因为父类有这个方法,一般只要重写doGet(),doPost()就可以了
扩展:模板方法设计模式
public class A{
service(){
doGet();
doPost();
}
public abstract void doGet();
public abstract void doPost();
}
public class B extends A{
public void doGet(){
}
public void doPost(){
}
}
public static void main(String args[]){
A a = new B();
a.service();
}
5.生命周期:
The servlet is constructed, then initialized with the init method.
Any calls from clients to the service method are handled.
The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized.
1.在默认情况下,Servlet生命周期执行过程如下:
在用户第一次请求时:
1.实例化:构造方法1次
2.初始化:(init):1次
3.服务:(service),以后每次请求,都会直接执行service() :N次
4.销毁:当服务器停止或应用被移除,此时销毁destory()方法执行: 1次
2.改写生命周期
是通过<load-on-startup>来实现的
取值: 整数(1开始 越小优先级越高)
结果?
服务器启动时,对应的Servlet就会执行生命周期(实例化,初始化)
以后每次用户执行时,走service()方法
优点:当用户每一次请求时,速度会变快
缺 点:如果load-on-startup配置太多,Tomcat启动速度会变慢
6.具体详细配置:
1.可以配多个映射地址
<servlet-mapping>
<servlet-name>myfirst</servlet-name>
<url-pattern>/servlet/MyFirstServletDemo1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>myfirst</servlet-name>
<url-pattern>/aj</url-pattern>
</servlet-mapping>
2.通配符的使用
1./* (/servlet/* /* )
2.*.扩展名(*.do *.action )
不要这写成/*.action
<servlet-mapping>
<servlet-name>myfirst</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>myfirst</servlet-name>
<url-pattern>*.czbk6</url-pattern>
</servlet-mapping>
http://localhost:8080/myapp/hello.action
3.总结规律:
1.能精确匹配的用精确匹配
2./*优先级高于*.扩展名
3.可以配置一个缺省的Servlet
1.写法: /
<servlet-mapping>
<servlet-name>myfirst</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.当请求静态资源时,如果找不到,则执行缺省的Servlet
if("1.jpg"找到了){
显示图片
}else{
没有找到 显示404
}
3.这个缺省的Servlet一般不配置,为什么?
在Tomcat的web.xml中有
7.线程安全
启发:
说明servlet不是线程安全的,而且它设计目标就是采用多线程来处理用户请求
线程安全问题解决方法:
1.synchronized:线程同步
2.用单线程:就是实现SingleThreadModel接口
总结:这两种方法都不行,违背了设计意图!!!
最终解决办法:
程序员自己注意,不要定义成员变量,尽量用局部变量
合理决定在Servlet中定义的变量的作用域
总结:
1.什么是Servlet?
2.如何写一个Servlet类并进行配置?
3.在MyEclipse工具下如何创建一个Servlet并发布到Tomcat中,启动Tomcat
4.MyEclipse工程的目录结构与Web应用程序发布到Tomcat的关系?
5.Servlet生命周期?以及如何改写生命周期
6.源码分析为什么可以直接写doGet,doPost()方法
7.配置Servlet的细节问题?
8.得到一个启发?
4.ServletConfig
1.什么是ServletConfig
A servlet configuration object used by a servlet container used to
pass information to a servlet during initialization
2.作用?
1.得到初始化参数?
如何配置初始化参数?
<init-param>
<!-- 参数名 -->
<param-name></param-name>
<!-- 参数名所对应取值 -->
<param-value></param-value>
</init-param>
注意:该标签出现在<load-on-startup>之前
getInitParameter("参数名");
getInitParameterNames();
3.得到一个ServletConfig实例的两种方法?
1,init(ServletConfig config)
2.getServletConfig(); //继承父类GenericServlet或它的子类才行
只能用其中一个
实现效果:
因为每个Servlet都要配置相同初始化参数,可不可以配置通用的初始化参数?
5.ServletContext
1.什么是ServletContext?
它是服务器产生的一个对象,它用于实现各个Servlet之间信息共享 ,用于获取全局初始化参数
1.它是运行在web容器中,每个web应用程序都会有一个自己唯一的ServletContext对象。
2.由web容器在加载应用时,就创建好了。
3.它跟web应用程序同生命周期
2.作用?
1.作为一个全局范围的域对象来用(四大域作用范围),可以实现应用范围的数据共享.实现各个Servlet之间信息共享
实现原理:
就是在全局范围内维护一个Map集合
setAttrbite(key,Value);
Object obj = getAttribute(key);
removeAttribute(key);
2.获取全局化参数
getInitParameter("");
getInitParameterNames();
3.得到文件的绝对路径
相对路径:/WEB-INF/classes/1.jpg
而相对于谁?第一个/代表当前web应用程序
绝对路径: C:\apache-tomcat-6.0.37\webapps\day07_00_servlet/WEB-INF/classes/1.jpg
getServletContext().getRealPath("/WEB-INF/classes/1.jpg");//相对于本应用,咱们现在这个路径是绝对定位
4.实现Servlet的转发。
1.什么是转发?
A-->B--->C
重定向
A-----我 (10000 我没有)
实现步骤:
1.得到转发器 路径一定是绝对路径
RequestDispatcher rd = getServletContext().getRequestDispatcher("/servlet/ServletContextDemo1");
2.转发
rd.forward(request, response);
2.实现方式
//放入iphone6
sc.setAttribute("gift", "iphone6");
//转发,采用ServletContext实现转发时,不能用相对路径,只能用/开头代表一个绝对路径
RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContextDemo5");//转发器
//rd.forward(request, response);//转发
//在实现包含时,它会将目标对象的响应正文包含进来,如果设置有响应头也不起作用
rd.include(request, response);//包含
3.转发与重定向区别?
//转发的特点:
//1.地址栏不变
//2.说明客户端向服务器发送只有一次请求
//3.放在request 域中的值可以共享 (request域还没有讲,先总结了)
//重定向
//1.地址栏改变
//2.客户端发送了2次请求
//3.放在request 域中的数据不能共享
5.利用ServletContext对象读取资源文件
参考示例?
3.如何得到它的实例?
getServletConfig().getServletContext()
getServletContext()
总结:
1.怎么去写Servlet?
2.如何配置?
3.发布
4.MyEclipse下如何写Servlet?
5.各种URL配置?
6.生命周期?
7.改写生命周期?
<load-on-startup>10</load-on-startup>
8.多线程?
9.ServletConfig
得到初始化参数:init-param
10.ServletContext
1.是什么?
2.作用?
1.应用范围的域对象
2.得到应用范围初始化参数:context-param
3.得到文件真实路径:文件下载
4.转发与包含
5.四种资源文件的读取方法