码迷,mamicode.com
首页 > 其他好文 > 详细

Servlet学习笔记

时间:2014-10-22 21:50:20      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   os   ar   使用   

一,Servlet入门

  1,所有的Servlet都要实现Servlet接口,它的services()(对外提供服务)方法会被容器直接调用,但是一般我们继承HttpServlet类,它是GenericServlet的子类(实现了Servlet接口)。services()方法会调用doGet(),doPost()等方法,挡在浏览器中输入url时会调用doGet()方法,在表单以post方式提交时会调用doPost()方法。

public class HelloWordServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        
        System.out.println("doGet");  
     PrintWriter out =
resp.getWriter();
     out.write("<a href=‘http://www.baidu.com‘>go</a>");//客户端呈现
  }
}
HttpServletRequest :封装了客服端到服务器端的一系列的请求。
HttpServletResponse :从服务器返回给客户端的内容。

  2,在web.xml中的配置
    <servlet>
        <servlet-name>HelloWorldServlet</servlet-name>
        <servlet-class>HelloWorldServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>HelloWorldServlet</servlet-name>
        <url-pattern>/HelloWorldServlet</url-pattern>
    </servlet-mapping>

二,Servlet的生命周期

  在webapplication整个生命过程中,servlet只new一次,所以代码在后台只输出一次constructor,只初始化一次,输出一次init。只有webapplication退出的时候才执行destroy()方法。

public class TestLifeCycleServlet extends HttpServlet {

    public TestLifeCycleServlet() {
        System.out.println("constructor");
    }

    public void init() throws ServletException {
        System.out.println("init");
    }
    public void destroy() {
        System.out.println("destroy");
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("doGet");

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

    }

执行结果:

 bubuko.com,布布扣

  • 生命全过程:
    • 加载 ClassLoader
    • 实例化 new
    • 初始化 init(ServletConfig)
    • 处理请求 service doGet doPost
    • 退出服务 destroy()
  • 只有一个对象
  • API中的过程:

三,Servlet编程接口

 

  • GenericServlet是所有Servlet的鼻祖
  • 用于HTTP的Servlet编程都通过继承 javax.servlet.http.HttpServlet 实现

 

  • 请求处理方法:(分别对应http协议的7种请求)
    1、doGet  响应Get请求,常用
    2、doPost  响应Post请求,常用
    3、doPut  用于http1.1协议
    4、doDelete  用于http1.1协议
    5、doHead              仅响应Get请求的头部。
    6、doOptions  用于http1.1协议
    7、doTrace  用于http1.1协议

 

  • 实例的个数:
    在非分布的情况下,通常一个Servlet在服务器中有一个实例

四,request获取请求的参数

public class ShowParameters extends HttpServlet {
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String title = "Reading All Request Parameters";
    out.println("<html><head><title>读取所有参数</title></head>" +
                "<BODY BGCOLOR=\"#FDF5E6\">\n" +
                "<H1 ALIGN=CENTER>" + title + "</H1>\n" +
                "<TABLE BORDER=1 ALIGN=CENTER>\n" +
                "<TR BGCOLOR=\"#FFAD00\">\n" +
                "<TH>Parameter Name<TH>Parameter Value(s)");
    Enumeration paramNames = request.getParameterNames();//Enumeration 一个过时的接口,存放参数名
    while(paramNames.hasMoreElements()) {
      String paramName = (String)paramNames.nextElement();
      out.print("<TR><TD>" + paramName + "\n<TD>");
      String[] paramValues =
        request.getParameterValues(paramName);
      if (paramValues.length == 1) {
        String paramValue = paramValues[0];
        if (paramValue.length() == 0)
          out.println("<I>No Value</I>");
        else
          out.println(paramValue);
      } else {
        out.println("<UL>");
        for(int i=0; i<paramValues.length; i++) {
          out.println("<LI>" + paramValues[i]);
        }
        out.println("</UL>");
      }
    }
    out.println("</TABLE>\n</BODY></HTML>");
  }

  public void doPost(HttpServletRequest request,
                     HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
}
  • 获取表单信息
    •   通过HttpServletRequest的getParameter()方法来获得客户端传递过来的数据
    •   getParameter()方法返回一个字符串类型的值
    •   getParameterNames()返回Enumeration类型的值,getParameterValues()返回一个字符串数组

五,Cookies(记录在客户端)

1,由于http是无状态的协议,它不知道client以前在我这做过什么事情,所以要用到cookie

2,处理Cookie

