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类,让业务逻辑根本不知道有表现的存在。
原本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";
}功能分隔:
- 视图:负责表示方面。它从控制器得到模型的状态。另外视图还要获得用户的输入,并交给控制器。
- 控制器:从请求获得用户输入,并明确这些输入对模型有什么影响。告诉模型自行更新,并且让视图(JSP)能得到新的模型状态。
- 模型:包含具体的业务逻辑和状态。即模型知道用什么规则来得到和更新状态。购物车的内容(和处理购物车内容的规则)就属于MVC中的模型。系统中只有这部分与数据库通信(不过它可能会使用另一个对象完成具体的数据库通信,但这种模式以后再讲)。
servlet调用Jsp
Servlet代码(初版)
1 | package ***; |
让servlet调用JSP生成视图
- url找到servlet;
- sevlet调用某java类处理业务逻辑;
- 业务逻辑处理后的返回值增加到请求对象(以某种方式写入request中),以便于JSP的访问;
- 要求容器把请求转发给”***.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,你该知道的
- servlet一生只调用一次init()和destroy().
- 每个servlet都仅对应一个实例(SingleThreadModel除外,一般不用)
- 与HTTP有关的都在javax.servlet.http包中,其余的(通用servlet类和接口)则 在javax.servlet包中
- 运行init方法后,servlet还不是真正的servlet,还需要具备一些特性,比如能够使用ServletContext引用从容器得到信息
- ServletConfig和ServletContext的存在是为了支持servlet处理客户请求,以下是两者对比:
ServletConfig对象 | ServletContext对象 |
---|---|
每个Servlet都有一个ServletConfig对象 | 每个Web应用只有一个ServletContext |
用于向Servlet传递部署时消息(例如数据库或企业bean的查找名 ),而你不想把这个消息硬编码写到servlet中(servlet初始化参数) | 用于访问Web应用参数(也在DD中配置) |
用于访问ServletContext | 相当于一种应用公告栏,可以在这里放置信息(称为属性),应用的其他部分可以访问这些信息 |
参数在部署描述文件中配置 | 用于得到服务器信息,包括容器名和容器版本,以及所支持的API的版本等 |
已完成全书第4章105页,读书笔记未完待续。。