get: an Http Get 是为了获得,不是为了改变任何事情在服务器上。Get被定义为 idempotent。它能够被多次执行。
POST 不是 idempotent。 数据在提交时,在事务中post不能被取消(因为涉及到数据库)。
------
Get 是默认方法 如果不在form中写任何东西的话<form action="*.do">
更多PSOT&GET说明在书P122
------
如果要从单个参数中获得多个值,则用 getParameterValues()
=-=-=-=-=-=
大多数时候,使用Response只是用来为客户端发送数据;可使用两种方法:setContentType()&getWriter();然后,可简单的使用I/O来写HTML to the stream;但也可以用response来设定其它的头(headers),发送错误和添加cookies.
println() to a PrintWriter
write() to an ServletOutputStream
ServletOutputStream response.getOutputStream()
PrintWriter response.getWriter()
设头 response.setHeader("foo","bar");
response.addHeader("foo","bar");
response.setIntHeader("foo",42);
重定位 P136
在commit之后,再向回调(call)sendRedirect()是不能写到response里的
redirect和dispatch的区别
redirect = client
dispatch = server
获得web.xml中的初始参数时:
对servlet来说:web.xml中用<init-param>
在程序中用getServletConfig().getInitParameterNames()得到。
对Jsp来说:web.xml中用<context-param>
在程序中用getServletContext().getInitParameter("**")得到。
有两种方法得到ServletContext:
getServletConfig.getServletContext.getInitParameter()
this.getServletContext.getInitParameter()
----- listen 的整个过程 P175 -------
package com.example;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent event){
ServletContext sc = event.getServletContext();
String dogBreed = sc.getInitParameter("breed");
Dog d = new Dog(dogBreed);
sc.setAttribute("dog", d);
}
public void contextDestroyed(ServletContextEvent event){
}
}
*******************
package com.example;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class ListenerTester extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException,ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("test Context attributes set by listener<br>");
out.println("<br>");
Dog dog = (Dog)getServletContext().getAttribute("dog");
out.println("Dog's breed is: " + dog.getBreed());
}
}
*******************
package com.example;
public class Dog {
private String breed;
public Dog(String breed){
this.breed = breed;
}
public String getBreed(){
return breed;
}
}
********************
<listener>
<listener-class>
com.example.MyServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>ListenerTester</servlet-name>
<servlet-class>com.example.ListenerTester</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerTester</servlet-name>
<url-pattern>/ListenTest.do</url-pattern>
</servlet-mapping>
<!--为Dog传构造参数初始化-->
<context-param>
<param-name>breed</param-name>
<param-value>Great Dane</param-value>
</context-param>
--------以上是代码部分,以下是大意-----------
----- listen 的整个过程 P175 -------
1.容器读DD(Deployment Descriptor)
2.容器创建一个新的ServletContext
3.容器创建一个Name/Value字符串为上下文的参数初始化
4.容器为ServletContext提到的Name/value赋值
5.容器创建一个MyServletContextListener实例
6.容器通过一个新的ServletContextEvent来调用listener's contextInitialized()方法,event提到ServletContext,然后得到上下文的初始参数。
7.Listener 通过ServletContextEvent得到ServletContext。即event.getServletContext().
8.listener 通过ServletContext得到context的初始化参数
9.Listener 利用初始化参数来构造一个新的Dog类
10.Listener在ServletContext中来设置Dog作为属性。
代码:ServletContext sc = event.getServletContext();
String dogBreed = sc.getInitParameter("breed");
Dog d = new Dog(dogBreed);
sc.setAttribute("dog", d);
11.容器创建一个新的Servlet(比如:创建一个带初始化参数的新的ServletConfig,ServletConfig提及ServletContext,然后call Servlet's init()方法)
12.Servlet 得到一个请求,然后问ServletContext的属性“dog"
13.Servlet call getBreed() on the Dog (and prints that to the HttpResponse)
----- ----- -------
Listener interface: javax.servlet.http.HttpSessionAttributeListener 对应的Event type是 HttpSessionBindingEvent 而不是 HttpSessionAttributeEvent
Listener interface: javax.servlet.http.HttpSessionActivationListener 对应的Event type是 HttpSessionEvent 而不是 HttpSessionActivationEvent
attributes 返回的是一个类
RequestDispatcher view = request.getRequestDispatcher("result.jsp");
如果result.jsp前没有"/",则表明是相对路径,容器会在相同的逻辑定位请求中去找result.jsp
Context,HttpSession,Request在accessibility,生存周期和好处的区别。
只有Request的线程是安全的。
RequestDispatcher包含有两种方法:forward, include
客户端发送请求,容器产生一个唯一的session ID 然后将它和response返回给客户端.客户端发送回 session ID 和每个一个子请求。容器看到ID,发现匹配的session,然后联系session处理请求。
客户端和容器通过cookies来交换Session ID
HttpSession session = request.getSession();
request.getSession()不只是创建session,在它第一次在request唤醒时,它会产生一个cookie发送给response.
request.getSession()还是可得到一个经匹配的session ID cookie.
流程:如果request包含一个session ID cookie,那么去发现和它匹配的ID;如果没有session ID cookie 或者 现在没有可以匹配的session, 那么将创建一个新的session.
设置seesion过期时间:
方法1:
<session-config>
<session-timeout>15<session-timeout> //设置15分钟
</session-config>
方法2:session.getMaxInactiveInterval(20*60) //设置20分钟
在客户端设置cookie的生存时间
cookie.setMaxAge(20*60);
给客户端发送cookie
response.addCookie(cookie);
从客户端request得到cookie
Cookie[] cookies = request.getCookies();
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
if(cookie.getName().equals("username")){
Stirng userName = cookie.getValue();
out.println("Hello" + userName);
break;
}
}
URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程。比如浏览器发来请求 hostname/101.aspx ,服务器自动将这个请求中定向为http://hostname/list.aspx ?id=101。
url重写的优点在于:
l 缩短url,隐藏实际路径提高安全性
2 易于用户记忆和键入。
3 易于被搜索引擎收录
========== JSP =================
<%= %> 表达式中没有";"
Servlet:
Application: getServletContext().setAttribute();
Request: request.setAttribute();
Session: request.getSession().setAttribute();
Page: Does not apply!
JSP:
Application: application.setAttribute();
Request: request.setAttribute();
Session: session.setAttribute();
Page: pageContext.setAttribute();
EL表达式:
${applicationScope.mail}
等价于: <%= application.getAttribute("mail")%>
<%! int y=3; %> 相当于声明全局变量吧 int y=3;
PS: try jar download code
========= 记单词 ============
scenarios 脚本
picky 好挑剔的 吹毛求疵 picky professor
asymptotically 渐近 渐近地
subtly 隐隐约约地
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
P125
P129
P165
p182
P200 P222
P233
P235
P245 5.20
P315 5.22
P339 5.23
P