少很实际用到但却还算重要的一章开始咯,第七章——【作为JSP】 开始咯……
46、JSP最终还是会变成一个完整的servlet在Web应用中运行。他与其他的servlet很相似,只不过这个servlet类会由容器为你写好。
My——(编写)——>MyJsp.jsp——(转换为)——>MyJsp_jsp.java——(编译为)——>MyJsp_jsp.class——(加载并初始化为)——>MyJsp_jspservlet(P281);
47、不要在表达式中放了分号!<%=Counter.getCounter();%>可能很糟糕,这表示:out.print(Counter.getCounter(););(P287);
48、所有scriptlet(<% ;%>)和表达式(<%= %>)代码都放在服务器方法中。
这说明scriptlet中声明的变量总是局部变量!
JSP声明(<%! ;%>)总在类中定义,而且置于服务方法之外。这意味着你可以声明静态变量,实例变量和方法。(P291~293);
49、JSP要变成servlet,容器会为这个servlet编写.java文件。
JSP声明周期:
1.1 写一个.jsp文件,并将其部署为Web应用的一部分;1.2 容器“读取”这个应用的web.xml,但是对.jsp文件不做任何处理(直到得到第一个请求);
2.1 客户点击一个链接,请求这个.jsp;2.2 容器尝试将.jsp转换成一个servlet类的.java源代码(这一步会捕获JSP语法错误);
3 容器尝试把这个servlet.java源文件编译成一个.class文件(这里会捕获到java语言/语法错误);
4 容器加载新生成的servlet类;
5 容器实例化servlet,并导致servlet的jspInit()方法运行——>对象现在变成一个完整的servlet,准备就绪,可以接受客户请求了;
6 容器创建一个新线程来处理这个客户的请求,servlet的_jspService()方法运行;
7 此后发生的所有事情都只是普通的servlet请求处理;
8 最终servlet想客户发回一个响应(或者把请求转发到另一个Web应用组件)(P304~305);
50、部署应用时,在JSP生命周期中,整个转换和编译步骤只发生一次。
JSP一旦得到转换和编译,就像其他servlet一样了。
而且类似于其他的servlet,一旦servlet得到加载和初始化,请求时只会发生一件事,就是创建货分配一个线程来运行服务方法。
所以“第49”只是针对第一个请求。(P306);
51、可以在JSP中完成servlet初始化工作,但这与常规servlet中的做法稍有不同。DD中加<jsp-file>TestInit.jsp</jsp-file> (P308);
52、在JSP中可以
<%!
public void jspInit() {
ServletConfig config = getServletConfig();
Stirng email = config.getInitParameter("email");
ServletContext ctx = getServletContext();
ctx.setAttribute("mail", email);
}
%>
(P308);
53、通常你不需要(也不关心)页面作用域,除非你在开发定制标记。(P309);
54、可以使用PageContext引用得到任意作用域的属性(P310);
55、pageContext.findAttribute("MyKey");首先从最严格的作用域查起(页面上下文),逐步转向不严格的作用域,最先找到就算“赢”,不会再其他作用域继续查找(P311);
56、CTO下发的备忘录,办公室之间传阅
----------------------------
紧急
如果发现有人在JSP代码中使用
scriptlet,表达式或声明,立即停职,
扣发薪水,知道能确定这个程序员真正称职
或者能维护另外哪个笨蛋的代码为止。
----------------------------
XXXXX
首席技术官
----------------------------
“记住,团队是大家的。”(P314);
57、把java放在JSP中,往往有两大抱怨:
1)不应该要求Web页面设计任意必须懂java。
2)JSP的java代码很难修改和维护。(P317);
58、page指令优先于DD设置!如<%@ page isElIgnored="true"%>优先于DD中<el-ignored>true</el-ignored>
摘完才发现这章的重要点点和以前的迷糊点点还真不少,收获咯,收获咯……