Servlet 与 JSP 小结 纯概念

来源:互联网 发布:java开源流程引擎源码 编辑:程序博客网 时间:2024/06/04 18:18

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>

 

按照 以上顺序匹配

全限定

目录

后缀