功用:
1.读取客户端显示数据
2.赌气浏览器隐式请求数据
3.生成结果
4.向客户发送显示数据(文档)
5.发送隐式HTTP相应数据
1.效率:传统CGI对每一个请求都会启动一个进程
servlet使用轻量级的java线程处理
2.便利 3.强大 4.廉价 5.可移植 6.安全
jsp作用
某种程度上,servlet看作是含有html的java程序
将jsp看作是含有java代码的html页面
jsp会翻译成servlet,servlet会被编译,在请求期间运行的就是servlet
Web目录
html以及jsp文档放在顶级目录中
web.xml文件放在WEB-INF子目录中
servlet和其他类要么放在WEB-INF/Classes中,要么放在WEB-INF/Classes对应的包里面
CLASSPATH需要包含.class文件顶级目录,需要把webAppDir/WEB-INF/Classes加入到CLASSPATH中去
为每个servlet指定一个地址,web.xml
<web-app>
</web-app>
必须要将所有servlet元素放在servlet-mapping之前,不能相互混合
第三章servlet基础
METHOD:Get、Post请求
servlet一般拓展为HttpServlet,并根据数据发送方式覆盖不同的方法doGet或doPost方法
HttpServletRequest所有的请求信息
HttpServletRequest指定输出信息,可以获得printWrite,用它可以将文档内容发送到客户。对于简单的servlet,大部分工作花在了println生成上
两种一场ServletException和IOException
输出html,(response方法)设置相应报头 setHead()也可以
常用setContentType设置输出文档类型为text/html,会缓冲报头数据,缓冲区大小 set/getBufferSize
类文件虽好放在包中
1.servlet生命周期
构造器 init 调用servive方法。servlet规定任何时间只允许单个线程运行。多个并发请求一般会导致多个线程同时调用service方法
get正常的url请求,post需要特殊列为method的html表单中
直接覆盖service不是个好思想。doPost和doGet相互调用
doXxx是service的主体
2.init
初始化参数非常依赖于web.xml,调用getServletConfig,获取ServletConfig对象的引用
3.destroy方法
服务器移除该servlet时调用该方法,应当主动将某些操作数据保存起来,防止意外(断电等)发生
servlet实现了SingleThreadModel接口,防止多线程访问,但并不是好的选择。最好多线程不要同时对servlet访问。这里涉及到多线程编程。
调试:
打印输出
IDE自带调试
日志跟踪
Apache Log4J
重启服务器等
第四章 处理表单数据
使用action属性指定处理数据的jsp或servlet地址
<form action="url"> 省略action将提交到自身页面
submit按钮
读取 reques,大小写敏感
读取单个值;getParameter(),返回string
读取多个值 getPatameterValues() 返回数组
参数名查找 ①getPatameterNames()返回一个Enumeration hasMoreElement和nextElement迭代读取在读取时可以调用getParameter()、getPatameterValues()方法
②getPatameterMap()
读取原始数据 getReader和getInputStream
多字符集数据读取
1.单个参数转码
String first = request.getParamter("first");
String first = new String(first.getBytes(),"GBK");
2.setCharaterEncoding()
//多次拼接字符串,需要使用StringBuffer提高效率
javaBean自动填充表单java对象,自动转换数据类型
bean:普通类,拥有私有字段,并拥有get/set方法
(jsp:setProperty)以后讲
第五章:处理Http请求报头(reqert)
首先判断是否为空
报头:
GET/servlet/Search?keyword=servlets+jsp HTTP/1.1
Accept:image/gif,image/jpq,*/* 指定处理的类型
Accept-Encoding:gzip 浏览器可用的字符集
Accept-Language 列出客户的首选语言(中文)
Connection:Keep-Alive 能否处理可储蓄链接http请求
Content-Length 适用于post数据大小
Authorization 访问密码保护的页面需要表示身份(第二卷)
Cookie:userID=id4545(第八章)
Host:www.books.com
Refere:http://www.books.com/findbooks.html
User-Agent:Mozilla/4.0 浏览器信息或其他客户程序
读取报头 getHeader(connection); 大小写不敏感
getCookie(第八章)
getAuthType和getRemoteUser拆分Authorization读取
getContentLenget
getContentType
getDateHeader和getIntHeader读取指定报头并转换为Date或Int类型
getHeaderNames 返回一个Enumeration
getMethod
getRequestURL
getQueryString
getProTocol 返回前三部分一般为 HTTP/1.1
压缩页面信息
定制浏览器
根据客户的到达方式定制页面
Refere指出,用户通过链接到达指定页面才会发送Refere,如果直接输入网址则不会发送Refere
第六章 :服务器相应的生成 respond
setStatus(int) 状态代码 302 404
sendRedirct(String url)
sendError(int code, String message)
html状态代码
100 继续 200 OK,一切正常 202已接受 204没有文档
205重置内容 301永久移动 302找到 303 检查其他文档
304 未发生更改 307临时重定向 400错误请求 401未授权 403资源不可用 404未找到 405方法不允许
415 不支持的媒体类型 417 期望不能满足 500服务器内部错误 503 服务器不可用 505不支持的http版本
第七章 服务器相应生成 http相应报头
重点:输出图像,表格
第八章 cookie管理
用处:标识用户 记住密码 定制站定 定制广告
使用Cookie构造函数cookie,用指定名称和值创立cookie
cookiesetCookie设置属性 cookie.getCookie读取
使用response.addCookie将cookie插入到HTTP相应报头中
读取采用 request.getCookie() 返回数组 大多数需要遍历调用每个cookie中getName方法取出对象,用getValue取出对应的值
Cookie c = new Cookie("UserID","a123");
设置最大时效 c.setMaxAge();
插入到相应报头 response.addCookie(c);
使用cookie属性。
属性时服务器发送客户端报头的一部分。不属于浏览器返回给服务端的报头。每次都要在请求流中获取。
set/getComment() 注释
set/getDomain() cookie使用的域(域名)
set/getMaxAge(int) 毫秒
set/getPath() 获取适用的路径 如果没有指定,只发送或返回cookie页面所在目录极其子目录下的(servlet)url ("/")适用于所有网站
set/getSecure()能否加密链接
set/getValue
set/getName
set/getVersion
区分会话cookie与持续性cookie
设置时效的,在超过时效后过期
没有设置时效的,只在当前窗体和子窗体中有效
静态类CookieUtilities类方法单纯的提取某个值
getCookieValue(request,"Name","Parame")
第九章 会话跟踪
因为http时无状态的不会维护上下文的信息
典型的解决方法:cookie url重写(url加请求字符串)以及隐藏表单域
适用HttpSession Api
1.访问与当前请求相关联的绘画对象
requset.getSession获取httpSession对象,这是一个简单的散列表 HttpSession session = requset.getSession
2.查找与会话相关联的信息
HttpSession.getAttribute()
3.存储信息 setAttribute()
4.废弃会话数据 removeAttribute() 废弃指定会话
invalidate() 废弃整个会话
logout退出服务器销毁该用户相关联的所有会话
5.getAttributeNames() 返回所有属性的名称,返回值是Enumeration
6.boolean isNew() 是否新会话
7.long getCreateionTime()
8.long getLastAccessedTime()最后被客户访问的时间
9.set/getMaxIncativeInterval() 自动废弃时间
存在服务器端
setAttribute会替换掉任何值
默认会话跟踪session是基于浏览器内存中的cookie