目录
Servlet
概述
1 浏览器访问实现
1.1 手动通过修改web.xml
1.2 通过编译器
2 servlet实现三种方式
2.1实现javax.servlet.Servlet接口
2.2 继承javax.servlet.GenericServlet类(实现了ServletConfig接口…)
2.3 继承javax.servlet.http.HttpServlet类(常用方式)
3 Servlet的细节
3.1 Servlet与线程安全
3.2 创建Servlet的时间
3.3 url-pattern标签的补充
3.4.web.xml文件的补充
3.5.Servlet与反射
4 ServletContext
4.1 ServletContext对象的作用:
4.2 获取ServletContext
4.3 JavaWeb四大域对象
4.4 获取应用初始化参数
4.5 获取资源
①真实路径(有盘符)
②资源流
③所有资源路径
④类路径下的资源
Servlet:JavaWeb的三大组件之一
作用:处理服务器接受到的请求(接受请求数据-处理请求-完成响应)
1.给Servlet指定一个路径,将其绑定在一起
2.浏览器通过路径访问
XXX
cn.itcast.web.servlet.ASerevlet
p1
v1
XXX
/AServlet
eclipse创建servlet的时候可以直接创建,编译器自动创建web.xml
IDEA实现需要在类开头加上url设置路径
@WebServlet(name = "CServlet",urlPatterns = {"/CServlet"})
public class AServlet implements Servlet{//单例,一个类只有一个对象,但可以有多个Servlet类,线程不安全
/*生命周期方法3
*在Servlet被销毁之前调用,只执行一次
*/
public void destroy(){
System.out.println("destory()...");
}
//用来获取Servlet的配置信息
public ServletConfig getServletConfig(){
System.out.println("getServletConfig()...");
return null;
}
//用来获取Serlet的信息
public String getServletInfo(){
System.out.println("getServletInfo()...");
return null;
}
/*生命周期方法1
*在Servlet对象创建后马上执行,只执行一次
*/
public void init(ServletConfig servletConfig) throws ServletException{
System.out.println("init()...");
}
/*生命周期方法2
*每次处理请求都调用这个方法,可以被调用多次
*/
public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException{
System.out.println("service()...");
}
}
//servlet中方法大多数都不是我们来调用,而是由Tomcat调用(对象由服务器来创建)
相关类:
ServletConfig:一个ServletConfig对象,对应一段web.xml中Servlet的配置信息
其相关方法:
String getServletName():获取的时中的内容
ServletContext getServletContext():获取Servlet上下文对象(详见下文)
String getInitParameter(String name):通过名称获取指定初始化参数的值
Enumeration GetInitParameterName():获取所有初始化参数的名称
ServletRequest,ServletResponse:请求类和响应类
a.继承GenericServet的子类必须重写service方法
b.不用重写三个生命周期方法,只需重写它们调用的普通方法,避免覆盖掉周期方法中原有的代码(类似于以下代码)
public void init(ServletConfig servletConfig) throws ServletException{
this.config = servletConfig;
init();
}
public void init(){
}
HttpServlet是GenericServlet类的子类
HttpServlet原理:
public class Eservlet extends HttpServlet{
//重写doGet()方法
public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletRxception,IOException{
System.out.println("doGet()...")
}
//重写doPost()方法
public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletRxception,IOException{
System.out.println("doPost()...")
}
}
一个类型的Servlet只能有一个实例对象,而一个Servlet可以处理多个请求,所以存在线程安全问题
因此,我们不能再Servlet中创建成员变量,因为可能存在一个现在对这个成员变量进行写的操作,而另一个线程正在对这个成员变量进行读的操作
默认情况下,服务器会在莫格Servlet第一次受到请求时创建,我们也可以在web.xml中对其进行配置,使服务器启动时就创建Servlet
0
1
url-pattern标签是servlet-mapping标签的子标签,用来指定Servlet的访问路径
URL路径必须以/开头,且可以使用通配符:
/servlets/*
*.do
/*
tpmcat文件中conf下的web.xml是所有JavaWeb项目文件中web.xml的父文件
因此,写在父文件的web.xml中的配置会应用到所有的项目中
如果访问的项目中,web.xml没有对servlet进行配置或者直接访问服务端的html/jsp文件时,则会默认使用父文件的web.xml
由此可知,浏览器的访问后的结果都是通过Servlet进行请求处理后的结果
sesion-config:过期时间为30min(待补充)
mime-type:设定某种扩展名的文件用一种应用程序来打开的方式类型,可以在web.xml中查看
tomcat自动完成的反射动作:
浏览器访问文件或Servlet类时,通过Servlet路径与web.xml中的url-pattern的路径匹配
匹配后,获得相应web.xml中的Servlet类名,即servlet-class
利用类名通过反射技术就可以创建其相应的实例对象并运行其中的处理方法
在整个Web应用的动态资源之间共享数据,例如在AServlet中向Servlet对象中保存一个值,然后再BServlet中就可以获取这个值
注:一个项目只能由一个ServletContext对象,在服务器启动时创建,在服务器关闭时销毁
ServletConfig,GenericServlet,HttpSession,servletContextEvent->getServletContext()
HttpSession,servletContextEvent->待补充
域对象:用来在多个Servlet中传递数据的对象,且所有域对象内部都有一个Map,用于存储数据
ServletContext是四大域对象之一,其用于操作数据的方法:
void setAttribute(String name,Object value):在对象中保存一个域属性名称为xxx,域属性值为xxx(name相同会覆盖)
Object getAttribute(String name):通过域属性名称获取对象中相应的数据
void removeAttribute(String name):移除对象中与此域属性名称相同的域属性(如果该name不存在,则该方法上面都不做)
Enumeration getAttributeName():获取所有域属性的名称
某个servlet的初始化参数:
p1
v1
应用的初始化参数(公共):
p2
v2
前者由ServletConfig对象获取,后者由ServletContext对象获取:
ServletContext app = this.getServletContext();
String value = app.getInitParameter("context-param");
System.out.println(value);
当Web服务器启动时,Web服务器会自动创建一个application,session对象。application对象一旦创建,它将一直存在,直到Web服务器关闭。在jsp中可以直接使用。
在jsp中,服务器自动加载的代码:
HttpSession session=request.getSession();//获取session对象来存储用户名
ServletContext application = this.getServletContext();// 获取application
String path = this.getServletContext().getRealPath("/index.jsp");
InputStream input = this.getServletContext().getResourceAsStream("/index.jsp");
Set paths = this.getServletContext().getResourcePaths("/WEB-INF");
类路径:/WEB-INF/classes和/WEB-INF/lib/每一个jar包
//第一种
ClassLoader c1 = this.getClass().getClassLoader();
InputStream input = c1.getResourceAsStream("a.txt");//相对classes
//第二种
Class c = this.getClass();
InputStream input = c.getResourceAsStream("a.txt");//相对当前.class文件所在目录
//InputStream input = c.getResourceAsStream("/a.txt")->相对classes