jsp/servlet
_jspService
init/destory/service
jsp注释 <%--xxx--%>
jsp声明 <%! 声明部分 %> 不能声明abstract method,否则就导致servlet变成abstract 而无法实例化
jsp表达式 <%=表达式%>
jsp脚本 <%脚本%>
<% for (int i=0;i<10;i++) { %> <tr> <td>值</td> <td><%=i%></td> </tr> <% } %>
==>
_jspService(){ for (int i=0;i<10;i++) { out.write("\t\t<tr>\r\n"); out.write("\t\t<td>值</td>\r\n"); out.write("\t\t<td>"); out.print(i); out.write("</td>\r\n"); out.write("\t\t</tr>\r\n"); } }
jsp编译指令
page/include/taglib
9内置对象
application/config/exception/out/page/request/response/pageContext/session
request/response这两个对象是_jspService()方法的参数,而page,pageContext,application,config,session,out都是这个方法的局部变量。
所以不要在JSP声明中使用这些对象!!!
关于exception 只有当PAGE为isErrorPage为TRUE时,Servlet才会初始化exception对象。
WEB 服务基本流程 参考tomcat 源代码
- 启动服务的进程或线程
- 通过IO读取用户的请求数据
- 从流中解析出各种数据参数
- 处理用户请求
- 生成相应的response数据
- 通过IO-Stream向客户端发回数据
JSP Servlet之间怎么交换数据
map: application,session,request,page 四个cache 对应于application,session,request,pageContext for _jspService()
ServletContext sc=getServletConfig().getServletContext();
sc.getAttribute("counter");
获取application的配置参数
<% String user=application.getInitParameter("username"); %>
request
<% String rawQueryStr= request.getQueryString(); String queryStr= java.net.URLDecoder.decode(rawQueryStr,"gbk"); %>
forward 请求的参数和请求属性都不会丢失!!!
include vs forward
getRequestDispatcher("/bla.jsp").include(request,response)
getRequestDispatcher("/foo.jsp").forward(request,response)
response可以用来重定向 与forward不用,重定向会丢失所有的请求参数!
<% out.print("==="); response.sendRedirect("redirect-result.jsp"); %>
Cookie vs session.
session 会随着browser关闭而丢失而cookie会persist在client
response支持对cookie的增加操作,而request.getCookies()
Cookie ck=new Cookie("username","abccxx"); ck.setMaxAge(24*3600); response.addCookie(ck);
session getAttribute,setAttribute
自MVC规范后,Servlet的职责开始明确为CONTROLLER,不再需要为生产页面标签而繁琐,那是jsp等其他view framework的职责!!!
servlet:
doGet/doPost/doPut/doDelete/service/init/destory
通过init来初始化,因为servlet本身被容器构造,通过destory来销毁
Servlet 3.0 Annotation.
@WebServlet(name="firstServlet",urlPatterns={"/firstServlet"}) public class FirstServlet extends HttpServlet{ }
生命周期
lazy loaded: first requst to create servlet instance, for most cases.
you can early startup with application bootstrap: load-on startup servlet.
create instance--> init-->handle request-->destory
servlet主要用来做控制器使用!!!
JSP 2 标签库
- 标签处理类,
- tld文件,
- embed in JSP
<%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%> <mytag:helloworld/>
public class HelloWorldTag extends SimpleTagSupport{ public void doTag() throws JspException,IOException{ getJspContext().getOut().write("Hello World " + new java.util.Date()); } }
QueryTag sample
public class QueryTag extends SimpleTagSupport{ private String driver; private String url; private String user; private String pass; private String sql; //getter setter for tag attributes... public void doTag() throw JspException,IOException{ } }
tld
<tag> <name>query</name> <tag-class>lee.QueryTag</tag-class> <attribute> <name>driver</name> <required>true</required> </attribute> </tag>
embedded in jsp
<mytag:query driver="xxx" url="" user="" pass="" sql="" />
Filter
chain of handlers
典型Filter
用户授权的Filter/log filter/decode+encode filter/改变XML内容的XSLT FILTER
javax.servlet.Filter
init/destory/doFilter
@WebFilter(filterName="log",urlPatterns={"/*"})
Listener介绍
web容器/应用内部会发生各种事情, Listener就是用来处理监听这些事情的.
web app启动关闭/app属性的改变/request attribute/session/session attribute的变化.