Servlet

生命周期 html

  • servlet在第一次被调用时经过init()方法进行初始化,init()方法只会被调用一次;
  • 请求到达tomcat时,tomcat从线程池中取出一个线程,将请求交给该线程;若是是同一个Servlet的多个请求,那么Servlet的service方法将在多线程中并发的执行;
  • service()方法,根据HTTP请求的类型,调用doGet(),或doPost()方法;
  • 经过destroy()方法终止servlet,destroy()方法也只被调用一次;手动调用,service()方法超时时调用,长时间没有请求调用;
  • 调用destroy()方法后,servlet会被标记为垃圾回收对象,等待JVM垃圾回收。

1.servlet转发,转发到服务器另外一个servlet,JSPjava

public class ForwardServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //HttpServletRequest  域对象  有本身的做用范围
        //转发 只能在服务器内部转发  request域里面的数据不会消失  一次请求一次响应   地址栏没有发生任何变化
        request.setAttribute("name", "张三");
        request.getRequestDispatcher("").forward(request, response);
    }
}

2.cookie的操做web

//清除最后的访问时间
public class ClearLastAccessTimeServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        //建立一个cookie对象,其名称与须要清除的cookie的名称一致
         Cookie cookie=new Cookie("lastaccesstime","");
        //设置该cookie的最大存活时间为0————若是cookie的最大存活时间为0的话,浏览器会自动删除该cookie信息
         cookie.setMaxAge(0);
        //把该cookie写入客户端浏览器
         response.addCookie(cookie);

    }

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

 

//设置cookie信息和取得cookie信息
public class CookieServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        //设置cookie信息到浏览器
        //1.建立ncookie对象
           Cookie cookie=new Cookie("firstcookie","this is cookie value....");
        //2.把cookie信息添加到响应头(set-cookie)
           response.addCookie(cookie);
           
           
        //获取用户的cookie
          Cookie cookies[]=request.getCookies();
          if(cookies!=null&&cookies.length>0){
          //遍历cookie数组
          for(Cookie c:cookies){
              //判断是否包含名字为firstcookie的cookie对象
              if("firstcookie".equals(c.getName())){
                  //若是存在就取得cookie的value
                  String cookieValue=c.getValue();
                  System.out.println(cookieValue);
              }
            }
          }
         

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}
 
public class LastAccessTimeServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        PrintWriter out=response.getWriter();
        
        //从cookie中获取用户上一次的访问时间
//          1.获取客户端发送来的cookie数组
          Cookie[] cookies=request.getCookies();
//          2.判断数组是否为null
          if(cookies!=null&&cookies.length>0){
//              3.遍历数组
              for(Cookie c:cookies){
                 // 4.判断是否有保存了最后访问时间的cookie对象
                  if("lastaccesstime".equals(c.getName())){
                     // 5.若是有就获取最后访问时间的cookie的值 
                      String cookieValue=c.getValue();
                      long l=Long.valueOf(cookieValue);//把保存了当前日期毫秒数的字符串转为long
                      //输出根据日期的毫秒数建立的日期对象的本地字符串形式
                      out.write("最后的访问时间是:"+new Date());
                      //输出一个清除cookie信息的超连接
                      out.write("<br/><a  href='clear'>清除最后的访问时间</a>");
                      break;  //找到了就退出循环
                 }
              }
          }

        
        //把用户当次的访问时间写入cookie
          //建立cookie对象
          Cookie cookie=new Cookie("lastaccesstime",String.valueOf(System.currentTimeMillis()));
          //设置cookie的最大存活时间
          cookie.setMaxAge(Integer.MAX_VALUE);
          //把cookie对象信息写入客户端(set-cookie)
          response.addCookie(cookie);
    }

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


}

3.servletConfigspring

public class ServletConfigServlet extends HttpServlet {

    // ServletConfig 主要是用于加载servlet的初始化参数。
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        //ServletConfigServlet  有这个getServletConfig() 方法

        String name = getServletConfig().getInitParameter("name");// 获取初始化的参数
        response.getWriter().write(name);
    
        Enumeration<String> initParameterNames = getServletConfig().getInitParameterNames();//Enumeration 枚举
        
        while(initParameterNames.hasMoreElements()){
            String str =initParameterNames.nextElement();
            response.getWriter().write("参数名称:"+str+";参数值:"+getServletConfig().getInitParameter(str));
        }
        
        
//        PageContext  这个域对象里面属性 只在当前的servlet 或者是 jsp里面起做用
    
