Servlet&JSP 笔记

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

你可能感兴趣的:(Servlet&JSP 笔记)