1、web开发中引入servlet的原因
1)浏览器向服务器发送请求,服务器根据请求,找到相关资源,向浏览器返回一个结果。但是,web服务器擅长提供静态的web页面。它不会自己生成动态内容,或者把数据保存到服务器上。那么,如果有这样的请求,web服务器就要依靠第三方来帮忙处理这些事情。而servlet则是那个第三方,她也是在服务器上处理这些问题的。
2)有和servlet类似的第三方应用,为什么选择servlet?相比其他方法,servlet的优势在哪里?
2、servlet的用法
既然servlet相当于第三方辅助应用,那么它是如何辅助的?怎么创建一个servlet?怎么调用这个servlet?在什么时候这个servlet都做了什么?
1)容器:管理和运行servlet.
a.为什么要用容器来管理和运行sevlet?没有容器servlet就不能运行了吗?
有了容器,可以更专注于业务逻辑,而不用考虑为线程管理、安全性和网络通信编写代码。(这部分我还没有体会到)
a)通信支持:无需自己建立ServerSocket,监听端口,创建流等,容器知道自己与服务器之间的协议;(容器是怎么知道自己与服务器之间协议的?)
b)生命周期管理:容器控制servlet的生死,所以不用过多考虑资源管理了。比如什么时候把servlet实例回收,这些都是容器负责处理的;(容器是如何控制的?)
c)多线程支持:容器自动地为它接收的每个servlet请求创建一个新的java线程,当servlet运行完相应的http服务方法,线程会结束。(怎么创建的新线程,线程又是如何结束
的?)
d)生命方式实现安全:利用容器,可以使用xml部署描述文件来配置(或修改)安全性,而不必将代码硬编写到servlet类代码中。(xml如何来配置的?如何用servlet实现?)
e)JSP支持:容器负责把JSP代码翻译成真正的java。(怎么翻译的?)
b.容器是如何处理请求的?
a)客户点击一个链接,URL指向一个servlet而不是静态页面;
b)容器“看出来”这个请求是一个servlet,创建两个对象HttpServletResponse,HttpServletRequest;
c)容器根据请求中的URL找到正确的servlet,为这个请求创建或者分配一个线程,并把请求和响应分配给这个servlet线程;
d)容器调用servlet的service()方法,根据请求的不同类型,service()会调用doGet()或doPost()方法;
e)doGet()或doPost()方法生成动态页面,并把这个页面“填入”响应对象。(容器有响应对象的一个引用,这是什么?)
f)线程结束,容器把响应对象转换为一个http响应,把它发回给客户,然后删除请求和响应对象。
c.容器是怎么找到servlet的?
a)用户请求会有一部分是URL,它会以某种办法映射到服务器上的一个特定servlet。这种映射可以有多种实现方式,但是,这里只说使用部署描述文件将URL映射到servlet这
种方法;
b)部署描述文件:
注:这些文件在eclipse里面都是随着servlet的创建而自动生成的,无需手动编写,这里写出只是为了便于理解。
<servlet>
<servlet-name>Hello</servlet-name> //servlet名
<servlet-class>com.div.learnjsp.HelloServlet</servlet-class> //与这个servlet对应的java类
</servlet>
<servlet-mapping> //容器在运行时使用这个元素来寻找请求的URL所对应的servlet
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern> //客户看到的,不是真实的servlet类名,而是在访问时的路径×
</servlet-mapping>
×:若所创建的工程的名字为task,部署之后,上面的servlet的地址为http://localhost/task/Hello.用户通过这种方式访问.
2)servlet
a)什么是servlet?知道了servlet的用途,但是还不知道servlet的结构。这个例子说明了一个简单的servlet的组成。
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloWorldServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) //从这里拿到容器创建的请求和响应对象的引用
throws IOException {
res.setContentType("text/html"); //设置响应的报头,内容类型
PrintWriter out = res.getWriter(); //获得响应对象的输出流,输出文本信息
out.println("<html><head><title>Hello World!</title></head>");
out.println("<body>");
out.println("<p><img src=images/build_bea_web.gif align=right>");
out.println("<h1>Hello World!</h1></body></html>");} }
(未完待续......)