        try {
            PageContext page=PageContext.class.newInstance();//单例模式
            page.setAttribute("name", "张三");
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
 

4.servletcontext数组

public class GetDataServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        //获取servletcontext对象
        ServletContext con=getServletContext();
        //从应用范围取出一个名字
        String name=(String)con.getAttribute("name");  
        response.getWriter().write(name);
        
//        con.removeAttribute("name"); 
//        name=(String)con.getAttribute("name");  
//        System.out.println("再次取名字:"+name);  

    }

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


}
//获取文件的真实路径
public class RealPathServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        //获取servletcontext对象
        ServletContext context=getServletContext();
        //获取项目的根路径
        String rootPath=context.getRealPath("/");
        //H:\workspace\jsp_servlet\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\day03_servlet\
        System.out.println(rootPath);  
        
        //获取a.txt的真实路径
        String aPath=context.getRealPath("/WEB-INF/classes/a.txt");
        //H:\workspace\jsp_servlet\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\day03_servlet\WEB-INF\classes\a.txt
        System.out.println(aPath);
        
        //获取b.txt的真实路径
        String bPath=context.getRealPath("/b.txt");
        System.out.println(bPath);
//        //获取c.txt的真实路径
        String cPath=context.getRealPath("/WEB-INF/c.txt"); 
        File file=new File(cPath);
        System.out.println(file.getName());
        System.out.println(cPath);

    }

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

}
//在域(存活)范围内存数据实现数据的共享
public class SetDataServlet extends HttpServlet {

//    //servletCoNFIG
//     ServletConfig config=getServletConfig();
//    //获取servletcontext对象
//     ServletContext context= config.getServletContext();
    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
  //        response.setContentType("text/html;charset=UTF-8");
        //ServletContext 能够是域对象  存储数据  相似于request
         ServletContext context=  getServletContext();
         context.setAttribute("name", "张三");
    }

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


}

 

 5.servlet向浏览器发送数据浏览器

返回字符串,HTML,JSON,响应头,设置编码格式tomcat

package com.lisa.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.lisa.bean.Book;
import com.lisa.dao.IBookDao;
import com.lisa.dao.impl.BookDaoImpl;

public class BuyBookServlet extends HttpServlet{

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
    
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        String html = "";
        html += "<html>";
        html += "<head>";
        html += "<title>图书商品列表</title>";
        html += "</head>";
        html += "<body>";
        html += "<table border='1' align='center' width='600px'>";
        html += "<tr>";
        html += "<th>书籍编号</th><th>书籍名称</th><th>书籍价格</th>";
        html += "</tr>";
         //买书
         Integer id=Integer.parseInt(request.getParameter("id"));
         //根据id去查询整个书的信息
         IBookDao bookImpl=new BookDaoImpl();
         Book book=null;
         try {
                book=bookImpl.selectBookById(id);
                //先去推车(我把车放到了session)
                HttpSession session = request.getSession();
                Enumeration<String> attributeNames = session.getAttributeNames();
                while(attributeNames.hasMoreElements()){
                    if("car".equals(attributeNames.nextElement())){
                        //从session里面拿车
                        List<Book> bookList=(List<Book>) session.getAttribute("car");
                        String str=    putBookIntoCar(bookList, book, html);
                        str+="<a href='selectAllBook'>返回书籍列表</a>";
                        str += "</table></body></html>";
                        writer.write(str);
                        return;
                    }
                }
            //没车  推一把车  new个车出来
            List<Book> bookList=new ArrayList<>();
            request.getSession().setAttribute("car", bookList);
            String str=putBookIntoCar(bookList, book, html);
            str+="<a href='selectAllBook'>返回书籍列表</a>";
            str += "</table></body></html>";
            writer.write(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private String putBookIntoCar(List<Book> car,Book book,String html){
        if(book!=null){
            //把一本书放进到购物车
            car.add(book);
            double total=0;//书价的合计
            for(Book b:car){
                html += "<tr>";
                html += "<td>"+b.getId()+"</td><td>"
                        + b.getBookName()+"</td><td>"+b.getBookPrice()+"</td>";
                html += "</tr>";
                String price=b.getBookPrice();
                total+=Double.parseDouble(price);
            }
            html+="<tr><td colspan='3'> 合计:"+total +"</td></tr>";
        }
        return html;
    }
}

6.Servlet实际上是单例多线程安全

容器初始化化Servlet主要就是读取配置文件(例如tomcat,能够经过servlet.xml的<Connector>设置线程池中线程数目,初始化线程池经过web.xml,初始化每一个参数值等等。
避免使用实例变量(成员变量),由于若是存在成员变量,可能发生多线程同时访问该资源时,都来操做它,照成数据的不一致,所以产生线程安全问题
JSP中用到的OUT,REQUEST,RESPONSE,SESSION,CONFIG,PAGE,PAGECONXT
是线程安全的(由于每一个线程对应的request,respone对象都是不同的,不存在共享问题), 
APPLICATION在整个系统内被使用,因此不是线程安全的服务器

http://blog.csdn.net/xiaojiahao_kevin/article/details/51781946cookie

7.springMVC和Struts2底层与servlet的关系

http://blog.csdn.net/liudezhicsdn/article/details/50993812

相关文章
相关标签/搜索