  • Http协议的无连接性要求出现一种保存C/S间状态的机制
  • Cookie:保存到客户端的一个文本文件,与特定客户相关
  • Cookie以“名-值”对的形式保存数据
  • 创建Cookie:new Cookie(name,value)
  • 可以使用Cookie 的setXXX方法来设定一些相应的值
    •   setName(String name)/getName()  
    •   setMaxAge(int age)/getMaxAge()
    •   利用HttpServletResponse的addCookie(Cookie)方法将它设置到客户端
    •   利用HttpServletRequest的getCookies()方法来读取客户端的所有Cookie,返回一个Cookie数组
 
//response设置cookie
for(int i=0; i<3; i++) { // Default maxAge is -1, indicating cookie // applies only to current browsing session. Cookie cookie = new Cookie("Session-Cookie-" + i, "Cookie-Value-S" + i); response.addCookie(cookie); cookie = new Cookie("Persistent-Cookie-" + i, "Cookie-Value-P" + i); // Cookie is valid for an hour, regardless of whether // user quits browser, reboots computer, or whatever. cookie.setMaxAge(3600); response.addCookie(cookie);
//request获取cookie
Cookie[] cookies = request.getCookies(); if (cookies != null) { Cookie cookie; for(int i=0; i<cookies.length; i++) { cookie = cookies[i]; out.println("<TR>\n" + " <TD>" + cookie.getName() + "</TD>\n" + " <TD>" + cookie.getValue()+"</TD></TR>\n"); }

 

3,当new一个cookie时,若没有设置存活周期,则它存在于这个浏览器窗口打开期间,它的窗口及其子窗口可以访问cookie,相当于cookie写在了内存中.如果设置了存活周期,则会写在本地文件中。

  • 服务器可以向客户端写内容
  • 只能是文本内容
  • 客户端可以阻止服务器写入
  • 只能拿自己webapp写入的东西
  • Cookie分为两种
    • 属于窗口/子窗口(放在内存中的)
    • 属于文本(有生命周期的)
  • 一个servlet/jsp设置的cookies能够被同一个路径下面或者子路径下面的servlet/jsp读到 (路径 = URL)(路径 != 真实文件路径)

六,Session(记录在服务器端)

 

  1, 当打开一个浏览器窗口生成session时,就会自动生成一个sessionid,这个sessionid会在浏览器窗口打开期间一直存在,直到该窗口连同浏览器一起关掉(在不关该浏览器的情况下,另打开一个该浏览器,可以访问原来的session),若在其他类型浏览器中打开则访问不到。(疑问:前面括号的东西和所看视频不一致(一个窗口对应一个sessionid),自己试验的可以。。。)

  • Session
    • 在某段时间一连串客户端与服务器端的“交易”  
    • 可以通过程序来终止一个会话。如果客户端在一定时间内没有操作,服务器会自动终止会话。在Tomcat中的web.xml里默认设置了session的存活时间,当然你也可以在自己的 配置文件里设置。
<session-config>
       <session-timeout>30</session-timeout>
 </session-config>

 

  • 通过HttpSession来读写Session

     

  • 规则
    • 如果浏览器支持Cookie, 创建Session的时候会把SessionID保存在Cookie里
    • 如果不支持Cookie, 必须自己编程使用URL重写的方式实现Session
    • response.encodeURL()
      • 转码
      • URL后面加入SessionId
  • Session不象Cookie拥有路径访问的问题
    • 同一个application目录下的servlet/jsp可以共享同一个session, 前提是同一个客户端窗口.

  2,HttpServletRequest中的Session管理方法

  • getRequestedSessionId():返回随客户端请求到来的会话ID。可能与当前的会话ID相同,也可能不同。
  • getSession(boolean isNew):如果会话已经存在,则返回一个HttpSession,如果不存在并且isNew为true,则会新建一个HttpSession
  • isRequestedSessionIdFromCookie():当前的Session ID如果是从Cookie获得,为true
  • isRequestedSessionIdFromURL():当前Session ID如果是由URL获得,为true
  • isRequestedSessionIdValid():如果客户端的会话ID代表的是有效会话,则返回true。否则(比如,会话过期或根本不存在),返回false
  • HttpSession的常用方法
    • getAttributeNames()/getAttribute()
    • getCreateTime()
    • getId()
    • getMaxInactiveInterval()
    • invalidate()
    • isNew()
    • setAttribute() //session是以键值对的形式存储的,可以用此方法写session
    • setMaxInactivateInterval()

 

public void doGet(HttpServletRequest request,
    HttpServletResponse response) throws ServletException,
    IOException
  {
    //get current session or, if necessary, create a new one
    HttpSession mySession = request.getSession(true);

    //MIME type to return is HTML
    response.setContentType("text/html");

    //get a handle to the output stream
    PrintWriter out = response.getWriter();

    //generate HTML document
    out.println("<HTML>");
    out.println("<HEAD>");
    out.println("<TITLE>Session Info Servlet</TITLE>");
    out.println("</HEAD>");
    out.println("<BODY>");
    out.println("<H3>Session Information</H3>");
    out.println("New Session: " + mySession.isNew());
    out.println("<BR>Session ID: " + mySession.getId());
    out.println("<BR>Session Creation Time: " +
      new java.util.Date(mySession.getCreationTime()));
    out.println("<BR>Session Last Accessed Time: " +
      new java.util.Date(mySession.getLastAccessedTime()));

    out.println("<H3>Request Information</H3>");
    out.println("Session ID from Request: " +
      request.getRequestedSessionId());
    out.println("<BR>Session ID via Cookie: " +
      request.isRequestedSessionIdFromCookie());
    out.println("<BR>Session ID via rewritten URL: " +
      request.isRequestedSessionIdFromURL());
    out.println("<BR>Valid Session ID: " +
      request.isRequestedSessionIdValid());
    out.println("<br/><a href="+response.encodeURL("SetSession")+">refresh</>");
    out.println("</BODY></HTML>");
    

    out.close(); //close output stream
  }
public class ShowSession extends HttpServlet {
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String title = "Session Tracking Example";
    HttpSession session = request.getSession(true);
    String heading;
    // Use getAttribute instead of getValue in version 2.2.
    Integer accessCount =
      (Integer)session.getValue("accessCount");
    if (accessCount == null) {
      accessCount = new Integer(0);
      heading = "Welcome, Newcomer";
    } else {
      heading = "Welcome Back";
      accessCount = new Integer(accessCount.intValue() + 1);
    }
    // Use setAttribute instead of putValue in version 2.2.
    session.putValue("accessCount", accessCount); 
      
    out.println("<html><head><title>Session追踪</title></head>" +
                "<BODY BGCOLOR=\"#FDF5E6\">\n" +
                "<H1 ALIGN=\"CENTER\">" + heading + "</H1>\n" +
                "<H2>Information on Your Session:</H2>\n" +
                "<TABLE BORDER=1 ALIGN=\"CENTER\">\n" +
                "<TR BGCOLOR=\"#FFAD00\">\n" +
                "  <TH>Info Type<TH>Value\n" +
                "<TR>\n" +
                "  <TD>ID\n" +
                "  <TD>" + session.getId() + "\n" +
                "<TR>\n" +
                "  <TD>Creation Time\n" +
                "  <TD>" +
                new Date(session.getCreationTime()) + "\n" +
                "<TR>\n" +
                "  <TD>Time of Last Access\n" +
                "  <TD>" +
                new Date(session.getLastAccessedTime()) + "\n" +
                "<TR>\n" +
                "  <TD>Number of Previous Accesses\n" +
                "  <TD>" + accessCount + "\n" +
                "</TABLE>\n" +
                "</BODY></HTML>");

  
总结:
1.服务器的一块内存(存key-value)
2.和客户端窗口对应(子窗口)(独一无二)
3.客户端和服务器有对应的SessionID
4.客户端向服务器端发送SessionID的时候两种方式:
1.cookie(内存cookie)
2.rewriten URL
5.浏览器禁掉cookie,就不能使用session(使用cookie实现的session)
6.如果想安全的使用session(不论客户端是否禁止cookie),只能使用URL重写(大大增加编程负担),所以很多网站要求客户端打开cookie

七,Application

  • 用于保存整个WebApplication的生命周期内都可以访问的数据(可以在不同的窗口和不同的浏览器中得到,所有的客服端共享)
  • 在API中表现为ServletContext
  • 通过HttpServlet的getServletContext方法可以拿到
  • 通过ServletContext的 get / setAttribute方法取得/设置相关属性
protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=gb2312");
        PrintWriter out = response.getWriter();
        
        ServletContext application = this.getServletContext();
        
        
        Integer accessCount = (Integer) application.getAttribute("accessCount");
        if (accessCount == null) {
            accessCount = new Integer(0);
            
        } else {
            
            accessCount = new Integer(accessCount.intValue() + 1);
        }
        // Use setAttribute instead of putValue in version 2.2.
        application.setAttribute("accessCount", accessCount);

        out.println("<html><head><title>Session追踪</title></head>"
                + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">"
                + accessCount + "\n" + "</TABLE>\n" + "</BODY></HTML>"
                + "</H1>\n");
                

    }

 八,Servlet中使用Bean

  • 广义javabean = 普通java类
  • 狭义javabean = 符合Sun JavaBean标准的类
  • 在Servlet中使用Bean和在通常程序中使用Bean类似
    •   属性名称第一个字母必须小写,一般private,
    •   比如:private productId
    •   一般具有getters and setters
    •   要具有一个参数为空的构造方法
    •   但Bean不应具有GUI表现
    •   一般是用来实现某一业务逻辑或取得特定结果

Servlet学习笔记

标签:des   style   blog   http   color   io   os   ar   使用   

原文地址:http://www.cnblogs.com/enjoy-life-clh/p/4027179.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!