servlet是Java语言编写的服务器端程序,其主要功能是交互式地浏览和修改数据,生成动态Web内容。
开发Servlet:
1定义一个类HelloServlet,并让该类去实现javax.servlet.Servlet接口;
2实现Servlet接口中的init,service,destory等方法.
3找到项目根下的WEB-INF下的web.xml文件,在根元素web-app中创建一个新的元素节点:servlet再创建一个对应的元素节点:servlet-mapping
Servlet的执行流程: 构造器-->init方法--> 循环[ service方法 ]--->destory方法(正常关闭服务器)
1:浏览器发出请求;
2:解析请求信息;
3:找到服务根/config/server.xml文件.:解析该<Context/>元素,得到docBase属性,获取当期访问Web项目的根的绝对路径;
4:从Web项目根路径下的WEB-INF下找到web.xml文件,根据URL上的资源名对应的servlet-mapping可以获取该资源对应Servlet类的全限定名称;
5:判断Servlet实例缓存池中是否有这个资源的对象.若没有则使用反射调用构造器,创建对象.并存放在缓存之中,供下次使用;
6:创建ServletConfig对象,并调用init方法.:obj.init(config);
7:创建ServletRequest对象和ServletResponse对象,并调用service方法: obj.service(req,resp);
8:在service方法中对浏览器做出响应操作。
Servlet初始化参数:
为了避免在Servlet中存在硬编码二维护困难的问题,我们往往把硬编码数据存放于配置文件中,而Servlet提供初始化参数的机制。
现在的问题:如何在Servlet中获取自身的初始化参数信息:
String getInitParameter(String name):
根据指定的初始化参数名称,获取对应的参数值:
Enumeration<String> getInitParameterNames()。
获取当期Servlet所有初始化参数的名字,返回Enumeration对象(古老Iterator对象)。
Servlet继承体系
Servlet接口 ServletConfig接口
|实现 |实现
GenericServlet 类
|继承
HttpServlet类
|继承
BaseServlet类(自定义类)
HttpServletRequest常用方法:
String getContextPath():获取上下文路径,<Context path="上下文" ../>。
String getHeader(String headName):根据指定的请求头获取对应的请求头的值。
String getRequestURI():返回当期请求的资源名称. 上下文路径/资源名。
StringBuffer getRequestURL():返回浏览器地址栏的内容。
String getRemoteAddr():返回请求服务器的客户端的IP。
String getParameter(String name):根据参数名称,获取对应参数的值。
String[] getParameterValues(String name):根据参数名称,获取该参数的多个值。
Enumeration<String> getParameterNames():获取所有请求参数的名字。
Map<String,String[]> getParameterMap():返回请求参数组成的Map集合。
key:参数名称
value:参数值,封装在String数组中。
请求乱码的处理办法
POST方式:
request.setCharacterEncoding("UTF-8");//设置请求的编码方式。
注意:必须在获取第一个参数之前设置,只对POST方式有效。
GET方式:
重新设置Tomcat的编码方式,修改Tomcat的配置文件.
Tomcat根/conf/server.xml(修改端口行一行).
注意:该方式只对于GET方式有效。
HttpPServletResponse常用方法:
OutputStream getOutputStream():获取字节输出流. :文件下载
Writer getWriter():获取字符输出流. :输出内容
注意:以上两个方法不能共存,只能使用其中一个。
Servlet的生命周期:
启动Tomcat-->第一次访问: 构造器-->init方法-->service方法.........
也就是说,Servlet对象构建和初始化操作是在第一次请求的时候执行的.
第一次发请求的用户倒霉,花很多时间去做Servlet对象构建和初始化操作.
在开发中,会专门地提供一个Servlet,用来做应用初始化准备操作,期望,在启动Tomcat的时候就完成初始化准备操作.
此时,只需要一个配置:
<load-on-startup>1</load-on-startup>
Servlet映射细节:
1):一个Servlet组件可以拥有多个映射,提供多个<servlet-mapping>即可.
2):Servlet的通配符映射.
使用*来表示任意个数的任意字符.
方式1: /* :任意的资源名称都可以访问该Servlet.
/system/*:/system/任意字符都可以访问.
方式2: *.拓展名 :
*.it:只要以.it结尾的资源名称都可以访问该Servlet.
3):自定义的Servlet组件的<servlet-name>的名称不能为default.
若叫做default则不能访问静态资源了(非Servlet资源,网页,图片等).
在Tomcat中处理静态资源的Servlet的名称就叫做default.
4):Servlet的线程安全问题--Servlet是线程不安全的:
Servlet是单例的,快些,不安全. 不要使用成员变量. SpringMVC,Struts1线程不安全的.