读《Head First Servlet&JSP》个人体会,总结的一些东东。
1:HTTP响应剖析。
下面是HTTP响应的具体的内容:
HTTP/1.1 200 OK 这是响应的头部
Set-Cookie:JSESSIONID=23123lkj32k3j2kk43kjk4kj; Path=/TestEL
Content-Type: text/html
Content-Length: 397
Date : Sat,19 May 2012 18:44:45 GMT
Server :Apache-Coyote/1.1
Connection: close
<html> 这是响应的体部
...........
</html>
2: Servlet剖析。
Servlet在容器的控制下,如何完成请求处理:
用户点击一个连接,指向一个servlet而不是一个静态的页面
容器看出来这个请求要的是一个servlet,所以创建两个对象HttpServletRequest,HttpServletResponse
容器根据请求的URL找到正确的servlet,为这个请求创建或分配一个线程,并把创建的HttpServletRequest和HttpServletResponse传递给这个servlet的线程
容器调用servlet的service()方法。根据请求的不容类型,service会调用doGet()或doPost()方法
doGet()方法生成动态的页面,并把这个页面”塞到“响应对象里
线程结束,容器把响应对象转换为一个http响应,把他发给用户,然后删除请求对象和响应对象
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*; Servlet从这里拿到容器所创建的请求对象和响应对象
public class Servlet2 extends HttpServlet{ ↑↑↑↑↑↑↑↑↑
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
PrintWriter out = response.getWriter(); 在Servlet从容器得到的响应对象中,可以拿到一个PrintWriter。使用
java.util.Date today = new java.util.Date(); 这个PrintWriter能够将HTML文本输出到响应对象。最后由容器把响应
out.println("<html>"+ 对象装换为一个HTTP响应(那个由PrintWriter输出的内容,就放在HTTP响应的
"<body>"+ 体部)
"<h1>"+
"This is Servlet2"+
"<br>"+
today+
"</h1>"+
"</body>"+
"</html>");
}
}
这种做法很原始,如果HTML再复杂一点,不难想象该有多复杂。这样就引入了JSP。引入后响应过程如下:
浏览器把请求对象数据发送给容器
容器根据URL找到正确的servlet,并把请求对象传递给这个servlet
servlet调用服务层的javaBean寻找帮助
这个类返回一个回答,servlet吧这个回答增加到请求对象中 (我更多的是放在session中的,没有涉及到这一点)
servlet把请求对象转发给JSP
JSP从请求对象找到答案
JSP为容器生成一个静态的页面
Servlet把这个页面附加到HttpServletResponse中的内容部分,最后转换为Http响应的体部
容器把这个http响应发送给用户
import com.example.model.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class Servlet2 extends HttpServlet{
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{
String c = request.getParameter("color");
JavaBean jb = new JavaBean();
List result = jb.getBrands(c);
request.setAttribute("style",result); 为请求对象增加一个属性,工jsp使用
RequestDispatcher view = request.getRequestDispatcher("result.jsp"); 为jsp实例化一个请求分派器
view.forward(request,response); 使用请求分派器要求容器准备好jsp,并向jsp发送请求和响应
}
}