Servlet是什么
* java编写的web应用组件
* 用于动态网页输出
* servlet使用servlet容器运行
如何定义一个servlet
* 定义一个类实现Servlet接口
* serlvet是单实例,多线程运行
Servlet的生命周期
init service destroy方法表示servlet的生命周期
构造方法优先于init()执行,在servlet生命周期中执行一次
init()
第一个执行,在servlet生命周期中只执行一次,只在初始化的时候执行
由servlet容器调用
service()
第二次执行,执行n次,当客户端发送请求的时候调用
由servlet容器调用
destroy()
当servlet消亡时,由servlet容器调用执行,只执行1次
在web.xml注册servlet
<Servlet> <servlet-name>配置servlet的名称,给servlet的路径起个别名<servlet-name> <servlet-class>配置servlet使用类对应的路径</servlet-class> </Servlet> <servlet-mapping> <servlet-name>引用上面配置好的servlet名称</servlet-name> <url-pattern>对外访问的路径</url-pattern> </servlet-mapping>
init()
ServletConfig config 保存servlet初始化的信息
ServletConfig 的实现类对象由servlet容器创建StandardWrapperFacaded对象,保存了servlet初始化信息
容器调用init方法,把StandardWrapperFacaded作为实参传递给方法形参
在web.xml中配置对应servlet的初始化参数
<init-param> <param-name>参数名</param-name> <param-value>参数值<param-value> <init-param>
在init()中使用getInitParameter("book")获取参数值;
当传递的参数没有该初始化的值得话,返回null
在init中使用getinitParameterNames()获取初始化参数的名称,返回的枚举
Enumeration<String> em=config.getinitParameterNames(); while(em.hasMoreElements()) em.nextElement()
在init中使用getSerrvletName()获取注册的servlet名称
在init中使用getServletContext()返回服务器端的共享内容,
在servletContext中保存的信息,对所有的客户端都是共享的,
一个web应用只有一个servletContext();
Service()
ServletRequest 保存了客户端的所有的请求信息
ServletReponse 保存了服务器端回送给客户端的响应信息
在web.xml中配置容器启动时初始化servlet
在servlet的Init方法中配置初始化参数或者在web.xml中的<servlet>
<init-param> <param-name></param-name> <param-value></param-value> </init-param> <load-on-startup>2</load-on-startup>
load-on-startup配置说明
1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
2)它的值必须是一个整数,表示servlet应该被载入的顺序
3)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
4)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
5)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
6)当值相同时,容器就会自己选择顺序来加载
Servlet映射
同一个servlet可以映射到多个url上
servlet映射的url可以使用*通配符配置成
*.action(struct2) 和*.do(struts1) 或*.任意 的格式
对于上面的情况*的前面不用加/
前面使用/ ,不加*通配符 ,比如/a.do /b.action 访问的时候必须使用整个的路径如:a.do b.action
配置以/开头/*结尾的 /al/* 访问的时候只要是以/al/开头的都可以访问
访问静态的html或者图片默认的使用缺省servlet
映射URL的优先级(*号在前面优先级最低)
servlet1 /abc/*
servlet2 /*
servlet3 /abc
servlet4 *.do
/abc/a.html 访问的是 servlet1
/abc 访问的是 servlet3
abc/a.do 访问的是 servlet1
a.do 访问的是 servlet2
/xxx/yyy/a.do 访问的是 servlet2
设置request对象的字符编码
request.setCharacterEncoding("utf-8");
必须保证request在后台没有访问之前设置才有效
以下代码只对post提交有效
request.getParameter(""); request.getParameterValues(""); request.getHead(string); request.getHeadName(string); request.getHeadNames();
获取CGI变量
获取请求方法 request.getMethod()
获取请求的内容类型 request.getContextType()
获取web应用的根 request.getContextPath()
获取请求路径后边字符串的参数 request.getQueryString()
获取客户端请求的ip request.getRemoteAddr()
获取URI(统一资源标示符) request.getRequestURI() URI包括URL
获取客户端的url(统一资源定位符)地址 request.getRequestURL()
获取访问的servlet路径 request.getServletPath()
获取请求协议 request.getScheme() http
获取服务器的ip request.getServerName()
获取服务器的端口号 request.getServerPort()
获取响应
设置响应的MIME类型和字符编码,如果response在后台被访问过来再设置就无效率
response.setCharcterEnconding("utf-8");
response.SetContentType("text/html");
上面两个等同于 response.setContextType("text/html;charset=utf-8");
获取响应的字符输出流
PrintWriter out=response.getWriter();
out.print(sdfsd);
获取响应的直接输出流
OutputStrem os=response.getOutputStream();
文章评论