Fork me on GitHub

notes_for_HeadFirstServletsAndJsp3

Head First Servlets&JSP 读书笔记_3

名词解释

  • J2EE:Java 2 Enterprise Edition,包含了Web容器和EJB(Enterprise JavaBean)容器,而tomcat只是一种Web容器,不是完整的J2EE应用服务器

  • 独立的EJB容器?独立的EJB容器已经过时,目前所有的EJB容器都作为完整J2EE的一部分

  • POJO:Plain Old Java Object,普通的java对象。与JavaBean的区别是,POJO可以有属性和getter/setter方法,可以有简单的运算属性,但不允许有业务方法和connection之类方法

  • scriptlet代码:

    In JavaServer Pages (JSP) technology, a scriptlet is a piece of Java-code embedded in the HTML-like JSP code. The scriptlet is everything inside the <% %> tags. Between these the user can add any valid Scriptlet i.e. any valid Java Code.
    [译]JSP中的scriptlet是指在类HTML的JSP中的标准java代码段,使用”<% %>”的格式。

  • 请求分派机制:容器机制,容器管理的一个组件调用另一个组件

web与MVC

[理解]MVC:将Servlet中做业务逻辑的功能(查询DB,插入DB,把HTML输出到响应流返回客户)搬到业务层和持久层。业务逻辑本身应该作为一个可重用的Java类,让业务逻辑根本不知道有表现的存在。

  1. 原本Servlet完成的输出HTML的工作,现在Servlet将请求转发给适当的JSP,再由JSP建立响应HTML,并将其返回。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //用ssm的controller凑合理解一下。。
    //从这个url(admin_category_list)进来
    @RequestMapping("admin_category_list")
    public String list(Model model,Page page) {
    List<Category> cs=categoryService.list(page);
    int total=categoryService.total();
    page.setTotal(total);
    model.addAttribute("cs",cs);
    model.addAttribute("page",page);
    //视图跳转到listCategory.jsp文件
    return "admin/listCategory";
    }
  2. 功能分隔:

    • 视图:负责表示方面。它从控制器得到模型的状态。另外视图还要获得用户的输入,并交给控制器。
    • 控制器:从请求获得用户输入,并明确这些输入对模型有什么影响。告诉模型自行更新,并且让视图(JSP)能得到新的模型状态。
    • 模型:包含具体的业务逻辑和状态。即模型知道用什么规则来得到和更新状态。购物车的内容(和处理购物车内容的规则)就属于MVC中的模型。系统中只有这部分与数据库通信(不过它可能会使用另一个对象完成具体的数据库通信,但这种模式以后再讲)。

servlet调用Jsp

Servlet代码(初版)

1
2
3
4
5
6
7
8
9
10
11
12
13
package ***;
import ***;

public class Select extends HttpServlet{

public void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException{
response.setContentType("text/html");//来自ServletResponse接口
PrintWriter out = response.getWriter();
out.println("这是个啥?");
String c=request.getParameter("color");//来自ServletRequest接口,与属性值name=”color“标签对应
out.println("颜色是:"+c);
}
}

让servlet调用JSP生成视图

  1. url找到servlet;
  2. sevlet调用某java类处理业务逻辑;
  3. 业务逻辑处理后的返回值增加到请求对象(以某种方式写入request中),以便于JSP的访问;
  4. 要求容器把请求转发给”***.jsp”;

容器管理servlet

servlet的生命周期(request和response角度)

  • 客户点击URL
  • 容器按照目标servlet创建HttpServletRequest和HttpServletResponse对象
  • 容器创建或分配一个线程,并调用servlet中的service()方法
  • service()按需调用doGet()或 doPost()方法
  • 将响应通过容器写至客户
  • service()结束,线程或撤销或返回到容器所管理的线程池中,Request和Response对象可以垃圾回收
  • 客户得到响应

servlet的生命周期(容器与servlet角度)

  • 容器加载servlet类,生成.class文件
  • 初始化servlet,运行其构造方法init()。如果不覆盖init方法,就会运行Generic-Servlet的init方法。两种init方法比较:
  • 一般建议使用左侧便利版本
public void init() throws ServletException public void init(ServletConfig config) throws ServletException
A convenience method which can be overridden so that there’s no need to call super.init(config) Called by the servlet container to indicate to a servlet that the servlet is being placed into service. See Servlet.init(javax.servlet.ServletConfig).
[译]相比init(ServletConfig)方法,使用init()方法无需调用super.init(config)方法。 [译]Servlet容器调用此方法使servlet进入Service中
Instead of overriding init(ServletConfig), simply override this method and it will be called by GenericServlet.init(ServletConfig config). The ServletConfig object can still be retrieved via getServletConfig() This implementation stores the ServletConfig object it receives from the servlet container for later use. When overriding this form of the method, call super.init(config)
[译]简单重写此方法,未来会被GenericServlet.init(ServletConfig config)方法调用,ServletConfig对象会由getServletConfig方法取到 [译]此实现从Servlet容器存入了ServletConfig对象,当覆盖此方法时,需要调用super.init(config)方法
  • servlet总是在为第一个客户请求提供服务之前得到加载和初始化
  • 处理客户请求,Servlet容器中有一个线程池 ,针对每次请求会分配一个线程去处理请求,即便是同一个客户多个请求,也同样对应着多个线程
  • 容器调用destroy(),在servlet被杀死之前有机会清理资源,可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动
  • 注:当工程从Tomcat移除时,会调用destroy()方法
  • 在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。由 JVM 的垃圾回收器完成回收

有关servlet,你该知道的

  1. servlet一生只调用一次init()和destroy().
  2. 每个servlet都仅对应一个实例(SingleThreadModel除外,一般不用)
  3. 与HTTP有关的都在javax.servlet.http包中,其余的(通用servlet类和接口)则 在javax.servlet包中
  4. 运行init方法后,servlet还不是真正的servlet,还需要具备一些特性,比如能够使用ServletContext引用从容器得到信息
  5. ServletConfig和ServletContext的存在是为了支持servlet处理客户请求,以下是两者对比:
ServletConfig对象 ServletContext对象
每个Servlet都有一个ServletConfig对象 每个Web应用只有一个ServletContext
用于向Servlet传递部署时消息(例如数据库或企业bean的查找名 ),而你不想把这个消息硬编码写到servlet中(servlet初始化参数) 用于访问Web应用参数(也在DD中配置)
用于访问ServletContext 相当于一种应用公告栏,可以在这里放置信息(称为属性),应用的其他部分可以访问这些信息
参数在部署描述文件中配置 用于得到服务器信息,包括容器名和容器版本,以及所支持的API的版本等

已完成全书第4章105页,读书笔记未完待续。。

-------------The End-------------