美文网首页
java-web Servlet学习

java-web Servlet学习

作者: cxm11 | 来源:发表于2016-02-16 23:57 被阅读286次

    Servlet接口:

    • Servlet主要方法:
    init()--ServletConfig

    servlet实例化后,容器会先调用init方法,用于初始化对象,即在处理客户需求前完成一些初始化工作。每一个Servlet实例,init只能被调用一次,相当于java的static块。
    Servlet使用ServletConfig对象从web应用程序的配置信息中获取以 键值对形式提供的初始化参数。
    Servlet使用ServletConfig对象获取ServletContext对象,使用ServletContext可以使Servlet和Servlet容器进行通信。

    service()--ServletRequest ServletResponse

    容器调用service()方法来处理客户的请求,注意:在service方法前必须确保init方法正确完成。
    容器会构造一个请求对象ServletRequest和响应对象ServletResponse作为参数传递给service().

    destroy():

    当容器检测到Servlet对象从服务中移除的时候会调用该方法。释放资源给GC

    getServletConfig()

    返回Servletconfig对象

    getServletInfo()

    返回一个字符串,包含Servlet信息

    • Servlet创建的三种方法

    一是实现Servlet接口;二是继承抽象类GenericServlet;三是继承HttpServlet类

    -- 实现Servlet接口,必须实现Servlet五个方法

    public class TestServlet implements Servlet{
    public void init(ServletConfig config) throws
    ServletException{
    System.out.println("init");
    }
    public ServletConfig getServletConfig(){
    return null;
    }
    public void service(ServletRequest req, ServletResponse res) throws ServletException,IOException{
    //这里可以实现请求后要做的内容
    PrintWriter out = response.getWriter();
    out.println("Hello World!");
    }
    public String getServletInfo(){
    return null;
    }
    public void destroy(){
    System.out.println("destroy");
    }
    }
    

    --继承抽象类GenericServlet. GenericServlet类中只有一个抽象方法,即service(ServletRequest req, ServletResponse res)

    public TestGenericServlet extends GenericServlet{      
    public abstract void service(ServletRequest req,ServletResponse res)                        
    throws ServletException,IOException{       
    PrintWriter out = response.getWriter();       
    out.println("Hello World!");                            
    }
    }
    

    --继承HttpServlet类编写Servlet应该是最容易的,而且是最常见的,我们一般要编写Servlet直接继承这个类就行了,重写doGet()或者doPost()方法即可

    public TestHttpServlet extends HttpServlet{
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{
    response.setContentType("text/html;charset = gb2312");
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>HelloWorld</title>");
    out.println("</head>");
    out.println("<body bgcolor = \"white\">");
    out.println(“<hr>”);
    out.println("HelloWorld");
    out.println("</body></html>");
    }
    
    public void doPost(HttpServletRequest     request, HttpServletResponse response)
    throws IOException, ServletException{
    doGet(request, response);
    }
    }
    

    HttpServlet详解

    HttpServletRequest,HttpServletResponse详解

    HttpServletRequest:String getContextPath()返回请求URL中表示上下文的部分,如:/simple/test返回/simple
    Cookie[] getCookies()返回本次请求所有的Cookie对象
    String getHeader()返回请求报头的值
    String getMethod()返回本次请求使用的HTTP方法的名字,如post get Trace等
    String getPathInfo()返回额外url信息,如/simple/test 返回test
    String getPathTranslated()返回真实路径信息 如
    String getQueryString()返回请求的action 名称 如
    返回 logon

    HttpSession getSession()返回和此次请求相关联的session
    HttpServletResponse:void addCookie(Cookie cookie)新增一个cookie到响应中去,可以设置多个。
    addheader(String name,String value)用给出的name and value增加一个响应报头到响应中去
    sendRedirect(String location)发送一个临时的重定向到客户端,让客户端访问的url重新定位

    ServletConfig

    servlet容器使用ServletConfig对象在容器初始 化的时候向其传递配置信息四种主要方法:
    String getInitParameter(String name)返回名字为name的初始化参数的值,初始化参数在配置文件web.xml中配置
    Enumeration getInitParameterNames()返回Servlet所有初始化参数名字的枚举集合
    ServletContext getServletContext()返回Servlet上下文对象的引用
    String getServletName()返回当前Servlet的名称

    Servlet配置

    web.xml:web应用程序的配置和部署都是通过web.xml来完成的,其包含以下信息

    ServletContext 的初始化参数
    Session 的配置
    Servlet/Jsp的定义
    MIME类型映射
    欢迎文件列表
    错误页面
    安全
    地区和编码映射
    JSP配置

    post和get方式

    消息报头

    Servlet生命周期

    Servlet上下文

    运行在java虚拟机中的每一个web程序都有一个与之相关的Servlet上下文,java servlet API提供了一个servletContext接口来表示上下文。
    一个ServletContext对象表示了一个Web程序的上下文,Servlet容器在初始实例期间,向其传递servletConfig对象,通过其getServletContext()获取上下文。

    上下文例子:统计页面访问量:注意这里的上下文必须放在安全锁里

    public class CountDemo extends HttpServlet{
    
    public void doGet(HttpServletRequest req, HttpServletResponse res)throws     ServletException,IOException{
    ServletContext context = getServletContext();
    //Enumeration<String>count = context.getAttributeNames();
    Integer count = null;
    synchronized(context){
    count = (Integer)context.getAttribute("counter");
    if(null == count){
    count = new Integer(1);
    }else{
    count = new Integer(count.inValue()+1);
    }
    context.setAttribute("counter", count);
    }
    res.setContentType("text/html;charset=gb2312");
    PrintWriter pw = res.getWriter();pw.println("<html><head>");
    pw.println("<title>页面访问统计</title>");
    pw.println("</head><body>");
    pw.println("该页面已经被访问了  :"+"<b>"+count+"</b>"+" 次");
    pw.println("</body></html>");
    pw.close();
    }
    }
    

    Servlet请求转发

    好处:

    • 提供了统一的访问方式
    • 控制器(controller)可以将不同的请求发送给不同的Servlet来进行处理,本身不处理请求,缩短了响应时间
    RequestDispacher:servlet控制器

    RequestDispacher对象由Servlet来创建,用于封装一个由路径所标识的服务器资源。主要有以下两种方法:

    • forward(ServletRequest req, ServletResponse res):
      该方法用于将请求从一个Servlet传递给服务器上的另外的Servlet jsp页面,或者HTML文件
      注意:这个方法必须在响应被提交给客户端之前使用,之后的话会爆出IllegastateException错误,在forward()调用后原先在响应缓存中未被提交的内容将会自动清除。
    • include(ServletRequest req, ServletResponse res)该方法用于响应中包含其他的资源信息(servlet jsp html)等内容。

    这两个方法的区别是:include将请求转发给其他对象后,被调用的Servlet做出的响应将并入原来的响应对象中,原来的Servlet对象还可以继续输出响应数据。
    forward将请求转发给其他对象后,将由被调用的Servlet对象做出响应,原来的Servlet执行将终止。

    • RequestDispache对象的获取
      三种方法
      --ServletRequest.getRequestDispacher(String path)--资源路径名
      --ServletContext.getNamedDispacher(String name)--jsp或servlet名称
      --ServletContext.getRequestDispacher(String path)--这里路径必须从/开头 相对于当前上下文根的路径 如/MyServlet

    请求转发的实例

    package com.tide.servlet;import java.io.IOException;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.lang3.StringUtils;
    public class Login extends HttpServlet {
    public void doPost(HttpServletRequest     req,HttpServletResponse res)throws     ServletException,IOException{
    res.setContentType("text/html;charset=GB2312");
    ServletContext context = getServletContext();
    String name = req.getParameter("user");
    String pass = req.getParameter("passwd");
    System.out.println("获取到的用户名为 :"+name+"  --密码为 :"+pass);
    if(StringUtils.isBlank(name) || StringUtils.isBlank(pass)){
    System.out.println("用户名或密码为空");
    RequestDispatcher dis = context.getRequestDispatcher("/register.jsp");
    dis.forward(req, res);
    }
    else{
    RequestDispatcher dis = context.getRequestDispatcher("/loginsuccess.jsp");
    dis.forward(req, res);
    }
    }
    }
    

    底层分析:

    请求转发(RequestDispatcher)的过程:
    客户首先发送一个请求到服务端,服务端发现匹配的Servlet,并指定它去执行,当这个Servlet执行完之后,它要调用getRequestDispatcher()方法,把请求转发给指定的test.jsp,整个流程都是在服务端完成的,而且是在同一个请求里面完成的,因此Servlet和jsp共享的是同一个request,在Servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回客户端。整个过程是一个请求,一个响应。

    重定向(sendRedirect)的工作原理

    客户发送一个请求到服务器,服务器匹配Servlet,这都和请求转发一样,Servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个Servlet处理完之后,看到response.sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端受到这个请求后,立刻发出一个新的请求,去请求test.jsp,这里两个请求,这个两个请求互不干扰,相互独立,子啊前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。

    相关文章

      网友评论

          本文标题:java-web Servlet学习

          本文链接:https://www.haomeiwen.com/subject/eizpkttx.html