1. Servlet 生命周期
在第一个客户访问的时候开始 , 或者可以通过配置DD文件 在服务器启动的时候就
1)WEB 容器 加载类
2)初始化servlet , Servlet 的无参构造函数执行
3)init() 在servlet 的一生中只调用一次,而且必须在容器调用service 之前完成 ,这个可以被重写哦
4) service() 每个请求运行于一个单独的线程,处理 doGet doPost 不要求重写, 没看过源码啊 个人意淫是 模版模式,子类只需要重写 doGet doSet 就行
5 )destroy 容器调用此方法 从而servlet 被杀死,也就是说可以垃圾回收,之前有清理资源的机会。 一生调用一次
容器运行多个线程来处理对一个servlet的多个请求
一个jvm 中 只有一个 servlet 实例
2.Get和Post 的区别
Post 有体 ,而Get 没有体
Get发的参数 直接放在 URL 后面
Get 是幂等的
Post是非幂等的
Get一般用于请求数据
Post用于修改数据
另外注意 Post 不是默认的 如果你写了一个表单没有设置请求类型那么默认是Get
当然你用get 去修改数据也是可以的
上面都是官方说法。
3.
Cookie[] cookie
HttpSession session
String method
InputStream in
上面的是我们除了参数以外还可以 得到的一些常用方法。
等会会写 session 是怎么实现, 对于 HTTP 无状态协议,我们怎么才能实现会话机制
相对来说 response 对于 session和 Cookie 的操作都是一些写的操作了
4. Servlet 重定向 和 请求分派
response.setRedirect();
注意路径问题
比如当前 url 为 http://www.meran.com/myapp/bar.do
sendRedirect("/foo/stuff.html")
http://www.meran.com/foo/stuff.html
sendRedirect("foo/stuff.html")
http://www.meran.com/myapp/foo/stuff.html
当你在把响应写回后在调用这个方法 报错 IllegalStateException
另外 注意sendRedirect 取一个String 做参数 不是 url
请求分派由服务器完成不会被客户端发觉
代码
RequestDispatcher viev= request.getDispathcer(String)
view.forward(request,response);
也可以
RequestDispatcher view=getServletContext().getDispatcher(String)
二者区别一看便知, 一个是response 的方法 ,另外一个是request 的方法。
重定向的时候客户端会看到 url的变化,请求分派不会。
在重定向的时候, 服务器端返回报文 ,给出 状态码并把重定向到的 url返回。
5)
ServletConfig 和ServletContext
servletConfig 作为 Servlet 的init 方法的参数 ,所以在这个方法之前不可以访问 getServerConfig
servlet 初始化参数只读一次 ,这个过程由容器完成
ServletConfig 属于一个Servlet ServletContext 属于本WEB应用内所有 servlet
6) 关于上下文,请求,和会话的线程安全问题
请求是线程安全的
上下文和会话非线程安全
会话非安全发生在 用户同时打开两个或者多个浏览器的情况下
保证安全性可以对 适当对象同步,不要对servlet 和 服务方法同步
另外注意只有请求属性和局部属性是线程安全的,很简单 都懂。
7)SingleThreadModel
通过设置多个 servlet 实例池,每个servlet 实例一次只执行一个线程。
缺点, 违背了 一个jvm中只有一个 servlet 实例的说法,不妙
另外当 我们要记录处理了多少请求的时候, 所有servlet处理的请求总数才等于总的处理数
8)Session
request.getSession()
request.getSession(false)
第一个在没有会话的时候创建一个
第二个只返回有木有
会话的实现
Cookie
和URL重写 (用于客户不支持Cookie的情况下) 每次都在url 后面加上 jsessionid
对于使用那种方式 客户并不会察觉
另外注意 静态链接并不能使用 URL重写
设置会话超时
1.超时
2.调用 invalidate()
3.应用结束
JSP 搞起来
1.jsp 的生命周期
容器读DD 但是不处理,直到第一个请求-------- jsp 转换为 servlet 源文件-----加载并且初始化------jspInit-------jspService-----------jspDestory
注意转换和编译只发生一次
2. <%= >表达式
<%! > 转换为全局变量
<%> scriptlet 转换为局部变量
3.隐式对象
A P I 隐士对象
JspWriter out
HttpServletRequest request
HttpServletResponse response
HttpSession session
ServletContext application
ServletConfig config
Throwable exception
PageContext pageContext
Object page
4.
指令
page
taglib
include
剩下的先不写了。。感觉还不太熟悉,明日搞起
配置问题
1.<servlet>
<servlet-name> name<servlet-name>
<servlet-class>实现路径<servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>name</servlet-name>
<url-pattern>/Beer.do</url-pattern>
</servlet-mapping>
servlet-name 这个属性只在DD(配置文件中有用)
url-pattern 当 有请求发送过来时候,容器查出 相应的 name 最后找到 处理文件
2.servlet 匹配顺序
<url-pattern>/Beer/SelectBeer.do</url-pattern>
<url-pattern>/Beer/*</url-pattern>
<url-pattern>*.do</url-pattern>
按照 以上顺序匹配
全限定
目录
后缀